我正在开发一个串行端口应用程序,其中一个非常简单的部分给我带来了问题。我只是想从端口读取恒定的数据流,并将其写入二进制文件。问题似乎是速度:我的代码在我的 9600 波特率测试设备上运行良好,但是当转移到115200bps 的实时设备,我似乎正在丢失数据。发生的情况是,经过一段可变的时间后,我丢失了 1 个字节,导致其余数据丢失。我尝试过一些事情:
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
bwLogger.Write((byte)serialPort1.ReadByte());
}
or
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 驱动程序设置。
有任何想法吗?
如果问题似乎是您无法足够快地处理数据,您可以尝试对数据进行双缓冲。
1) 允许一个线程将串口读入一个缓冲区。这可能涉及将数据从端口复制到缓冲区(我对 .NET 不太熟悉)。
2)当您准备好处理传入数据时,(在不同的线程上)让您的程序读入第二个缓冲区,当发生这种情况时,您应该将第一个缓冲区写入磁盘。
3)当第一个缓冲区写入磁盘时,将其交换回串口缓冲区,并将第二个缓冲区写入磁盘。重复该过程,不断交换缓冲区。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)