首页 > 其他分享 >Qt之modbus_slave例程的底层串口数据分析

Qt之modbus_slave例程的底层串口数据分析

时间:2023-12-14 16:47:39浏览次数:35  
标签:slave 例程 qmodbusrtuserialslave modbus 串口 cpp qCDebug 底层

一. 参考网址

1. qCDebug输出到日志文件

2. How to redirect qDebug, qWarning, qCritical etc output?

二. 问题

1.  如何查看slave底层收到的主机发送的消息和回复的消息?

解决办法:在main.cpp代码中取消注释

 注:QLoggingCategory::setFilterRules函数不能重复使用,其只能最后一条语句起作用,如

.......
QLoggingCategory::setFilterRules("qt.modbus = true");   //此行代码不会起作用
QLoggingCategory::setFilterRules("qt.modbus.lowlevel = true");
.......

 

三. 代码分析

1. 参考代码目录

例程:Qt\Examples\Qt-5.15.2\serialbus\modbus\slave
Qt底层源码:Qt\5.15.2\Src\qtserialbus\src\serialbus

2. 从上到下的层次关系

2.1   代码调用关系

MainWindow::MainWindow(QWidget *parent)    //mainwindow.cpp

   onCurrentConnectTypeChanged(0);    //mainwindow.cpp

      modbusDevice = new QModbusRtuSerialSlave(this);   //mainwindow.cpp

      Q_DECLARE_PRIVATE(QModbusRtuSerialSlave)   //位于qt底层源码目录:qmodbusrtuserialslave.h

        class QModbusRtuSerialSlavePrivate : public QModbusServerPrivate   //位于qt底层源码目录:qmodbusrtuserialslave_p.h

          setupSerialPort()   //位于qt底层源码目录:qmodbusrtuserialslave_p.h

2.2  在setupSrialPort()函数中定义了信号与槽函数,用于接收串口数据

// qmodbusrtuserialslave_p.h
void setupSerialPort() { Q_Q(QModbusRtuSerialSlave); m_serialPort = new QSerialPort(q); QObject::connect(m_serialPort, &QSerialPort::readyRead, q, [this]() { //信号与槽函数
        m_requestBuffer += m_serialPort->read(size); //读取串口数据 qCDebug(QT_MODBUS_LOW) << "(RTU server) Received ADU:" << adu.rawData().toHex(); //打印接收到的串口数据ADU格式(完整的modbus协议)
       qCDebug(QT_MODBUS) << "(RTU server) Request PDU:" << req; //校验成功后,打印PDU格式数据
       response = q->processRequest(req); //获取到响应的数据 PDU格式
       qCDebug(QT_MODBUS) << "(RTU server) Response PDU:" << response; //打印需要响应的PDU格式数据

        const QByteArray result = QModbusSerialAdu::create(QModbusSerialAdu::Rtu, q->serverAddress(), response); //生成ADU格式数据,完整的modbus协议

       qCDebug(QT_MODBUS_LOW) << "(RTU server) Response ADU:" << result.toHex(); //打印完整的modbus协议响应数据,ADU格式
       qint64 writtenBytes = m_serialPort->write(result); //发送数据 } ...... }

 四. 开启底层串口的数据调试打印信息

1. Q_DECLARE_LOGGING_CATEGORY , 参考文件:qmodbusrtuserialslave_p.h

 2. Q_LOGGING_CATEGORY, 参考文件:qmodbusdevice.cpp

 3. 文件:main.cpp

 

      

标签:slave,例程,qmodbusrtuserialslave,modbus,串口,cpp,qCDebug,底层
From: https://www.cnblogs.com/shanyu20/p/17901474.html

相关文章

  • s32k-I.MX8 基于串口通讯xrce-dds搭建
    s32k-iMX8平台XRCE-DDS的搭建1.引言XRCE-DDS简述     XRCE-DDS是可以在资源受限的MCU运行的DDS,在MCU侧运行客户端,通过代理服务参与DDS通信。 使用范围      本文将描述整个XRCE-DDS在GEN2平台的搭建过程,包含SOC侧imx8上运行xrce-dds的anget和s32k312单片机......
  • NRF52832---串口通信
    我在做一个蓝牙demo,蓝牙主控用的nrf52832。在添加DFU功能后,使用“nRFConnect”app连接上demo后,点击“notify”,蓝牙就会断开连接,log打印如下图 没有提示出错的行号。我是用的蓝牙传输方式是透传。我查遍了关于nrf52832内存不足的帖子,都没有解决。我去问了技术售后(我买的开发......
  • 嵌入式系统开发中常用的程序例程的简要介绍
    这些例程都是嵌入式系统开发中常用的程序,它们分别属于不同的领域和功能。以下是对这些例程的简要介绍:audio_codec:音频编解码器程序,用于处理音频数据的编码和解码。cherryusb:基于CherryPi的USB设备驱动程序,用于连接USB设备。coremark:一个用于测试处理器性能的基准测试程序......
  • 嵌入式系统开发中常用的程序这些例程的简要介绍和使用示例
    这些例程都是嵌入式系统开发中常用的程序。以下是对这些例程的简要介绍和使用示例:audio_codec:音频编解码器程序,用于处理音频数据的编码和解码。使用示例:#include"audio_codec.h"intmain(){AudioCodeccodec;uint8_tinput[]={0x01,0x02,0x03,0x04};uint8_......
  • MySQL中的slave_exec_mode 参数详解(MySQL从节点复制错误处理时,sql_slave_skip_counter
    原文地址:https://www.soughttech.com/front/article/7159/viewArticle  今天我偶然看到了参数slave_exec_mode。从手册中的描述可以看出,该参数与MySQL复制有关。它是一个可以动态修改的变量。默认为STRICT mode(严格模式),可选值为IDEMPOTENT mode(幂等模式)。设置为IDEMP......
  • gh-ost 报错 ERROR 1236 (HY000): A slave with the same server_uuid/server_id as t
    使用gh-ost 对表在线加索引时,第一次发生了下面的报错(使用gh-ost很长时间了,第一次遇到这个报错):[2023/12/1211:48:08][error]binlogstreamer.go:77closesyncwitherr:ERROR1236(HY000):Aslavewiththesameserver_uuid/server_idasthisslavehasconnectedtoth......
  • ESP8266 01s,连接usb to ttl,结果电脑上不显示串口回应
    ESP826601s,连接usbtottl,结果电脑上不显示串口回应。     ———————————————————————————————————————————————————————————————————————————————————————————————......
  • 瑞萨RA串口打印排障过程
    在参考立创的教程进行电子时钟制作的时候,前期一直未能有效的实现串口日志输出,这里记录下排障过程。电子时钟制作教程:https://www.bilibili.com/video/BV12z4y1J7nQ/?spm_id_from=333.788&vd_source=516eee863e252e452d8dfe7cb01af5321、硬件阶段:参考教程,完成前期的原理图->PCB->......
  • [good]串口读取
    #include<stdio.h>#include<stdlib.h>#include<math.h>#include<limits.h>#include<string.h>#include<windows.h>#include"serialport.h"intmain(){//wordbyteWORD_BYTEwb;wb.word=0x12......
  • 51单片机串口通信
    51单片机串口通信​ 51单片机通过串口与PC通信1.发送一个字符a给PC#include"reg52.h"#include"intrins.h"sfrAUXR=0x8E;voidUartInit(void) //[email protected]{ AUXR=0x1; SCON=0x40;//选择串口工作方式1 TMOD&=0x0F; TMOD|=0x20;//定时器1工作在......