c#串口数据丢失

我编写了一个C#程序来接收COM2端口上的数据。 波特率设置为115200.发送方以115200bps的速率发送数据。 我的程序偶尔会丢失几个字节。 我正在调用ReadByte方法从com端口读取while(true)循环中的数据。

我有几个问题:

  • 当波特率设置为高时,我是否应该丢失数据? 如果有,为什么?
  • 我将readbuffer大小设置为100 * 1024 * 1024。 这是否将串行驱动程序缓冲区大小设置为100 * 1024 * 1024?

有关如何调试此问题的任何想法?

接收缓冲区大小为100 * 1024 * 1024是巨大的! 我会严重怀疑你需要这个大小,当然不是实际的串口缓冲区。

可能是您正在溢出接收器的物理接收缓冲区,因此您可能需要考虑使用流控制。 这将有效地使您的接收器能够对您的发射器说“坚持,停止发送一段时间,让我处理我的第一个。”

通常通过RTS(请求发送)和CTS(清除发送)引脚来使用硬件流控制。

看一下这篇文章,它更多地解释了它。

我个人建议将串行端口的ReceivedBytesThreshold属性保留为其默认值1,然后处理DataReceived事件。 谁知道,也许明天你需要读取一个20字节或者5字节的消息。 也许你将来需要读取可变长度的消息? 将阈值保持为1意味着您可以处理现在和将来将要接收的任何和所有字节。

此阈值表示当缓冲区中至少有 1个字节时将触发事件。 可能会有更多,也许更多。 请注意,它并不一定意味着它会为接收到的每个字节触发。 在每个事件上,您需要检查BytesToRead属性并将其读取到您自己的缓冲区中。

值得重申的是,事件不一定会针对收到的每个字节触发。

此外,最好在DataReceived事件处理程序中尽可能少地执行。 读入接收到缓冲区中的任何字节,并可能将已完成的消息添加到队列中以进行进一步处理,但不做其他事情。

另请注意, RS232的标准最大规格是19200波特的速度和50英尺的电缆长度。 以上任何内容都是未定义的。 更高的速度通常需要更好的电缆(更低的电容)和更短的电缆长度。 确保它已经过筛选,没有在其他“嘈杂”的物品附近运行,如电机,电机逆变器,带电电缆等。

当波特率设置为高时,我是否应该丢失数据? 如果有,为什么?

不必要。 它可能由于物理连接不良(太长)而发生。

我将readbuffer大小设置为100 * 1024 * 1024

那应该是(方式)绰绰有余。

话虽如此,循环和读取单个字节并不是读取端口的最有效方法。

您可以连接到DataReceived事件并设置ReceivedBytesThreshold = 12。 这样你就可以随时读取(Buffer,0,12)