Linux qt 怎么建立modbus-rtu协议

Linux qt 怎么建立modbus-rtu协议,第1张

1. 下载qextserialport源码(自己可以百度搜索下载)。

2. 如果是linux下的工程,将该压缩包中的posix_qextserialport,qextserialbase的.cpp以及.h文件加入到工程中,然后在工程中定义一个posix_qextserialport变量(假设变量名为RS232),即可对串口进行 *** 作。

3. 若是在windows下,则将win_qextserialport,qextserialbase的.cpp以及.h文件加入到工程中。

4. 找一个modbus标准协议,将 Modbus CRC的两个表格放在数组中供查询,该表格用于计算CRC校验值。一般 modbus协议规范中会附CRC的计算方法。

5. 在通讯数据组织好后,计算其CRC校验值,放在组织好的通讯数据(假设通讯数据存放在TxData中)的最后,然后RS232->writeData(TxData,Count)。其中writeData是qextserialport定义的函数,Count是要写入的数据量。

千锋扣丁学堂IT为您解答:

LibModbusTest2.pro

#-------------------------------------------------

#

# Project created by QtCreator 2015-04-03T11:38:46

#

#-------------------------------------------------

QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = LibModbusTest2

TEMPLATE = app

SOURCES += main.cpp\

mainwindow.cpp \

libmodbus/modbus.c \

libmodbus/modbus-data.c \

libmodbus/modbus-rtu.c \

libmodbus/modbus-tcp.c

HEADERS += mainwindow.h \

libmodbus/modbus.h \

libmodbus/modbus-private.h \

libmodbus/modbus-rtu.h \

libmodbus/modbus-rtu-private.h \

libmodbus/modbus-tcp.h \

libmodbus/modbus-tcp-private.h \

libmodbus/modbus-version.h \

libmodbus/config.h

LIBS += -Ldll -lws2_32

mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include

#include

#include "libmodbus/modbus.h"

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent)

{

this->resize(200, 60)

this->setWindowTitle("libmodbus slave test")

pbRtu=new QPushButton("以modbus rtu方式读取地址1中前20个寄存器值", this)

pbRtu->resize(200, 30)

pbTcp=new QPushButton("以modbus tcp方式读取地址1中前20个寄存器值", this)

pbRtu->resize(200, 30)

QWidget *w=new QWidget()

QVBoxLayout *layout=new QVBoxLayout()

layout->addWidget(pbRtu)

layout->addWidget(pbTcp)

w->setLayout(layout)

this->setCentralWidget(w)

connect(pbRtu, SIGNAL(clicked()), this, SLOT(doRtuQuery()))

connect(pbTcp, SIGNAL(clicked()), this, SLOT(doTcpQuery()))

}

MainWindow::~MainWindow()

{

}

void MainWindow::doRtuQuery()

{

modbus_t *mb

uint16_t tab_reg[32]={0}

mb = modbus_new_rtu("COM1", 9600, 'N', 8, 1)//相同的端口只能同时打开一个

modbus_set_slave(mb, 1)//设置modbus从机地址

modbus_connect(mb)

struct timeval t

t.tv_sec=0

t.tv_usec=1000000//设置modbus超时时间为1000毫秒

modbus_set_response_timeout(mb, &t)

int regs=modbus_read_registers(mb, 0, 20, tab_reg)

QMessageBox::about(NULL, "报告", QString("Rtu读取寄存器的个数:%1").arg(regs))

modbus_close(mb)

modbus_free(mb)

}

void MainWindow::doTcpQuery()

{

modbus_t *mb

uint16_t tab_reg[32]={0}

mb = modbus_new_tcp("127.0.0.1", 5101)//由于是tcp

client连接,在同一个程序中相同的端口可以连接多次。

modbus_set_slave(mb, 1)//从机地址

modbus_connect(mb)

struct timeval t

t.tv_sec=0

t.tv_usec=1000000//设置modbus超时时间为1000毫秒,注意:经测试,如果没有成功建立tcp连接,则该设置无效。

modbus_set_response_timeout(mb, &t)

int regs=modbus_read_registers(mb, 0, 20, tab_reg)

QMessageBox::about(NULL, "报告", QString("Tcp读取寄存器的个数:%1").arg(regs))

modbus_close(mb)

modbus_free(mb)

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11461069.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存