java串口通信获取不到数据

java串口通信,真实仪器传输,获取不到数据,怀疑是代码问题
1.使用串口调试工具,java代码,可以接收到数据。
2.使用串口调试工具,可以获取到仪器传输的数据
3.同样的java程序,连接同型号的仪器(在本地),可以正常通信,收发数据
现在不是很清楚为什么,同样的java程序,在这台仪器上可以正常通信(这台仪器在公司里),在另外一台仪器上没办法正常通信(这台仪器在其他地方,看不见界面,只有通过其他人打视频看,配置和本地也没什么区别),却可以用串口调试助手正常收发数据

调试工具和java代码通信

img

外地的仪器可以用调试工具接收数据

img

java demo代码

package com.example.serial;

import gnu.io.*;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.*;

public class SerialDemo implements SerialPortEventListener{

    private List<String> comportNames = new ArrayList<>();
    private String chooseCom;
    private SerialPort serialPort;
    private Integer baudRate;

    public void start() throws IOException {
        Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();
        while (portList.hasMoreElements()) {
            String portName = portList.nextElement().getName();
            comportNames.add(portName);
        }
        System.out.println("当前可用的com为:");
        for (int i = 0; i < comportNames.size(); i++) {
            System.out.println(i + ":" + comportNames.get(i));
        }
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入前面的序号选择串口");
        while (true){
            int i = scanner.nextInt();
            if(i < comportNames.size() && i >= 0){
                chooseCom = comportNames.get(i);
                break;
            }
        }
        System.out.println("当前选择的com为:" + chooseCom);
        System.out.println("请输入波特率");
        while (true){
            int i = scanner.nextInt();
            System.out.println("你输入的波特率为:" + i);
            baudRate = i;
            startCom();
            break;
        }
    }


    /**
     * 启动串口
     */
    private void startCom(){
        try {
            CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(chooseCom);
            CommPort commPort = portIdentifier.open(chooseCom, 2000);
            if (commPort instanceof SerialPort) {
                serialPort = (SerialPort) commPort;
                serialPort.setSerialPortParams(baudRate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
                serialPort.addEventListener(this);
                serialPort.notifyOnDataAvailable(true);
                System.out.println("====================串口启动成功,串口号:"+ chooseCom);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void serialEvent(SerialPortEvent event) {
        if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            byte[] bytes = readData(serialPort);
            System.out.printf("收到的数据长度:%d%n", bytes.length);
            String msg = new String(bytes);
            System.out.println("收到的数据:" + msg);
            byte enq = 5;
            String enqMsg = new String(new byte[]{enq});
            if(msg.equals(enqMsg)){
                System.out.println("收到ENQ 05");
                //回复ack
                write(new byte[]{6});
                System.out.println("回复ACK 06");
            }
        }
    }


    public void write(byte[] msg){
        if(serialPort != null){
            try(OutputStream os = serialPort.getOutputStream()) {
                os.write(msg);
                os.flush();
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
    }

    /**
     * 从串口读取数据
     * @param serialPort 要读取的串口
     * @return 读取的数据
     */
    public static byte[] readData(SerialPort serialPort) {
        InputStream is = null;
        byte[] bytes = null;
        try {
            // 获得串口的输入流
            is = serialPort.getInputStream();
            // 获得数据长度
            int bufflenth = is.available();
            while (bufflenth != 0) {
                // 初始化byte数组
                bytes = new byte[bufflenth];
                is.read(bytes);
                bufflenth = is.available();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (is != null) {
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return bytes;
    }

}



是不是串口号不同?一个是com2,一个是com3

因为你说串口调试工具可以收发外地的设备数据,那么说明网络是通的,那你主要检查一下串口和波特率是否是一致的。比如你设备的是19200,那么串口也需要是这么多,否则也接收不到,我看截图的里面是9600

img

“配置和本地也没什么区别”
波特率一个9600,一个19200,还说没什么区别
串口号、波特率、校验位、数据位、停止位,差一个都不行
而且你必须用串口助手看好接受到的到底是个什么数据,是不是正常的数据
不要以为串口助手上看到一大堆数字就是有数据了
那很可能都是些乱码
你把485正负接反了也会收到乱码,但是就别想能正常收数据了
硬件、软件,都必须完全一致,差一点都不行
从你的图上看,十有八九正负接反了,全是些乱码

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7608673
  • 除此之外, 这篇博客: Java0基础入门实践宝典(一)中的         面向对象设计是一种程序设计技术。它将重点放在对象(即数据)和对象接口上。拿木匠打比方:一个“面向对象”的木匠,始终关注的是椅子,其次才会考虑用什么工具,一个“非面向对象”的木匠首先会考虑用什么工具。本质上,Java面向对象的能力与c++是一样的。Java与c++主要不同点在于多继承,Java中取而代之的是较简单的接口概念,相对于传统的面向过程语言(C、Basic 和 Pascal等),面向对象程序设计语言(C++、Java 和 C#等)在实现大型复杂项目时更加有效,面向对象基本思想是从现实世界中客观存在的事物(即对象)出发来构建软件系统,并在系统中尽可能的应用人类的自然思考方式,强调以事物为中心来思考问题,认识问题,并根据事物的本质特点,把他们抽象的表示为系统中的类,作为系统中的基本构成单元,使客观世界的事物在计算机系统中保持相互关联的本来面貌。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 跨平台
  • 以下回答由chatgpt基于相关博客总结生成:

    对于串口通信获取不到真实仪器传输数据的问题,以下是一些可能的解决方案:

    1. 确保串口通信参数设置正确。需要检查串口通信的波特率、数据位、停止位、校验位等参数是否正确,这些参数通常需要与仪器的通信参数相匹配。可以使用串口调试工具和Java代码分别检查并设置这些参数,以确保它们的一致性。同时,有些仪器的通信参数还需要手动设置或通过仪器的菜单界面来调整。

    2. 检查串口通信缓冲区大小。在读取仪器传输数据时,可能需要大量的缓冲区,否则就会发生数据丢失或超时等问题。需要检查串口通信缓冲区的大小是否足够,可以在Java代码中设置缓冲区的大小,以满足需求。一般来讲,缓冲区的大小越大,数据传输的稳定性和可靠性就越高。

    3. 检查仪器的通信协议。有些仪器的通信协议非常复杂,需要专门的驱动程序或Java库来支持。需要检查仪器的通信协议是否正确,并根据协议的要求编写专门的Java代码来与仪器通信。

    4. 检查Java代码中的错误。有时候,获取不到真实仪器传输数据的问题可能是由于Java代码中的语法错误或逻辑错误造成的。需要仔细检查Java代码,确保没有语法错误,并根据需要加入调试信息,以便快速定位问题的根源。

    5. 使用专业的调试工具。有些情况下,问题可能更为复杂,需要使用专门的调试工具来定位。比如,可以使用 Wireshark 来监控串口通信的数据包,以便了解数据包的具体内容和传输状态。同时,还可以使用 jSerialComm 来获取更详细的串口通信信息,例如数据位、波特率、校验位等等。这些工具可以帮助我们更加深入和详细地了解串口通信的过程和问题,从而更好地解决问题。

    综上所述,对于获取不到真实仪器传输数据的问题,我们可以从串口通信参数设置、缓冲区大小、通信协议、Java代码错误等方面入手解决。如果问题比较复杂,可以使用专业的调试工具来辅助定位问题,并根据具体情况调整解决方案。