阅读完整行Java串行端口



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

我在一个正常的超级终端中收到的应该是这样的:

0100071ca7921502180316442180000

0100071C9F5415021803164514520000

0100071CDF5115022106142956600000

NOK

但当我对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("Nrn".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..");
    }

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

String serialString;

因此在serialEvent处理程序中:

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

可以扫描从readString()获得的字符串或累积字符串,以查找eol condition之类的标记。例如:

String [] dlLines = serialString.split("rn");

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

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

serialPort.readString(int bytecount);

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

这有点做作,但换句话说:

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

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

serialPort.writeString("Nrn");
serialPort.readString(serialstrlen+2); // assuming cr lf 

应该给你接第一条电话。

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

相关内容

  • 没有找到相关文章

最新更新