
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)
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)