c#串口数据丢失

标签 c# serial-port data-loss

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

我有几个问题:

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

关于如何调试这个问题有什么想法吗?

最佳答案

100*1024*1024 的接收缓冲区大小是巨大的!我会严重怀疑您是否需要这个大小,而且对于实际的串行端口缓冲区肯定不需要。

可能是您溢出了接收器的物理接收缓冲区,因此您可能需要考虑使用流量控制。这将有效地使您的接收方能够对您的发送方说“等等,暂时停止发送,让我先处理我的问题。”

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

看看this文章,详细解释了它。

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

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

值得重申的是,该事件不一定必须为接收到的每个字节触发。

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

另请注意,RS232标准 最大规范速度为 19200 波特,电缆长度为 50 英尺。上面的任何东西都是未定义的。更高的速度通常需要更好的电缆(更低的电容)和更短的电缆长度。确保它被屏蔽并且没有在其他“嘈杂”的元素附近运行,例如电机、电机逆变器、带电电缆等。

关于c#串口数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4568754/

相关文章:

c# - 我需要 SQLBulkcopy 的进度条

c# - 为同一操作 MVC5 将 ValidateAntiForgeryToken 属性设置为 GET/POST

c# - 如何在 C# 中以编程方式确定类型是否接受 null 值?

c# - 如何在 Queue<byte> 中搜索字节并提取数据包?

system-calls - printk 数据丢失和截断

c# - 迁移到 Qualcomm 增强现实时出现 ARCamera 问题 vuforia-unity-android-ios-3-0-6

c# - C# 和 C 之间的串行连接通信时遇到问题

c++ - QtSerialPort 示例失败

sql - 关闭winform应用程序、自动保存选项后sql server中的数据丢失