1

我正在使用超级终端从传感器读取输入。该传感器发送一个字符串,其格式应为 6 位或 5 位和一个小数点(但它可以是 2 个空格,然后是 3 位和一个小数)制表符分隔符 测量单位(“Ci”,“mCi”等)制表符分隔符字符串 例如(F-18 或 C-11)制表符分隔符制表符 CRLF 字符串结束标识符。

如果我通过超级终端监视此输入它会完美读取

0.00  kBq      F-18 2D

但是,当我阅读它时,我大部分时间都会得到字符串的断线段,有时我会得到正确的字符串,下面显示了我可以返回的示例。

0.00  k□□□□□□□□□□□□□

Bq      F-18 2D□□□□□□□□□

0.00  kBq      F-18 □□□

0.002D
□□□□□□□□□□

我使用的代码来自 RXTX 库。

public void serialEvent (SerialPortEvent event){  
    if (event.getEventType()== SerialPortEvent.DATA_AVAILABLE){  
       byte[] readBuffer = new byte[19];  
       try{  
            while (inputStream.available() > 0){  
                int numBytes = inputStream.read(readBuffer);  
                }
       catch (IOException e) {}  
       input_line = new String (readBuffer);  
       inter.update(input_line);}}  
4

1 回答 1

1

这是设计使然。您假设您将从 Read() 调用中获取所有字节。这不是它的工作原理,它只会给你到目前为止已经收到的字节。这也发生在超级终端中,但你永远不会注意到,因为你的眼睛没有那么快。

您需要将 readBuffer 移到方法之外并逐步填充它,直到您收到完整的响应。然后处理它。

如果设备只发送简单的 ASCII 文本和行终止符,这很常见,那么调用 SerialPort.ReadLine() 是确保您获得响应中所有字符的好方法。如有必要,调整 NewLine 属性。

于 2012-10-25T13:50:08.730 回答