QT串口接收包通过制定的协议进行检查筛选

QT串口递归解析最新数据包数据

直接看代码:

//函数功能:对实时接收到的串口数据进行解析处理,根据制定的协议格式处理
//参数1:实时收到的数据,
//参数2:解析后的结果
//返回值:如果为true,说明解析成功,false 说明解析失败。
bool CheckFormatFun(QByteArray arr,QByteArray &resultdata)
{

    if(!arr.isEmpty())
    {
        m_RecvData.append(arr);

        if(m_RecvData.length() < _DATA_SIZE)
        {
            return false;
        }
        for(int i = 0; i < m_RecvData.length(); i++)
        {
            if(m_RecvData.length() - i < _DATA_SIZE)
            {
                m_RecvData.remove(0,i);
                return false;
            }

            if(0xBD == (UCHAR)m_RecvData[i] && 0x43 == (UCHAR)m_RecvData[i+1] && 0xF8 == (UCHAR)m_RecvData[i+2] && 0x0D == (UCHAR)m_RecvData[i+65] && 0x0A == (UCHAR)m_RecvData[i+66])
             {

                    uint16_t crc = QHelperData::MCLXB_CRC((UCHAR*)&m_RecvData.data()[i],_DATA_SIZE-4); //CRC校验
                    if (crc == (UINT_16)(m_RecvData[i+_DATA_CRC_SIZE] << 8) + (UCHAR)m_RecvData[i+_DATA_CRC_SIZE+1])  //大端传输数据,判断校验值是否正确
                    {

                        m_RecvData.remove(0,i);
                        resultdata.clear();
                        resultdata.append(m_RecvData.left(_DATA_SIZE));
                        m_RecvData.remove(0,_DATA_SIZE);

                        if(m_RecvData.length() > _DATA_SIZE)
                        {
                          return CheckFormatFun(m_RecvData,resultdata); //递归获取最新的数据协议包数据
                        }
                        else
                        {
                            return true;
                        }
                    }
             }
        }
    }


    return false;
}

此代码为某对象成员函数,在用的时候可以将此函数放到某个对象里面进行调试。

下面附上CRC校验代码:

//函数功能:计算CRC16
//参数1:*data 16位CRC校验数据,
//参数2:len   数据流长度
uint16_t MCLXB_CRC(uint8_t *data, uint32_t len)
{
    unsigned char i, *ptr = data;
    unsigned int crc = 0;
    uint16_t crc_result = 0;
    uint32_t index;

    index = len;

    while (index--)
    {
        for (i = 0x80; i != 0; i = i >> 1)
        {
            if ((crc & 0x8000) != 0)
            {
                crc = crc << 1;
                crc = crc ^ 0x1021;
            }
            else
            {
                crc = crc << 1;
            }
            if ((*ptr & i) != 0)
            {
                crc = crc ^ 0x1021;
            }
        }
        ptr++;
    }

    crc_result = crc;

    return crc_result;
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九江在天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值