SerialPort在java中读取

时间:2012-02-15 09:57:01

标签: java serial-port inputstream

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

我在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);
               }

首先我读取字节并将其存储在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()但它不起作用..任何人都可以给我一个合适的建议来克服这个问题..

谢谢......

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

一般来说,你不能指望一条"消息"从串行连接的一端发送的所有内容都将作为一个组接收。您可以一次性完成所有操作,也可以使用不同长度的几个块。您的接收程序可以使用它对传入数据的了解来从串行端口读取字节并将它们放在一起,并在收到完整的消息时实现。

通常,设备可以通过以下三种方式之一处理:

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

答案 2 :(得分:0)

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

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

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