在Qt中,如果你需要生成Modbus CRC16的校验码,你可以使用以下的方法:
首先,你需要有一个CRC16计算函数,代码如下:
uint16_t ModbusCRC16(QByteArray senddata)
{
int len=senddata.size();
uint16_t wcrc=0XFFFF;
uint8_t temp;
int i=0,j=0;
for(i=0;i<len;i++)
{
temp=senddata.at(i);
wcrc^=temp;
for(j=0;j<8;j++){
if(wcrc&0X0001){
wcrc>>=1;
wcrc^=0XA001;
}
else
wcrc>>=1;
}
}
temp=wcrc;
return wcrc;
}
这是一个可以计算数据的CRC16函数,预设的16位crc寄存器初值全部为1。
在使用中,通常我们将一串16进制字符串转化为字节流后调用函数,生成crc校验码:
QString hexDataString = head + address + num + sum + hexString1;
qDebug() << hexDataString;
QStringList hexDataList = hexDataString.split(" ");
QByteArray byteArray;
foreach (const QString& hexByte, hexDataList) {
bool ok;
int value = hexByte.toInt(&ok, 16);
if (ok) {
byteArray.append(static_cast<char>(value));
}
}
uint16_t wcrc = ModbusCRC16(byteArray);
QString hexString = QString("%1").arg(wcrc, 4, 16, QLatin1Char('0'));
QString lowByte = hexString.mid(hexString.length() - 2);
QString highByte = hexString.left(2);
if (lowByte.length() < 2) {
lowByte.prepend('0');
}
if (highByte.length() < 2) {
highByte.prepend('0');
}
QString combinedHex = (lowByte + " " + highByte).toUpper();
这段代码首先将十六进制字符串分割为一个列表,然后使用该列表创建一个字节数组。提取生成的wcrc的低、高位字节,然后将低、高位字节组合在一起(注意:按照小端方式进行组合,即低字节在前,高字节在后),最后得到校验码字符串。
Photo by Meow on Coverview