我有一个正确配置的SerialPort对象,因为我可以将数据发送到端口,并且DataReceived事件已正确引发。但是,当我尝试使用How to use SerialPort class more reliably中提出的解决方案(建议使用对BeginRead的调用而不是DataReceived事件)时,我的异步回调从未被调用,对BeginRead的调用似乎“挂起”。
byte[] buffer = new byte[4096];
void KickoffRead()
{
_serialPort.BaseStream.BeginRead(buffer, 0, buffer.Length, delegate (IAsyncResult ar)
{
try
{
var actualLength = _serialPort.BaseStream.EndRead(ar);
var received = new byte[actualLength];
Buffer.BlockCopy(buffer, 0, received, 0, actualLength);
DataReceived?.Invoke(received);
}
catch (IOException)
{
// nothing yet
}
KickoffRead();
}, null);
}
KickoffRead();
我尝试在打开端口后立即从DataReceived事件以及单独的线程中调用KickoffRead,这都没有任何区别。我还尝试过将缓冲区的大小更改为1,以为它正在等待缓冲区已满-没运气。此外,当我尝试停止调试器时,它会挂起,必须强制终止。
我正在使用虚拟串行端口(免费的虚拟串行端口软件)进行测试,但是当我使用DataReceived而不是BeginRead时,它的效果很好,所以我认为这是问题的根源。