// CRC校验函数
uint16_t Modbus_CRC16(uint8_t *data, uint16_t length) {
uint16_t crc = 0xFFFF;
for (uint16_t i = 0; i < length; i++) {
crc ^= data[i];
for (uint8_t j = 0; j < 8; j++) {
if (crc & 1)
crc = (crc >> 1) ^ 0xA001;
else
crc >>= 1;
}
}
return crc;
}
使用
void TempErature(void)
{
temp_data[0] = 01; // 设备地址
temp_data[1] = 06; // 写(06)
temp_data[2] = 00; //
temp_data[3] = 00; // 功能地址(2位)
temp_data[4] = rx1_buf[2]; //
temp_data[5] = rx1_buf[1]; // 数据(2位)
uint16_t crc = Modbus_CRC16(temp_data, 6);
temp_data[6] = crc & 0xFF; // CRC
temp_data[7] = (crc >> 8) & 0xFF; // CRC
HAL_UART_Transmit(&huart2, temp_data, 8, HAL_MAX_DELAY);
}