我用的是 comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);接收数据,单条收发的话没问题,但是如果是发送多条数据的话,只会接收到一条数据。
private void comPort_DataReceived(Object sender, SerialDataReceivedEventArgs e)
{
int len = comPort.BytesToRead;
Byte[] readBuffer = new Byte[len];
comPort.Read(readBuffer, 0, len); //将数据读入缓存
buffer.AddRange(readBuffer);
if (len >= 1)
{
try
{
byte[] msg1 = new byte[512];
if (buffer.Count != 0)
{
if (buffer[0] == 0x7e)
{
if ((buffer.Count) > 5)//前提没转义字符
{
int msglen = buffer[5] + 8;
if (buffer.Count > msglen)
{
if (buffer[msglen] == 0x7f)
{
buffer.CopyTo(0, msg1, 0, msglen + 1);
string showRcvMsg = protocol.UnpackRcvProtocolData(msg1, msglen + 1);
this.Dispatcher.Invoke(new Action(() =>
{
if (CheckBox_DiscomOrnot.IsChecked == true)
{
LogInfo(LogMsgType.Error, showRcvMsg);
}
ShowUi();
}));
buffer.RemoveRange(0, msglen + 1);
}
}
}
}
else
{
buffer.RemoveRange(0, 1);
}
}
}
catch (Exception ex)
{
LogInfo(LogMsgType.Incoming, "提示信息:接收返回消息异常!具体原因:" + ex.Message);
}
}
}
处理不及时建议使用异步线程解析数据,尽早地退出DataReceived事件
我本来用的线程同步lock,但是没有效果,lock这个指令好像没有执行
这要用线程啊,用task 开个线程跑嘛,
除非你是单客户端发送就可以不用
“发送方”是什么?受你控制?
受你控制的话,多条报文之间的间隔控制下,拉长一点。
第一次看到有人把数据处理直接放DataReceived事件里,另建一个处理的方法,用Task调用处理,因为前面就是因为你没有论坛发帖机处理完,第二条数据就来了。
第二种可能你的传输速率太慢,Thread.Sleep(4000)试试