use*_*293 1 c# serial-port data-loss
我编写了一个 C# 程序来接收 COM2 端口上的数据。波特率设置为115200。发送方以115200bps 的速率发送数据。我的程序偶尔会丢失几个字节。我正在调用方法从 com 端口循环ReadByte读取数据。while(true)
我有几个问题:
关于如何调试这个问题有什么想法吗?
100*1024*1024 的接收缓冲区大小是巨大的!我严重怀疑您是否需要这个大小,并且肯定不需要实际的串行端口缓冲区。
可能是您溢出了接收器的物理接收缓冲区,因此您可能必须考虑使用流量控制。这将有效地使您的接收器能够对您的发送器说“稍等,停止发送一段时间,让我先处理一下我的事情”。
硬件流控制(通常)通过 RTS(请求发送)和 CTS(清除发送)引脚来利用。
看看这篇文章,它对此进行了更多解释。
我个人建议将串行端口的 ReceivedBytesThreshold 属性保留为其默认值 1,然后处理 DataReceived 事件。谁知道呢,也许明天您需要读取 20 个字节,或者 5 个字节的消息。也许您将来需要读取可变长度的消息?将阈值保留为 1 将意味着您可以处理现在和将来将收到的任何和所有字节。
该阈值意味着当缓冲区中至少有 1 个字节时将触发事件。也许还有更多,而且可能还会有。请注意,这并不一定意味着它会为收到的每个字节触发。对于每个事件,您需要检查 BytesToRead 属性并将这些数据读入您自己的缓冲区。
值得重复的是,该事件不一定会为收到的每个字节触发。
另外,最好在 DataReceived 事件处理程序中尽可能少地执行操作。读入缓冲区中接收到的任何字节,并且可能将已完成的消息添加到队列中以进行进一步处理,但不执行其他操作。
另请注意,RS232的标准最大规格是 19200 波特率和 50 英尺电缆长度。任何高于该值的内容都是未定义的。更高的速度通常需要更好的电缆(更低的电容)和更短的电缆长度。确保其经过屏蔽并且不在其他“噪音”物体附近运行,例如电机、电机逆变器、带电电缆等。