【问题标题】:Read Complete Line Java Serial Port读取整行 Java 串口
【发布时间】:2015-02-24 09:07:07
【问题描述】:

我已经实现了 JSSC API,因此我可以与 Com 端口进行通信。 我发送一个类似“N\r\n”的命令

我在普通超级终端中收到的应该是这样的:

0100071CA79215021803164442180000

0100071C9F5415021803164514520000

0100071CDF5115022106142956600000

正常

但是当我对 JSSC API 做同样的事情时,我会收到这个(只有第一个代码)

010

0071CA79

2150218

0316444

218

问题是我随机接收位部分并且在代码末尾我丢失了一些部分。但这并不重要,我只需要每个代码的前 12 位。

现在的问题是如何让函数只接收整行而不接收位部分?

这是类的接收部分 类 PortReader2 实现 SerialPortEventListener {

    @Override
    public void serialEvent(SerialPortEvent event) {
        if(event.isRXCHAR()&& event.getEventValue() > 2) {
            try {
                // получение ответа от порта
                String receivedData = serialPort.readString();
                System.out.println(receivedData.length() + ":" + receivedData);
            }
            catch (SerialPortException ex) {
                System.out.println("Error in receiving response from port: " + ex);
            }
        }

    }
}

这是发送部分

    public void sendCodeCommand(SerialPort serialPort) {
    // writing string to port
    try {
        Thread.sleep(3000);
        serialPort.writeBytes("N\r\n".getBytes());
    } catch (SerialPortException | InterruptedException ex) {
        Logger.getLogger(ComPortSendReceive.class.getName()).log(Level.SEVERE, null, ex);
    }
        System.out.println("String wrote to port, waiting for response..");
    }

【问题讨论】:

    标签: java serial-port jssc


    【解决方案1】:

    要解决上述问题,您需要将收到的字符串连接到另一个字符串中,该字符串会累积您从 readString() 函数(位于 serialEvent 处理程序中)收到的字符串片段。因为它是 owm 线程,所以它需要一定量的 cpu 时间来获取串行数据,因此它有效地获取串行端口输入数据的部分顺序读取。所以这个例子把部分输入放在一起来创建“整体”输入。

    String serialString;
    

    所以在 serialEvent 处理程序中:

    try {
    serialStringFragment = serialPort.readString();
    serialString.concat(serialStringFragment);
    }
    

    可以扫描从 readString() 获得的字符串或累积字符串以查找诸如 eol 条件之类的令牌。例如:

    String [] dlLines = serialString.split("\r\n");
    

    将每一行拆分为 dlLines 字符串数组中的一个元素。

    但是我发现如果我的目标设备有固定长度的输出,效果会更好:

    serialPort.readString(int bytecount);
    

    内联写入串行字符串,消除serialEvent处理程序。

    这有点做作但换句话说:

    String expectedStringLength "0100071CA79215021803164442180000";
    int serialstrlen = expectedStringLength.length();
    

    因此,serialstrlen 显然应该成为每个预期行的常量。

    serialPort.writeString("N\r\n");
    serialPort.readString(serialstrlen+2); // assuming cr lf 
    

    应该让你第一行。

    将 readString() 放入一个循环中,根据预期的字符串更改 serialstrelen 参数值。检查字符串的替代内容以进行错误处理。这对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多