QT Modbus RTU调试助手(包含算法实现CRC MODBUS16校验)

简介: QT Modbus RTU调试助手(包含算法实现CRC MODBUS16校验)



在类构造函数中将UI初始化和串口对象定义以及查找串口

foreach (const QSerialPortInfo ports, QSerialPortInfo::availablePorts()){
        ui->comboBox->addItem(ports.portName());
    }
serialPort=new QSerialPort(this);
// 串口申请的内存在析构函数中需要调用close
serialPort->close();

串口设置

一般的RS-485传感器配置

波特率:9600

奇偶校验:无校验

停止位:一位

数据位:8位

具体实现(逻辑代码部分需要自己去判断下面只给出部分实现的子函数):

// 串口号默认打开cmb下拉框第一个
    serialPort->setPortName(ui->comboBox->currentText().trimmed());
  //  数据位
    serialPort->setDataBits(QSerialPort::Data8);
  //  奇偶校验:无校验
    serialPort->setParity(QSerialPort::NoParity);
    //  奇偶校验:偶校验
    serialPort->setParity(QSerialPort::EvenParity);
  //  奇偶校验:奇校验
    serialPort->setParity(QSerialPort::OddParity);
  //   停止位:1位
    serialPort->setStopBits(QSerialPort::OneStop);
    //   停止位:2位
    serialPort->setStopBits(QSerialPort::TwoStop);
  //    波特率
    serialPort->setBaudRate(ui->comboBox_2->currentText().toInt());
    // 打开串口为读写模式 并将按钮状态进行切换 打开失败弹窗提醒
    if(serialPort->open(QIODevice::ReadWrite)){
        serialPort->clear();
        ui->pushButton_2->setDisabled(true);
        ui->pushButton->setEnabled(true);
        ui->pushButtonGonder->setEnabled(true);
    }else{
        QMessageBox::critical(this, tr("Error"), serialPort->errorString());
    }

串口接受

部分函数的实现:该函数需要绑定串口接受信号,此语句需要加入到构造函数中来实现

connect(serialPort,&QSerialPort::readyRead,this,&AnaPencere::readData); //绑定串口读信号
Delay_MSec(20); //在项目开发中发现接受串口信号的时候会出现接受两次的情况,有可能是硬件上数据发送过慢所以在这里我加了一个20ms的延时
    rData=serialPort->readAll();
    QString str;
    str.append(rData.toHex().toUpper());
    ui->textEdit->append("接受:"+rData.toHex().toUpper());

QT延时函数

//延时函数
void AnaPencere::Delay_MSec(unsigned int msec)
{
    QTime _Timer = QTime::currentTime().addMSecs(msec);
    while( QTime::currentTime() < _Timer )
    QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}

CRC校验

int j;
    unsigned int reg_crc=0xFFFF;
    while(length--)
    {
      reg_crc ^= *data++;
        for(j=0;j<8;j++)
        {
            if(reg_crc & 0x01)
            { 
                reg_crc=(reg_crc>>1) ^ 0xA001;
            }else
            {
               reg_crc=reg_crc >>1;
            }
        }
    }
    // 如果这里需要调换crc高八位和低八位的位置可以用下面的方法
    // QByteArray crc_value;
    // crc_value.append(char(reg_crc&0x00ff));
    // crc_value.append(char(reg_crc>>8));
    return reg_crc;

发送串口数据函数

QString data="Hello RS-485!";
    QByteArray sendbuff;
  // 分割两位数据
    for(int i=0;i<data.length();i+=2){
        QString a1=data.mid(i,2);
        bool ok;
        unsigned int den=a1.toUInt(&ok,16);
        sendbuff.append(char(den));
    }
    // 计算CRC
    unsigned char uzunluk=uchar(sendbuff.length());
    unsigned int crc=crc_chk(reinterpret_cast<unsigned char*> (sendbuff.data()),uzunluk);
    
    // 发送buff加入CRC校验
    sendbuff.append(char(crc&0x00FF));
    sendbuff.append(char(crc>>8));
  
  // 将计算好的crc显示到文本框上
    ui->edit_crr_data->setText( QString("%1").arg(crc , 0, 16));
    ui->edit_display->append("发送:"+sendbuff.toHex().toUpper());
    // 发送到串口
    serialPort->write(sendbuff);

总结

本项目的核心代码也就是上面的函数了,如果能理解的话自己做一个美观的RS485 ModbusRTU调试助手是肯定没有问题的,其实和串口助手基本相同,只是说在串口助手的基础上添加了crc校验,发送数据的额时候是根据modbus消息基本的数据格式来发送的。

一般Modbus-RTU 通讯规约格式如下:

初始结构 ≥4 字节的时间

地址码 = 1 字节

功能码 = 1 字节

数据区 = N 字节

错误校验 = 16 位 CRC 码

结束结构 ≥4 字节的时间

地址码:485地址

功能码: 0x03(读取寄存器数据)0x06(写寄存器数据)

CRC 码:二字节的校验码,注意高低位位置

实现这样的的一个功能只需要将几个文本框的内容加到一起再通过上面的数据发送函数发送就可以实现,寄存器值部分只需要在接受函数中去截取寄存器的数值(可以通过寄存器个数文本框的数值来做截取)。


相关文章
|
6月前
|
算法
常用的简单校验算法:校验和,异或校验,crc校验,LRC校验,补码求和,checksum
常用的简单校验算法:校验和,异或校验,crc校验,LRC校验,补码求和,checksum
1019 1
|
6月前
|
存储 算法 安全
C# | 上位机开发新手指南(五)校验算法——CRC
当我们在进行数据传输时,可能会因为信道噪声、干扰等因素导致数据出现错误,从而影响传输的可靠性和准确性。此时,我们需要一种方法来检测数据是否出现错误,并尽可能快速地发现和纠正错误。CRC(Cyclic Redundancy Check)校验算法就是一种常用的数据校验方法,它通过对数据进行处理生成校验码,从而实现对数据的完整性和准确性进行验证。 使用CRC校验的意义在于能够提高数据传输的可靠性,降低数据传输错误率,确保数据的完整性和准确性。在各个领域中,如通信、网络、存储等,CRC校验都得到了广泛的应用。
292 0
C# | 上位机开发新手指南(五)校验算法——CRC
|
安全 Linux 网络安全
嵌入式QT应用程序与WEB端通信遇到的HTTPS校验证书的问题记录
嵌入式QT应用程序与WEB端通信遇到的HTTPS校验证书的问题记录
216 0
|
算法
Qt实现一个重复文件检测小工具(原理:通过md5校验)
Qt实现一个重复文件检测小工具(原理:通过md5校验)
305 0
|
算法
CRC 校验算法
CRC 校验算法
260 0
|
机器学习/深度学习 资源调度 算法
【图像隐藏】基于小波变换+SURF、RANSAC、LT码、CRC码多种算法实现图像隐藏(抗多种攻击)matlab源码
【图像隐藏】基于小波变换+SURF、RANSAC、LT码、CRC码多种算法实现图像隐藏(抗多种攻击)matlab源码
|
算法 搜索推荐 C++
|
设计模式 存储 算法
项目实战:Qt+OpenCV图像处理与识别算法平台(持续更新,当前v1.7.0)
项目实战:Qt+OpenCV图像处理与识别算法平台(持续更新,当前v1.7.0)
项目实战:Qt+OpenCV图像处理与识别算法平台(持续更新,当前v1.7.0)
|
算法 C语言 索引

推荐镜像

更多
下一篇
无影云桌面