https://www.cnblogs.com/yangfengwu/p/11102026.html
首先规定下协议 ,CRC16就不加了哈,最后我会附上CRC16的计算程序,大家有兴趣自己加上
上位机发送:
0xaa 0x55 0x03 占空比(高电平时间高位) 占空比(高电平时间低位)
单片机解析协议,然后修改占空比
先用调试助手发几个数据测试一下
aa 55 03 03 E8 1000
aa 55 03 01 F4 500
aa 55 03 00 64 100
aa 55 03 00 00 0
给大家C语言计算CRC的程序
/** * @brief 计算CRC * @param *modbusdata:数据指针 * @param length:数据长度 * @param * @retval 计算的CRC值 * @example **/ int crc16_modbus(u8 *modbusdata, int length) { int i, j; int crc = 0xffff;//有的使用0 for (i = 0; i < length; i++) { crc ^= modbusdata[i]; for (j = 0; j < 8; j++) { if ((crc & 0x01) == 1) { crc = (crc >> 1) ^ 0xa001; } else { crc >>= 1; } } } return crc; } /** * @brief 判断数据的CRC校验是否正确 * @param *modbusdata:数据指针 * @param length:数据长度 * @param * @retval 1 正确 0 错误 * @example **/ int crc16_flage(u8 *modbusdata, int length) { int Receive_CRC=0,calculation=0;//接收到的CRC,计算的CRC Receive_CRC = crc16_modbus(modbusdata, length); calculation = modbusdata[length+1]; calculation <<= 8; calculation += modbusdata[length]; if(calculation != Receive_CRC) { return 0; } return 1; }
好了下节再做上位机程序