Skip to content

Commit 067826d

Browse files
committed
🐛修复串口接收数据处理异常
1 parent f0eb07d commit 067826d

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

Modules/Wu.CommTool.Modules.ModbusRtu/Models/ModbusRtuModel.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ public void GetComPorts()
271271
var usbDevice = ComPorts.FindFirst(x => x.DeviceName.ToLower().Contains("usb"));
272272

273273
//若最后一次选择的是usb设备 则保持当前选择
274-
var lastUsbDevice = ComPorts.FindFirst(x => x.DeviceName.ToLower().Contains("usb") && x.Port.Equals(ComConfig.ComPort.Port) && x.DeviceName.Equals(ComConfig.ComPort.DeviceName));
274+
var lastUsbDevice = ComPorts.FindFirst(x => x.DeviceName.ToLower().Contains("usb") && x.Port.Equals(lastComPort.Port) && x.DeviceName.Equals(lastComPort.DeviceName));
275275
if (lastUsbDevice != null)
276276
{
277277
usbDevice = lastUsbDevice;
@@ -748,7 +748,7 @@ public bool IsModbusCrcOk(byte[] frame)
748748
}
749749

750750
/// <summary>
751-
/// 接收串口消息
751+
/// 接收串口消息 该方法必须必须必须使用同步不能用异步
752752
/// </summary>
753753
/// <param name="sender"></param>
754754
/// <param name="e"></param>
@@ -778,7 +778,6 @@ private void ReceiveMessage(object sender, SerialDataReceivedEventArgs e)
778778
if (ComConfig.IsOpened == false)
779779
return;
780780
times++;//计时
781-
782781
//串口接收到新的数据时执行
783782
if (SerialPort.BytesToRead > 0)
784783
{
@@ -789,7 +788,6 @@ private void ReceiveMessage(object sender, SerialDataReceivedEventArgs e)
789788
frameCache.AddRange(tempBuffer); //添加进接收的数据缓存列表
790789
//isDone = false; //标记frameCache未处理完成
791790
}
792-
793791
//二级缓存frameCache中还有未处理完的数据
794792
if (frameCache.Count > 0)
795793
{
@@ -836,6 +834,7 @@ private void ReceiveMessage(object sender, SerialDataReceivedEventArgs e)
836834
//由于监控串口网络时,请求帧和应答帧时间间隔较短,会照成接收粘包 通过先截取一段数据分析是否为请求帧,为请求帧则先解析
837835
//0X01请求帧8字节 0x02请求帧8字节 0x03请求帧8字节 0x04请求帧8字节 0x05请求帧8字节 0x06请求帧8字节 0x0F请求帧数量不定 0x10请求帧数量不定
838836
//由于大部分请求帧长度为8字节 故对接收字节前8字节截取校验判断是否为一帧可以解决大部分粘包问题
837+
839838
//当二级缓存大于等于8字节时 对其进行crc校验,验证通过则为一帧
840839
if (!isNot && frameCache.Count >= 8)
841840
{
@@ -854,16 +853,17 @@ private void ReceiveMessage(object sender, SerialDataReceivedEventArgs e)
854853
}
855854
else if (frame[1] == 0x10 && frameCache.Count < (frame[6] + 9))
856855
{
857-
continue;//数据量不够则继续接收
856+
//数据量不够则继续接收 不能用continue,否则无法执行程序最后的延时1ms
858857
}
858+
859859
//0x03响应帧 从站ID(1) 功能码(1) 字节数(1) 寄存器值(N*×2) 校验码(2)
860860
else if (frame[1] == 0x03 && frameCache.Count >= (frame[2] + 5))
861861
{
862862
frame = frameCache.Take(frame[2] + 5).ToList();
863863
}
864864
else if (frame[1] == 0x03 && frameCache.Count < (frame[2] + 5))
865865
{
866-
continue;//数据量不够则继续接收
866+
//数据量不够则继续接收 不能用continue,否则无法执行程序最后的延时1ms
867867
}
868868
//0x04响应帧 从站ID(1) 功能码(1) 字节数(1) 寄存器值(N*×2) 校验码(2)
869869
else if (frame[1] == 0x04 && frameCache.Count >= (frame[2] + 5))
@@ -872,7 +872,7 @@ private void ReceiveMessage(object sender, SerialDataReceivedEventArgs e)
872872
}
873873
else if (frame[1] == 0x04 && frameCache.Count < (frame[2] + 5))
874874
{
875-
continue;//数据量不够则继续接收
875+
//数据量不够则继续接收 不能用continue,否则无法执行程序最后的延时1ms
876876
}
877877

878878
//解析出可能的帧并校验成功
@@ -910,7 +910,7 @@ private void ReceiveMessage(object sender, SerialDataReceivedEventArgs e)
910910
//限制一次接收的最大数量 避免多设备连接时 导致数据收发无法判断帧结束
911911
if (frameCache.Count > ComConfig.MaxLength)
912912
break;
913-
Thread.Sleep(1);
913+
Thread.Sleep(1);//同步等待
914914
} while (times < ComConfig.TimeOut);
915915
#endregion
916916

0 commit comments

Comments
 (0)