2015-02-24 103 views
0

我已经实现了JSSC API,所以我可以与Com端口进行通信。 我发送一个命令像 “N \ r \ n” 个阅读完成行Java串行端口

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

0100071CA79215021803164442180000

0100071C9F5415021803164514520000

0100071CDF5115022106142956600000

NOK

但是,当我这样做与JSS C API我收到此(仅第一代码)

0071CA79

的问题是,我随机收到位部件和在代码的最后,我失去了一些部分。但那不重要,我只需要每个代码的前12位数字。

问题是现在我怎么得到的功能只接收完整的行,而不是bitparts?

这是类 类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

要解决,你需要连接收到串了上述问题,转换为另一个字符串,用于累积从串行事件处理程序中的readString()函数接收到的字符串片段。因为它是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参数值。检查字符串是否有错误处理的替代内容。这对我有效。