我已经实施了JSSC API,因此我可以与Com Port进行通信。 我发送了一个类似" N \ r \ n"
的命令我在普通超级终端中收到的内容应如下所示:
0100071CA79215021803164442180000
0100071C9F5415021803164514520000
0100071CDF5115022106142956600000
NOK
但是当我对JSSC API做同样的事情时,我收到了这个(只有第一个代码)
010
0071CA79
2150218
0316444
218
问题是我随机收到位部分,在代码的末尾我丢失了一些部分。但这并不重要我只需要每个代码的前12位数字。
现在的问题是如何让函数只接收整行而不是bitparts?
这是班级的接收部分 class 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..");
}
答案 0 :(得分:0)
要解决上述问题,您需要将收到的字符串连接到另一个字符串,该字符串累积从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参数值。检查字符串是否有替代内容以进行错误处理。这对我有用。