/S00/1/ 0044 000000000000 0000 40 003C 3D 5C 21 1B 0100001F FFFF15 00000000 002D 0000 00 2C 2048
/S00/1/ 0044 000000000000 0000 40 003C 3D 5C 21 1B 0100001F FFFF14 00000000 002D 0000 00 2C 1F48
/S00/1/ 0044 000000000000 0000 40 003C 3C 5C 21 1B 0100011F FFFF13 000002F8 0001 0000 00 2C 155C
以上面数据为例,算一下末尾的 2048 1F48 155C 为校验位,均为十六进制表示
在u8 USART1_Tranfer(void)中的checksum表示的是校验
- /*十六进制转成ASCII码*/
- u8 HexToAscill(u16 *hex, u8 *ascillbuf, u8 buflenth)
- {
- u16 phex=*hex;
- u8 i=1;
- for(i=0;i<buflenth;i++)
- {
- ascillbuf[i] = 0;
- }
- i = 1;
- if(&ascillbuf[buflenth-1]==NULL||phex==NULL)
- {
- for(i=0;i<buflenth;i++)
- {
- if(ascillbuf[i]==0)
- {
- ascillbuf[i] = 0 + '0';
- }
- }
- return 0;
- }
- while(phex!=0)
- {
- if((phex)%16<=9)
- {
- ascillbuf[buflenth-i] = (phex)%16 + '0';
- }
- else
- {
- ascillbuf[buflenth-i] = (phex)%16 + '7';//将10进制的phex转换成16进制取其个位+'7'ASSCII
- }
-
- phex = (phex)/16;
-
- i++;
-
- if(buflenth<i)
- {
- break;
- }
- }
- for(i=0;i<buflenth;i++)
- {
- if(ascillbuf[i]==0)
- {
- ascillbuf[i] = 0 + '0';
- }
- }
- return 1;
- }
- typedef union{
- u8 usart1_data[75];
- struct{
- u8 head[7];// /S00/1/
- u8 data_lentgh[4];/*from time data to checksum data*/
- u8 datetime[12];
- u8 random_number[4];
- u8 fault_code[2];
- u8 tds1_value[4];/*原水*/
- u8 tds2_value[2];/*净水*/
- u8 ntc0_temperature[2];/*不加热*/
- u8 ntc1_temperature[2];/*热水*/
- u8 ntc2_temperature[2];/*保温*/
- u8 fixed_state[8];//固定状态
- u8 percentage_of_filter_core[6];/*1 2 3*/
- u8 total_running_time_of_water_pump[8];/*单位:秒*/
- /// u8 PressurePumpCurrent[4];//增压泵电流,单位:mA
- u8 real_time_water_output[4];/*单位:毫升*/
- u8 the_rest_of_the_day_bucket[4];
- u8 fixtype[2];
- u8 end0[2];
- }s;
- }__attribute__ ((aligned (1)))USART1_TRANSFER0_DATA_UNION;
- extern volatile USART1_TRANSFER0_DATA_UNION Usart1_transf_data;
- typedef union{
- u8 all[4];
- struct{
- u8 checksum[4];
- u8 end[2];/*\r\n*/
- }s;
- }__attribute__ ((aligned (1)))USART1_DATA_END;
- extern volatile USART1_DATA_END Usart1_data_end;
- u8 USART1_Tranfer(void)
- {
- char i=0,j=0,z=0;
- u8 datanum = 0;
- u8 head3 = 0;
- u8 head4 = 0;
- u16 checksum = 0;
- u16 *p=NULL;
- u8 req_dat_num=0,req_dat[30];
- u8 transdata[164]={0};
- static u16 ticker=0;
-
-
- if(Transf_fifo[BEGIN]!=0)
- {
-
- System_Data.usart1_tran_data_len = sizeof(USART1_TRANSFER0_DATA_UNION)+req_dat_num-7;
- //System_Data.usart1_tran_data_len = 77;//对应协议下发数据的指令字符串长度,除去Check Sum
- Usart1_transf_data.s.head[0] = '/';
- Usart1_transf_data.s.head[1] = 'S';
- Usart1_transf_data.s.head[2] = head3;
- Usart1_transf_data.s.head[3] = head4;
- Usart1_transf_data.s.head[4] = '/';
- Usart1_transf_data.s.head[5] = '1';
- Usart1_transf_data.s.head[6] = '/';
- Usart1_transf_data.s.end0[0] = '2';
- Usart1_transf_data.s.end0[1] = 'C';
- Usart1_transf_data.s.ntc0_temperature[0] = '2';
- Usart1_transf_data.s.ntc0_temperature[1] = '2';
-
- for(i=0;i<sizeof(Usart1_transf_data.s.datetime);i++)
- {
- if(Usart1_transf_data.s.datetime[i]==0)
- {
- Usart1_transf_data.s.datetime[i] += '0';//时间码
- }
- }
- for(i=0;i<sizeof(Usart1_transf_data.s.random_number);i++)//回应随机数
- {
- if(Usart1_transf_data.s.random_number[i]==0)
- {
- Usart1_transf_data.s.random_number[i] += '0';
- }
- }
- for(i=0;i<sizeof(Usart1_transf_data.s.fixed_state);i++)//固定状态
- {
- Usart1_transf_data.s.fixed_state[i] = System_Data.fixed_state[i];//固定状态的首字符为0
- }
- for(i=0;i<sizeof(Usart1_transf_data.s.fixed_state);i++)//fixed_state[0] 为预留
- {
- if(Usart1_transf_data.s.fixed_state[i]==0)
- {
- Usart1_transf_data.s.fixed_state[i] += '0';
- }
- }
- for(i=0;i<sizeof(Usart1_transf_data.s.percentage_of_filter_core);i++)
- {
- Usart1_transf_data.s.percentage_of_filter_core[i] = 'F';//表示滤芯的首位值
- }
- if(Save_Data.s.machine_type==0||Save_Data.s.machine_type>9)
- {
- Usart1_transf_data.s.percentage_of_filter_core[4] = '0';//表示的是滤芯的第5位,为什么不是'1'呢?
- }
- else
- {
- Usart1_transf_data.s.percentage_of_filter_core[4] = Save_Data.s.machine_type + '0'; //不太明白
- }
-
- if(MachineWorkStatus==10)
- {
- Usart1_transf_data.s.percentage_of_filter_core[5] = 'A';//代表第六个元素的ASCII值
- }
- else
- {
- Usart1_transf_data.s.percentage_of_filter_core[5] = MachineWorkStatus + '0';//
- }
-
- HexToAscill((u16*)&(System_Data.pressure_pump_all_run_time), (u8*)Usart1_transf_data.s.total_running_time_of_water_pump, \
- sizeof(Usart1_transf_data.s.total_running_time_of_water_pump));
-
- //增加串口协议,用4位十六进制数表示增压泵电流,单位:mA
- /// HexToAscill((u16*)&(System_Data.press_pump_current), (u8*)Usart1_transf_data.s.PressurePumpCurrent, \
- /// sizeof(Usart1_transf_data.s.PressurePumpCurrent));
-
-
- HexToAscill((u16*)&(System_Data.real_time_water_output), (u8*)Usart1_transf_data.s.real_time_water_output, \
- sizeof(Usart1_transf_data.s.real_time_water_output));
- HexToAscill((u16*)&(System_Data.the_rest_of_the_day_bucket), (u8*)Usart1_transf_data.s.the_rest_of_the_day_bucket, \
- sizeof(Usart1_transf_data.s.the_rest_of_the_day_bucket));
- HexToAscill((u16*)&(System_Data.fixtype), (u8*)Usart1_transf_data.s.fixtype, \
- sizeof(Usart1_transf_data.s.fixtype));
-
- /*头部*/
- for(i=0;i<sizeof(USART1_TRANSFER0_DATA_UNION);i++)
- {
- transdata[i] = Usart1_transf_data.usart1_data[i];
- }
- /*中部 添加请求上位机的信息数据*/
- for(i=sizeof(USART1_TRANSFER0_DATA_UNION);i<sizeof(USART1_TRANSFER0_DATA_UNION)+req_dat_num;i++)
- {
- transdata[i] = req_dat[i-sizeof(USART1_TRANSFER0_DATA_UNION)];
- }
- p = (u16*)&transdata[7];
- for(i=0;i<(req_dat_num+sizeof(USART1_TRANSFER0_DATA_UNION)-7)/2;i++)
- {
- checksum += p[i];
- // if(p[i]>64) checksum -= 55;
- // else
- checksum -= 48;
- //if(i == 10) temp = checksum;
- }
- temp = p[12]-48;//
- HexToAscill((u16*)&(checksum), (u8*)Usart1_data_end.s.checksum, \
- sizeof(Usart1_data_end.s.checksum));
-
- Usart1_data_end.s.end[0] = '\r';
- Usart1_data_end.s.end[1] = '\n';
- /*尾部*/
- for(i=sizeof(USART1_TRANSFER0_DATA_UNION)+req_dat_num;i<req_dat_num+sizeof(USART1_TRANSFER0_DATA_UNION)+sizeof(USART1_DATA_END);i++)
- {
- transdata[i] = Usart1_data_end.all[i-sizeof(USART1_TRANSFER0_DATA_UNION)-req_dat_num];
- }
-
- datanum = sizeof(USART1_TRANSFER0_DATA_UNION)+sizeof(USART1_DATA_END)+req_dat_num;
- for(i=0;i<datanum;i++)
- {
- USART_SendData(USART1,transdata[i]);
-
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}
- }
- for(i=0;i<FIFO_LENGTH-1;i++)
- {
- Transf_fifo[i] = Transf_fifo[i+1];
- }
- Transf_fifo[FIFO_LENGTH-1] = 0;
- }
- return 0;
- }
复制代码 有知道最上面的那3行最末尾的4位校验和是怎么算的吗?
|
奇偶校验是不需要考虑的 自定义的校验需要程序实现的
具体实现的方式有很多
你这种属于和校验 就是把所有的数据都加一起 得出一个16位数据 存在最后的字节中 但你这个每两个和加完以后又减去一个固定的值 这就是防止破解的 如果单纯的和校验是很容易破解的 但是减去一个固定值破解起来就困难了许多 减去的这个固定值是在接收两端都设计好 就能增加破解难度
其他的破解还有CRC 或者利用公式 等等 都是为了数据的安全和可靠性
是的,已经算到了
u8类型用(u16*)的指针,一次性取16bit 00 46 00 ... 然后HexToAscii是先转后一个字节的ASCII,再转前一个字节的ASCII (0x3030-30H)+(0x3634-30H)+...+[0x(n+(n-1))-30H] (n=48) 总共是48个ASCII码参与校验
正解
全面,准确,正解