这段代码定义了一个名为 modbus_crc16 的函数,该函数可以用于计算任何长度的数据的 Modbus RTU 校验值。可以将 senddata 数组作为参数传递给该函数,并在 setup 函数中调用该函数以计算其 CRC16 值。然后,通过位运算将该值分为高位和低位,并将其输出。
#include <stdint.h>
unsigned char senddata[2] = {0x01, 0x03};
uint16_t modbus_crc16(unsigned char *data, uint8_t length) {
uint16_t crc = 0xFFFF;
for (uint8_t i = 0; i < length; i++) {
crc ^= data[i];
for (uint8_t j = 8; j > 0; j--) {
if (crc & 0x0001) {
crc = (crc >> 1) ^ 0xA001;
} else {
crc >>= 1;
}
}
}
return crc;
}
void setup() {
Serial.begin(9600);
uint16_t crc = modbus_crc16(senddata, sizeof(senddata));
Serial.print("CRC16: 0x");
Serial.print((crc & 0xFF00) >> 8, HEX);
Serial.print(", 0x");
Serial.println(crc & 0x00FF, HEX);
Serial.print("CRC16:");
Serial.print((crc & 0xFF00) >> 8);
Serial.print(",");
Serial.println(crc & 0x00FF);
}
void loop() {
// Do nothing
}