serialPort串口通讯参数:
///portName串口号,例:COM1、COM2
///baudRate波特率,例:9600
///parity奇偶校验位,例:parity = Parity.None
///dataBits数据位,例:int类型,8
///stopBits停止位,例:stopBits = StopBits.One
代码:
this.spVID = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
this.spVID.DataReceived += new SerialDataReceivedEventHandler(Comm_DataReceived);
if (this.spVID.IsOpen) this.spVID.Close();
this.spVID.Open();
void Comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (IsWork)
{
//myq 增加扫码
logger.Info(string.Format("-----------------IsWork-----------------"));
string VIN = "";
VIN = EAPort.ReadLine();
logger.Info(string.Format($"接收到扫码枪信息[{VIN}]"));
AddMessage("正在检测中,扫码无效");
return;
}
else
{
try
{
System.Threading.Thread.Sleep(1000);
logger.Info(string.Format("------------扫码开始-------------"));
string VIN = "";
//获取串口VIN带回车符号
VIN = EAPort.ReadLine();
VIN = VIN.Substring(0, VIN.Length - 1);
logger.Info(string.Format($"接收到扫码枪信息[{VIN}]开始检测"));
IsWork = true;
GetScanData(VIN);
}
catch (Exception ex)
{
logger.Error($"扫描VIN码出错原因:{ex.Message }***{ex.StackTrace}");
}
}
}
初始化:
public SerialPort(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits);
串口数据发一帧(一个字节)除了数据位还需要发开始位,停止位和校验位,共11个字节
CRC校验的概念:
简单来说就是为了确保发送数据到接收端那边是正确的。发送一帧数据时,会通过数据位来计算出一个CRC校验码,将计算出来的CRC校验码拼接在数据包最后,发送到接收端去。在接收端会接收到数据位以及CRC校验码,接收端将使用CRC校验码来确定数据位没有发错发漏的情况。
百度百科解释:
例如胎压发送帧如下图,一帧共11位,最后两位为CRC校验:
CRC校验计算方式:
计算器链接:16进制(CRC16)(MODBUS RTU通讯)校验码在线计算器
计算结果: