我正在处理一个处理串口通信的应用程序。它是一个WPF,多线程应用程序。一切都很顺利,直到我通过COM端口只通过通信发送小包。
没有我到达阶段,我必须在COM端口上监听发送到我的应用程序的数据。对于这一大块数据,我遇到了麻烦。我只触发了一个DataReceived事件,它读取了我需要的部分数据。但在此之后,没有针对其余数据触发DataReceived事件。
如果我监视COM端口,我看到字节在那里,监视软件指出,队列中有2067个字节,但事件不会触发。
我在谷歌搜索类似的问题,但我无法找到相关的答案。您是否知道从哪里开始搜索问题的根源。
提前致谢。
以下是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端口接收数据。
很抱歉花时间,感谢您的帮助,无论如何,您的想法帮助我解决了这个问题。
BR, 乔鲍
答案 0 :(得分:3)
5年前我在COM端口工作,我知道它有时会变得多么棘手。我以前使用的西门子设备发生了各种棘手的问题:)
首先,我无法彻底遵循您的代码,所以我无法确定您的DataReceived
例程是否合理。我建议您尝试将comPort_DataReceived
中的所有代码替换为非常简单的代码,仅用于测试目的。
private static void comPort_DataReceived(
object sender,
SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Console.WriteLine("Data Received:");
Console.Write(indata);
}
如果它仍然不起作用,则问题不在您的代码中。如果你不知道还有什么可以尝试,我会搞砸SerialPort.DtrEnable
和SerialPort.RtsEnable
之类的参数,看看是否有什么事情发生,因为这些也导致了一些不在我手册的错误在过去。
从MSDN中提取的一段代码。
答案 1 :(得分:0)
串行类本身似乎没有问题。 唯一的问题是MSDN教程。 通过更改
Console.WriteLine("Data Received:");
Console.Write(indata);
到
Console.WriteLine("Data Received:");
Console.WriteLine(indata);
据我所知,问题出在线程中断和串行中断的冲突上