阅读SerialPort并没有给我预期的结果

本文关键字:结果 SerialPort 并没有 阅读 | 更新日期: 2023-09-27 18:18:21

我试图在串行端口上读取一些数据,但我在监视器软件(如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中都配置了SerialPort

我怎么能解决这个问题,并得到相同的帧,在232分析仪?

p。S:

我得到这样的帧(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

阅读SerialPort并没有给我预期的结果

串口是完全不受限制的,所以无论何时读取,都读取可用的内容。可能是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);
    }
    // ...
}