#include #include "hw_config.h" uint16_t adcx1,adcx2,temp1,temp2,crc_temp; // uint16_t crc16=0xffff; uint16_t Reg_CRC=0xffff; uint8_t uart1_buf[5]; int count1=0; int Flag=0; uint8_t PX1[400]; uint16_t PX2[30]; uint8_t *p=PX1; uint16_t sum; int i,j,z,k; u8 table[5]; uint8_t *p2=uart1_buf; void Delay(void) { int x,y; for(x=1000;x>0;x--) for(y=1000;y>0;y--); } int main(void) { SystemInit(); /*系统初始化*/ NVIC_Configuration(); LED_Configuration(); USART_Configuration(); ADC_Configuration(); while (1) { if(Flag==1) { if(uart1_buf[0]==0x03) { Uart1_PutString(p2 , 5); // crc16=0xffff ; // for(z=0;z 1) ^ 0xa001; // else // crc16 = crc16 >> 1; // } // //} uint16_t CRC16_Check(uint8_t *Pushdata,uint8_t length) { uint16_t Reg_CRC=0xffff; int k, j; for(k=0;k1^0xA001; else Reg_CRC >>=1; } } return (Reg_CRC); } 这是我stm32中程序,我上位机用labview发送03 c8 c8 另加上这三个数的CRC16校验码 总共五个数值发给stm32下位机,下位机中判断第一位是否为03 和最后两位CRC校验码是否正确。判断正确之后再将ADC1采样的值发送给上位机。 这里上位机03 C8 C8 的CRC16校验的结果是 D7 96(先低位再高位)。而我下位机的程序无论是用uint16_t CRC16_Check(uint8_t *Pushdata,uint8_t length)这个函数还是用 for(z=0;z |
RE:stm32 串口通信中的 CRC16校验的问题
2、建议自己写一个ut用例, 测试下自己的crc代码是否写正确的,可以用一个软件生成crc ,再和自己代码crc生成的数据比一次。
3、你首先要自己验证自己的函数, 再上板测试
RE:stm32 串口通信中的 CRC16校验的问题
回复:stm32 串口通信中的 CRC16校验的问题
1、网上有现成的CRC校验函数,看看你上位机使用的crc 和stm32使用的crc 精度是不是一样的, crc 精度包括crc8 crc16 crc32;
2、建议自己写一个ut用例, 测试下自己的crc代码是否写正确的,可以用一个软件生成crc ,再和自己代码crc生成的数据比一次。
3、你首先要自己验证自己的函数, 再上板测试
我将写在板子上的CRC16校验程序放在microsoft visual c++ 6.0中试验了一下,他的结果也是D7 96但是我用板子校验,结果怎么就错了真是奇怪了。不懂为什么不懂哪里出错了
回复:stm32 串口通信中的 CRC16校验的问题
CRC16的校验码产生方式不同,还是用统一的代码产生CRC校验吗把。
是的我板子里面的程序和上位机中的校验方式是一样的。不懂为什么结果不同。晕
RE:stm32 串口通信中的 CRC16校验的问题
RE:stm32 串口通信中的 CRC16校验的问题
RE:stm32 串口通信中的 CRC16校验的问题
RE:stm32 串口通信中的 CRC16校验的问题