QT技巧系列(8) QModbus发送汉字字符串的方法

QT技巧系列(8) QModbus发送汉字字符串的方法

 

Modbus 协议简介

  Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。

  此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。

  当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。

 

我们直接用QModbus类,包含文件:

#include <QModbusRtuSerialMaster>

#include <QModbusDataUnit>

#include <QModbusTcpClient>

 

汉字字符串解析及转换发送的代码:

 

void shortInfoThread::on_writeTor(QString tin)
{
    if (!modbusDevice)
        return;


   QByteArray str1 =tin.toUtf8().data();
   int cnt = str1.size();
   int tsize =0;
   if (cnt % 2 == 0)
   {
   tsize =cnt /2 +1;
   }else
   tsize =cnt /2 +2;


    QModbusDataUnit writeUnit = QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 800, tsize); 



    //每2BYTE组成赋值给寄存器
    for (int i=0; i< tsize -1; ++i)
    {
        ushort num =0;
        if ((2*i+1) < str1.size()){
        num = ((str1[2*i+1]) & 0x000000FF);
        }else num =0;

        num  |= (str1[2*i] << 8) & 0x0000FF00;

         writeUnit.setValue(i,num);
    }
    writeUnit.setValue(tsize-1,0);

    if (auto *reply = modbusDevice->sendWriteRequest(writeUnit, 255)) { //1->modbus 地址
        if (!reply->isFinished()) {
            connect(reply, &QModbusReply::finished, this, [this, reply]() {
                if (reply->error() == QModbusDevice::ProtocolError)
                {

                    emit statusBar(tr("Write response error: %1 (Mobus exception: 0x%2)")
                                                          .arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16));
                } else if (reply->error() != QModbusDevice::NoError)
                {

                    emit statusBar(tr("Write response error: %1 (code: 0x%2)").
                                                  arg(reply->errorString()).arg(reply->error(), -1, 16));
                }

                qDebug()<<"write sucess!";
                reply->deleteLater();
            });
        } else {
            // broadcast replies return immediately
            reply->deleteLater();
        }
    } else {

        emit statusBar(tr("Write error: ") + modbusDevice->errorString());
    }

}

 

这是项目中实际代码,仅供参考。


注:实战示例,解疑答惑。

           --不间端地思考,实时地批判你的工作!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT作为一个功能强大的跨平台应用程序开发框架,不仅可以进行GUI开发,也可以进行串口通信。串口通信在很多项目中都非常常见,其中一个重要的应用是将数字字符串发送到控制板上。 首先,需要安装QT中的串口通信组件,可以在QT Creator中通过“Qt Creator”->“Preferences”->“Kits”->“Desktop Qt”->“Versions”->“Auto-detected”->“Details”中找到“Serial Port”组件并勾选。安装完成后,在QT Creator的左侧工具栏中会出现串口组件。 接下来,可以创建一个新的QT窗口应用程序,并向其添加一个按钮。当用户单击按钮时,应用程序将向控制板发送一个数字字符串。 在按钮单击事件的槽函数中,首先需要定义一个串口对象。例如: ``` QSerialPort *serialport=new QSerialPort(this); serialport->setPortName(portname); serialport->setBaudRate(baudrate); serialport->setDataBits(dataBits); serialport->setParity(parity); serialport->setStopBits(stopBits); ``` 其中,portname是指串口的名称,例如“COM1”或“/dev/ttyUSB0”;baudrate是指波特率;dataBits是指数据位的个数;parity是指校验方式;stopBits是指停止位的个数。 接着,需要打开串口: ``` if(serialport->open(QIODevice::ReadWrite)) { //串口打开成功 } else { //串口打开失败 } ``` 在串口打开成功的情况下,可以将数字字符串转换为字节数组,并写入串口: ``` QString str="12345"; QByteArray data=str.toLatin1(); serialport->write(data); ``` 最后,需要关闭串口: ``` serialport->clear(); serialport->close(); ``` 通过上述步骤,可以在QT中轻松地实现串口发送数字字符串的功能。需要注意的是,串口通信存在很多的参数设置,需要根据具体情况进行调整。同时,在进行串口通信时,还需要考虑到错误处理、超时设置等问题,以确保数据的可靠性和正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值