@@ -271,7 +271,7 @@ public void GetComPorts()
271
271
var usbDevice = ComPorts . FindFirst ( x => x . DeviceName . ToLower ( ) . Contains ( "usb" ) ) ;
272
272
273
273
//若最后一次选择的是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 ) ) ;
275
275
if ( lastUsbDevice != null )
276
276
{
277
277
usbDevice = lastUsbDevice ;
@@ -748,7 +748,7 @@ public bool IsModbusCrcOk(byte[] frame)
748
748
}
749
749
750
750
/// <summary>
751
- /// 接收串口消息
751
+ /// 接收串口消息 该方法必须必须必须使用同步不能用异步
752
752
/// </summary>
753
753
/// <param name="sender"></param>
754
754
/// <param name="e"></param>
@@ -778,7 +778,6 @@ private void ReceiveMessage(object sender, SerialDataReceivedEventArgs e)
778
778
if ( ComConfig . IsOpened == false )
779
779
return ;
780
780
times ++ ; //计时
781
-
782
781
//串口接收到新的数据时执行
783
782
if ( SerialPort . BytesToRead > 0 )
784
783
{
@@ -789,7 +788,6 @@ private void ReceiveMessage(object sender, SerialDataReceivedEventArgs e)
789
788
frameCache . AddRange ( tempBuffer ) ; //添加进接收的数据缓存列表
790
789
//isDone = false; //标记frameCache未处理完成
791
790
}
792
-
793
791
//二级缓存frameCache中还有未处理完的数据
794
792
if ( frameCache . Count > 0 )
795
793
{
@@ -836,6 +834,7 @@ private void ReceiveMessage(object sender, SerialDataReceivedEventArgs e)
836
834
//由于监控串口网络时,请求帧和应答帧时间间隔较短,会照成接收粘包 通过先截取一段数据分析是否为请求帧,为请求帧则先解析
837
835
//0X01请求帧8字节 0x02请求帧8字节 0x03请求帧8字节 0x04请求帧8字节 0x05请求帧8字节 0x06请求帧8字节 0x0F请求帧数量不定 0x10请求帧数量不定
838
836
//由于大部分请求帧长度为8字节 故对接收字节前8字节截取校验判断是否为一帧可以解决大部分粘包问题
837
+
839
838
//当二级缓存大于等于8字节时 对其进行crc校验,验证通过则为一帧
840
839
if ( ! isNot && frameCache . Count >= 8 )
841
840
{
@@ -854,16 +853,17 @@ private void ReceiveMessage(object sender, SerialDataReceivedEventArgs e)
854
853
}
855
854
else if ( frame [ 1 ] == 0x10 && frameCache . Count < ( frame [ 6 ] + 9 ) )
856
855
{
857
- continue ; //数据量不够则继续接收
856
+ //数据量不够则继续接收 不能用continue,否则无法执行程序最后的延时1ms
858
857
}
858
+
859
859
//0x03响应帧 从站ID(1) 功能码(1) 字节数(1) 寄存器值(N*×2) 校验码(2)
860
860
else if ( frame [ 1 ] == 0x03 && frameCache . Count >= ( frame [ 2 ] + 5 ) )
861
861
{
862
862
frame = frameCache . Take ( frame [ 2 ] + 5 ) . ToList ( ) ;
863
863
}
864
864
else if ( frame [ 1 ] == 0x03 && frameCache . Count < ( frame [ 2 ] + 5 ) )
865
865
{
866
- continue ; //数据量不够则继续接收
866
+ //数据量不够则继续接收 不能用continue,否则无法执行程序最后的延时1ms
867
867
}
868
868
//0x04响应帧 从站ID(1) 功能码(1) 字节数(1) 寄存器值(N*×2) 校验码(2)
869
869
else if ( frame [ 1 ] == 0x04 && frameCache . Count >= ( frame [ 2 ] + 5 ) )
@@ -872,7 +872,7 @@ private void ReceiveMessage(object sender, SerialDataReceivedEventArgs e)
872
872
}
873
873
else if ( frame [ 1 ] == 0x04 && frameCache . Count < ( frame [ 2 ] + 5 ) )
874
874
{
875
- continue ; //数据量不够则继续接收
875
+ //数据量不够则继续接收 不能用continue,否则无法执行程序最后的延时1ms
876
876
}
877
877
878
878
//解析出可能的帧并校验成功
@@ -910,7 +910,7 @@ private void ReceiveMessage(object sender, SerialDataReceivedEventArgs e)
910
910
//限制一次接收的最大数量 避免多设备连接时 导致数据收发无法判断帧结束
911
911
if ( frameCache . Count > ComConfig . MaxLength )
912
912
break ;
913
- Thread . Sleep ( 1 ) ;
913
+ Thread . Sleep ( 1 ) ; //同步等待
914
914
} while ( times < ComConfig . TimeOut ) ;
915
915
#endregion
916
916
0 commit comments