2012-02-15 86 views
1

这是我的Java串行通信中的问题...我的jennic硬件设备使用UART连接。我想检索值形成我的设备..SerialPort阅读java

我收到串的字节数组中SerialPortEvent.DATA_AVAILABLE

 case SerialPortEvent.DATA_AVAILABLE: 
      try { 
        int size; 
        while(inputStream.available()!=0) { 
         byte buff[]=new byte[100]; 
         size=inputStream.read(buff); 
         inputStream.close(); 
         String result = new String(buff,0,size); 
         ZPS_tsAplZdpIeeeAddrRsp IeeRsp = new ZPS_tsAplZdpIeeeAddrRsp(result); 
       } 

第一I读取的字节并将其存储在BUFF []。然后将其转换为字符串,然后将其转换为字符串数组..然后我的问题是我得到了很多时间,但它的休息。

输出示例:

80011634002078445541560000341201004189 

    80011635002078445541560000341201004189 

    80011636002078445541560000341201004189 
    /*Here is Break my seq */ 
    800116370020784455 

    41560000341201004189/*this two breaking seq generated two separate array and here is the problem*/ 

    80011638002078445541560000341201004189 

有冲厕我曾尝试inputStream.reset(),但它不工作的输入缓冲区的问题..谁能给我一个合适的建议,以解决这个问题。 。

感谢...

回答

0

您需要从端口读取到缓冲区中,并且当该缓冲区有整个消息时,将该缓冲区的一部分刷新到消息处理例程中。这意味着您需要以可以独立识别和隔离每条消息的方式定义消息。

当数据可用或不可用时,读取数据流将工作或阻止;但是,从流中读取并不能保证您将数据保存在一个消息大小的块中。您只会注意到有数据需要读取。您注意到数据可用于在串行端口缓冲区中读取,并且在可读取所有消息之前开始读取它。请记住,还有另一个问题可能发生,也许在另一次运行期间,在程序准备好读取“下一个”消息之前,可能会在串行端口缓冲区中缓冲两个或更多消息。

重写您的通信协议以将字节读入缓冲区(类),该缓冲区保存字节,直到消息可供读取。然后在缓冲区readMessage()上放置一个接口,除了在消息级别(缓冲直到获得完整消息)之外,其作用类似于read()

1

'问题' 是在您的期望。它没有任何地方说read()会填充缓冲区,或者串行数据传输将保留你的消息边界。这取决于你。你得到的只是一个字节流。

0

一般而言,您不能期望从串行连接的一端发送的“消息”将作为一个组被接收。你可以一次或者以几个不同长度的块来完成。由接收程序决定如何使用它所知道的输入数据来从串口读取字节并将它们放在一起,并在接收到完整的消息时实现。

通常器件的三种方式之一处理这个问题:

  • 固定长度的数据包 - 你看,直到你获得X字节,然后再处理那些X字节。
  • 数据包长度是数据包标题的一部分,表明在考虑接收到的数据之前还有多少额外字节需要读取完整的数据包。
  • 数据包开始/结束指示符(STX或SOH启动,ETX通常结束)。您将开始和结束指示符之间收到的所有数据视为一个消息数据包。