繁体   English   中英

在SerialPort上阅读不会给我预期的结果

[英]Reading on SerialPort doesn't give me the expected result

我正在尝试读取串行端口上的一些数据,但在Monitor Software(例如232分析仪)和我的程序之间却没有相同的结果。

这是232分析仪读取的内容:

001 003 001 102 000 004 165 234 
001 003 006 144 000 008 068 169 
001 003 005 000 000 042 196 217 
001 003 001 096 000 042 197 247 
001 003 001 096 000 042 197 247 
001 003 014 000 000 042 198 253 

这是我从SerialPort读取的内容:

 001
 003 001 102 000 004 165 234
 001
 003 006 144 000 008 068 169
 001
 003 005 000
 000 042 196 217
 001
 003 001 096 000 042 197 247
 001
 003
 001 096 000 042 197 247
 001
 003 014 000 000 042 198 253

我所有的帧都被“截断了”,我不知道为什么。 在两个程序中的9600, n, 8, 1 8、1中都配置了SerialPort。

如何解决此问题并获得与232分析仪相同的帧?

PS:

我得到这样的帧(ReadTimeout设置为200ms):

while(true)
{
    byte[] buff = new byte[1024];
    int read = sp.Read(buff, 0, 1024);
    // ...
}

编辑

当做一个Thread.Sleep(10); 在阅读之前,我得到:

 001
 003 001 102 000 004 165 234
 001
 003 006 144 000 008 068 169
 001
 003 005 000 000 042
 196 217
 001
 003 001 096 000 042 197 247
 001
 003 001 096 000
 042 197 247
 001
 003 014 000 000 042 198 253

串行端口是完全无界的,因此只要您阅读,便会阅读可用的内容。 可能是1个字节,10个字节或1024个字节。 稍等一会,您将拥有更多数据,尽管大小完全无法预测,除非您一次只读取一个字节。

“监控”软件可能会简单地将其格式化为漂亮的块。

IIRC仅在没有数据等待的情况下才执行ReadTimeout,因此,只要第一个字节已经在FIFO缓冲区中,sp.Read()将立即返回,并提供任何可用数据。

串行端口表现为流,而不是帧序列-任何成帧都必须来自应用程序。

收到反馈后进行更新:由于成帧来自应用程序,因此您必须知道帧的大小。 这可能被编码为帧头的一部分,在这种情况下,逐字节读取可能是最好的解决方案。 如果有固定长度的帧(示例中为8个字节),则可以使用

while(true)
{
    byte[] frame = new byte[8];
    int read = 0;
    while (read<8)
    {
        sp.Read(frame, read, 8-read);
    }
    // ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM