【QT】 Qt中生成Modbus CRC16校验码

Qt小记

在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

使用 Hugo 构建
主题 StackJimmy 设计