在上位机中,经常需要判断下位机(如单片机模块)返回的指令是否正确,这就存在一个校验的过程,来检查模块发过来的数据和上位机接收的数据是一样,常用校验和来检查,也即是方式模块,将发送的数据计算一个和值,和值放在数据的末尾,随数据一起发送,接收数据的上位机将接收到的数据也做和值计算,检查双方计算的和值是否一样,来判断收发数据是否正确。
指令发送基本是十六进制的字符串。
如下图:
文本框为接收到的指令字符串,16代表停止位,18是校验和,也即是CheckSum.如果校验和大于255(FF),位数超过2位的话,仅保留前2位,因为要保证协议中的数据位,不能多出几位,保证停止位前2位就是CheckSum.
C# 中实现的功能函数代码如下:
private bool CalCheckSum(string hexString, out string ckSum)
{
try
{
ckSum = string.Empty;
if (hexString.Length % 2 != 0)
return false;
byte[] buffer = new byte[hexString.Length / 2];
for (int i = 0; i < hexString.Length; i = i + 2)
{
buffer[i / 2] = Convert.ToByte(hexString.Substring(i, 2), 16);
}
int sum = 0;
for (int i = 0; i < buffer.Length - 2; i++)//Stop Bit 的值即为CheckSum
{
sum += (int)buffer[i];
}
string cks = sum.ToString(“X2”);
if (cks.Length > 2)
ckSum = cks.Substring(cks.Length - 2, 2);
else
ckSum = cks;
return true;
}
catch (Exception ex)
{
var exm = ex.Message;
ckSum = “”;
return false;
}
}
在WPB创建Button Click事件中之间引用方法:
private void btnGetCmdCheckSum_Click(object sender, RoutedEventArgs e)
{
string hexCmd = txtCmd.Text;
string ckSum = “”;
if (CalCheckSum(hexCmd, out ckSum))
{
txtMsg.Text = $“校验和:{ckSum}”;
}
else
{
txtMsg.Text = $“计算校验和失败!”;
}
}
计算的情况如上图,和发送下位机一致 18,说明收发数据一致,没有丢包和误码。