我正在开发一个处理串行端口通信的应用程序。这是一个 WPF,多线程应用程序。一切都很顺利,直到我通过 COM 端口发送小包并进行通信。
不,我到了一个阶段,我必须在 COM 端口上监听发送到我的应用程序的数据。对于这一大块数据,我遇到了麻烦。我只触发了一个 DataReceived 事件,它读取我需要的部分数据。但在那之后,其余数据不再触发 DataReceived 事件。
如果我监控 COM 端口,我看到字节在那里,监控软件指出,队列中有 2067 个字节,但事件没有触发。
我在 Google 上搜索了类似的问题,但我无法找到相关的答案。你知道从哪里开始寻找问题的根源吗?
提前致谢。
这是 DataReceived 处理程序的代码:
private void comPort_DataReceived( object sender, SerialDataReceivedEventArgs e )
{
do
{
new Thread(() =>
{
OnReceivingData(new ComPortCommunicationEventArgs(DataTransferDirections.Receiving, DataTransferActions.Start));
}).Start();
byte[] packetData = null;
try
{
IsReceiving = true;
int bytesToReadCount = comPort.BytesToRead;
if ( bytesToReadCount == 0 )
{
return;
}
packetData = new byte[bytesToReadCount];
comPort.Read(packetData, 0, bytesToReadCount);
}
finally
{
IsReceiving = false;
new Thread(() =>
{
OnReceivingData(new ComPortCommunicationEventArgs(DataTransferDirections.Receiving, DataTransferActions.End));
}).Start();
}
OnPacketReceived(new PacketReceivedEventArgs(comPort.PortName, packetData.ToList()));
} while ( comPort.BytesToRead > 0 );
}
同时我发现,如果我注释掉 OnPacketReceived 调用——它只是用接收到的数据为 UI 触发事件——那么数据处理就可以正常工作。所以我认为这不是 COM 端口通信错误......
更新:
我找到了解决我的问题的方法。它与串行端口处理无关。在我的一个数据处理线程中,我遇到了一个循环,该循环应该在成功处理时完成,但没有足够的数据,它只是连续运行。这样做会阻止 DataReceived 事件处理程序 - 我的原因仍然不完全清楚,因为这两个进程应该在我认为的不同线程上。但似乎我错了。
无论如何我更正了处理方法,没有收到来自serisl端口的数据。
很抱歉占用您的时间,无论如何感谢您的帮助,您的想法帮助我定位了这个问题。
兄弟,恰巴