我正在开发一个SerialPort应用程序,其中一个非常简单的部分就是给我一些问题.我只是想从端口读取一个恒定的数据流,并在它进入时将其写入二进制文件.问题似乎是速度:我的代码在我的9600波特率测试设备上工作正常,但是当转移到115200bps的直播设备,我似乎正在丢失数据.发生的事情是在一段可变的时间之后,我错过了1个字节,抛出了其余的数据.我尝试过几件事:
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
bwLogger.Write((byte)serialPort1.ReadByte());
}
Run Code Online (Sandbox Code Playgroud)
要么
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] inc = new byte[serialPort1.BytesToRead];
serialPort1.Read(inc, 0, inc.Length);
bwLogger.Write(inc);
}
Run Code Online (Sandbox Code Playgroud)
还有一些变化.我不能使用ReadLine(),因为我正在使用恒定的数据流(对吧?).我试过摆弄缓冲区大小(serialPort1.ReadBufferSize和硬件FIFO缓冲区).理想情况下,出于可用性目的,我将在软件方面处理此问题,而不是让用户必须更改Windows驱动程序设置.
有任何想法吗?
如果问题似乎是您无法足够快地处理数据,那么您可以尝试的是对数据进行双重缓冲.
1)允许一个线程将串口读入一个缓冲区.这可能涉及将数据从端口复制到缓冲区(我不熟悉.NET).
2)当您准备好处理传入的数据时,(在另一个线程上)使您的程序读入第二个缓冲区,并且在发生这种情况时,您应该将第一个缓冲区写入磁盘.
3)当第一个缓冲区写入磁盘时,将其交换回串口缓冲区,并将第二个缓冲区写入磁盘.重复过程,不断交换缓冲区.