cvm可以做网站服务器吗,网片围栏,怎么做整人点不完的网站,怎么做网站免费的教程作者#xff1a; Herman Ye Galbot Auromix 测试环境#xff1a; Ubuntu20.04 更新日期#xff1a; 2023/08/30 注1#xff1a; Auromix 是一个机器人爱好者开源组织。 注2#xff1a; 本文在更新日期经过测试#xff0c;确认有效。
笔者出于学习交流目的#xff0c; 给…作者 Herman Ye Galbot Auromix 测试环境 Ubuntu20.04 更新日期 2023/08/30 注1 Auromix 是一个机器人爱好者开源组织。 注2 本文在更新日期经过测试确认有效。
笔者出于学习交流目的 给出以下ModbusCRC16校验常用的四种函数以及完整示例代码
1.计算CRC
注意 此处在末尾进行了高低位交换可根据需求删减代码交换高低位顺序。
unsigned short calculateModbusCRC16(const vectoruint8_t data) {int length data.size();unsigned short CRC 0xFFFF; // initial valuefor (int i 0; i length; i) {CRC CRC ^ data[i]; // XOR byte into least sig. byte of crcfor (int j 0; j 8; j) {if (CRC 1) {CRC 1;CRC ^ 0xA001;} else {CRC 1;}}}unsigned short swappedCRC ((CRC 8) 0xFF) | ((CRC 0xFF) 8);return swappedCRC;
}2.添加CRC校验位
注意 此处进行了高低位交换可根据需求删减代码交换高低位顺序。 void addModbusCRC16(vectoruint8_t data) {unsigned short crc calculateModbusCRC16(data);// Append CRC bytes to the data vectordata.push_back((crc 8) 0xFF); // MSBdata.push_back(crc 0xFF); // LSB}3.删除CRC校验位
void removeModbusCRC16(vectoruint8_t dataWithCRC) {int length dataWithCRC.size();// Error checkif (length 2) {cerr Invalid data length endl;return;}// Delete CRC at the enddataWithCRC.resize(length - 2);
}4.比较CRC校验位 bool compareModbusCRC16(const vectoruint8_t dataWithCRC) {int length dataWithCRC.size();// Error checkif (length 2) {cerr Invalid data length endl;return false;}// Get data without CRCvectoruint8_t dataWithoutCRC(dataWithCRC.begin(), dataWithCRC.end() - 2);// Calculateunsigned short calculatedCRC calculateModbusCRC16(dataWithoutCRC);// Get original CRCunsigned short originalCRC (dataWithCRC[length - 2] 8) | dataWithCRC[length - 1];return originalCRC calculatedCRC;
}5.完整示例代码
#include iostream
#include vector
#include iomanip
using namespace std;unsigned short calculateModbusCRC16(const vectoruint8_t data) {int length data.size();unsigned short CRC 0xFFFF; // initial valuefor (int i 0; i length; i) {CRC CRC ^ data[i]; // XOR byte into least sig. byte of crcfor (int j 0; j 8; j) {if (CRC 1) {CRC 1;CRC ^ 0xA001;} else {CRC 1;}}}unsigned short swappedCRC ((CRC 8) 0xFF) | ((CRC 0xFF) 8);return swappedCRC;
}void addModbusCRC16(vectoruint8_t data) {unsigned short crc calculateModbusCRC16(data);// Append CRC bytes to the data vectordata.push_back((crc 8) 0xFF); // MSBdata.push_back(crc 0xFF); // LSB}void removeModbusCRC16(vectoruint8_t dataWithCRC) {int length dataWithCRC.size();// Error checkif (length 2) {cerr Invalid data length endl;return;}// Delete CRC at the enddataWithCRC.resize(length - 2);
}bool compareModbusCRC16(const vectoruint8_t dataWithCRC) {int length dataWithCRC.size();// Error checkif (length 2) {cerr Invalid data length endl;return false;}// Get data without CRCvectoruint8_t dataWithoutCRC(dataWithCRC.begin(), dataWithCRC.end() - 2);// Calculateunsigned short calculatedCRC calculateModbusCRC16(dataWithoutCRC);// Get original CRCunsigned short originalCRC (dataWithCRC[length - 2] 8) | dataWithCRC[length - 1];// Logcout ModbusCRC16 original: hex originalCRC endl;cout ModbusCRC16 calculated: hex calculatedCRC endl;return originalCRC calculatedCRC;
}int main() {// Example data 1vectoruint8_t deviceData1 {0x01, 0x10, 0x00, 0x02, 0x00, 0x06, 0x0C, 0x41, 0x20,0x00, 0x00, 0x42, 0xC8, 0x00, 0x00, 0x42, 0x48, 0x00, 0x00,0x84, 0xC1}; // Example CRC: 0x84, 0xC1// Print original datacout Original data 1: ;for (uint8_t byte : deviceData1) {cout hex uppercase setw(2) setfill(0) (int)byte ;}cout endl;bool comparedResultcompareModbusCRC16(deviceData1);if (comparedResult)coutCompared result: TRUEendl;elsecoutCompared result: FALSEendl;// Example data 2coutendl;vectoruint8_t deviceData2 {0x01, 0x06, 0x00, 0x00, 0x01, 0x02, 0x02};// Example CRC: 0xDA, 0xC7cout Original data 2: ;for (uint8_t byte : deviceData2) {cout hex uppercase setw(2) setfill(0) (int)byte ;}cout endl;// Add CRC and print modified dataaddModbusCRC16(deviceData2);cout Add CRC to original data 2: ;for (uint8_t byte : deviceData2) {cout hex uppercase setw(2) setfill(0) (int)byte ;}cout endl;// Remove CRC from dataremoveModbusCRC16(deviceData2);cout Remove CRC from modified data 2: ;for (uint8_t byte : deviceData2) {cout hex uppercase setw(2) setfill(0) (int)byte ;}cout endl; return 0;
}