//数据发送函数
void Data_Trans() {
Send_Data[0] = 0;
Send_Data[1] = 1;
Send_Data[2] = 2;
Send_Data[3] = 3;
Send_Data[4] = 4;
Send_Data[5] = 5;
Send_Data[6] = 6;
Send_Data[7] = 7;
Send_Data[8] = 8;
Send_Data[9] = 9;
Send_Data[10] = 10;
Send_Data[11] = 11;
Send_Data[12] = 12;
Send_Data[13] = 13;
Send_Data[14] = Frame_CNT; //帧计数
Frame_Sum = 0;
for (int i = 0; i < 15; i++)
{
Frame_Sum = Frame_Sum + Send_Data[i];
}
Frame_CNT++;
Send_Data[15] = -Frame_Sum;
Send_ConFigData();
}
例如Frame_Sum = 477,我们计算校验和,计算机为了计算方便,正数原反补相同,负数进行补码存储。
序号 | 数据 | 值 | 内容 |
1 | Frame_Sum(int) | 477 | 0000 .... 0001 1101 1101(原=反=补) |
2 | -Frame_Sum(int) | -477 | 1000 .... 0001 1101 1101(原) 1111 .... 1111 0010 0010(反,除符号位全部取反) 1111.... 1111 0010 0011(补,反码+1) |
3 | 单片机传输使用unsigned char,为了方便传输 | -Frame_Sum(int)->取低8bit(uint8_t) 0010 0011作为传输字节(正数) | |
4 | 接收端接到数据验证: 数据和+(uint8_t)(-Frame_Sum)=0 | 0 | 477+35 == 0 (477+35=512 -> 0010 0000 0000 -> (uint8_t)0000 000 |
原理:
利用数据和的,低8bit字节取反+1的补码获得,a = 256%数据和(低8bit)。
然后接收端通过 数据和+a = 256(低8byte = 0)来验证数据正确性。
----------------------------------------
接收端验证(labview):
通过包头判断和求和=0判断数据包。