我知道.NET中的SerialPort通信旨在在数据可用并到达阈值时将DataReceived
事件发送给接收方。
我们是否可以不使用DataReceived
事件并在接收方启动线程来频繁调用其中一个ReadXXX
方法来获取数据?
如果收件人比发件人慢得多会怎么样? SerialPort缓冲区会溢出(数据丢失)?
答案 0 :(得分:1)
这样做是没有意义的,只需在打开端口后自己启动阅读器线程,而不要打扰DataReceived。在启动线程后,特别是在收到数据的时候,按照自己的方式进行操作很困难,很难干净地取消订阅DataReceived事件。你买不起两者。
答案 1 :(得分:0)
这是有效的,事实上这是我在问题Constantly reading from a serial port with a background thread中使用的方式之一。
对于您的场景,您可以收听DataReceived event
,然后启动一个在端口上调用ReadExisting
的线程以获取所有当前可用的字节。您还可以通过查看SerialPort.BytesToRead
属性来检查接收缓冲区中等待的字节数。
至于你的接收缓冲区溢出,a)它足够大(你可以检查SerialPort.ReadBufferSize
属性)和b)这不是1982,所以CPU足够快以处理来自端口的数据,以便它没有时间填满(当然比串行数据速率快得多)。
答案 2 :(得分:0)
读取串口的线程的功能如下:
private void ThreadRx()
{
while (true)
{
try
{
if (this._serialPort.IsOpen == true)
{
int count = this._serialPort.BytesToRead;
if (count > 0)
{
byte[] Buffer = new Byte[count];
this._serialPort.Read(Buffer, 0, count);
//To do: Call your reception event (sending the buffer)
}
else
{
Thread.Sleep(50);
}
}
else
{
Thread.Sleep(200);
}
}
catch (ThreadAbortException ex)
{
//this exception is invoked calling the Abort method of the thread to finish the thread
break;//exit from while
}
catch (Exception ex)
{
//To do:call your error event
}
}
}
不要担心输入缓冲区,因为线程读取速度比串口通信的波特率快得多,你甚至可以用同样的代码来读取tcp / ip socket。