【发布时间】:2010-05-12 18:21:22
【问题描述】:
我正在开发一个 SerialPort 应用程序,其中一个非常简单的部分就是给我带来问题。我只是想从端口读取恒定的数据流并将其写入二进制文件。问题似乎是速度:我的代码在我的 9600 波特测试设备上运行良好,但是当转移到115200bps 实时设备,我似乎正在丢失数据。发生的事情是在一段可变的时间之后,我错过了 1 个字节,这会丢弃其余的数据。我尝试了一些方法:
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
bwLogger.Write((byte)serialPort1.ReadByte());
}
或
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] inc = new byte[serialPort1.BytesToRead];
serialPort1.Read(inc, 0, inc.Length);
bwLogger.Write(inc);
}
还有一些变化。我不能使用 ReadLine() 因为我正在处理恒定的数据流(对吗?)。我试过摆弄缓冲区大小(serialPort1.ReadBufferSize 和硬件 FIFO 缓冲区)。理想情况下,出于可用性目的,我会在软件方面处理此问题,而不是让用户必须更改 Windows 驱动程序设置。
有什么想法吗?
【问题讨论】:
-
这就是为什么通信协议有规则和校验和的原因。您应该针对一种协议进行编码,该协议使您能够灵活地检测此类事件并从中恢复。您可以使用超时来清除缓冲区并根据需要重新发送。您会不时丢失数据。时期。故事结局。您需要让每个终端设备从这种情况中恢复正常(即不“丢弃”其余数据)。
-
这是很好的建议。由于我的特定设备的独特功能,我能够线性插入数据以填充任何丢失或“坏”的数据包。正如您所提到的,在大多数通信情况下,通过针对适当的协议进行开发,这种类型的事件的处理肯定会更加健壮。对任何从事任何形式交流的人的好建议。
-
我很抱歉。重新阅读后,我了解到您指的是硬实时要求,而缺少一个意味着丢失了一大块永远不会回来的数据。请参阅我即将发布的关于线程的答案。即使您已经接受了答案,也可能值得研究。
标签: c# serial-port