SuperView FlyThingsOS 智能显示屏上移植modbus协议支持串口RTU功能
程序员文章站
2022-07-09 15:22:16
...
SuperView 串口屏 运行的操作系统是中科世为基于Linux 开发的FlyThings OS;系统提供集成GUI开发环境,方便客户快速开发应用。
官网链接: www.zkswe.com ;
开发者页面:doc.zkswe.com;
modbus开源代码下载
可从github上下载libmodbus源码,然后先按照github说明完成configure ;
当然也可以下载我们配置好的第三方库文件:
https://github.com/zkswe/thirdPart/tree/master/libmodbus
将代码放入jni目录下的modbus目录:
* 注意新建项目后,系统默认打开的是串口模式,需要在main.cpp 里面注释掉串口的启动部分
void onEasyUIInit(EasyUIContext *pContext) {
// 初始化时打开串口
// modbus 注释掉串口应用
//UARTCONTEXT->openUart(CONFIGMANAGER->getUartName().c_str(), CONFIGMANAGER->getUartBaudRate());
}
void onEasyUIDeinit(EasyUIContext *pContext) {
// modbus 注释掉串口应用
//UARTCONTEXT->closeUart();
}
const char* onStartupApp(EasyUIContext *pContext) {
return "mainActivity";
}
libmodbus RTU的接口介绍
modbus 上下文: modbus_t
通过modbus_t 可以操作写入,读取等操作。
1.新建一个modbus_t的上下文,在mainLogic.cc 里面添加如下代码:
#include "modbus/modbus.h"
modbus_t* mctx;
在onUI_init() 里面添加mctx的初始化:
static void onUI_init(){
//Tips :添加 UI初始化的显示代码到这里,如:mText1->setText("123");
mctx = modbus_new_rtu("/dev/ttyS1", 9600, 'N', 8, 1); // Z11s平台为ttyS1,Z6s平台为ttyS2; 9600波特率,无校验,8数据位,1停止位;
modbus_set_slave(mctx, 1); // 设置从设备地址为1
modbus_connect(mctx); // 链接
modbus_set_byte_timeout(mctx, 5,0); // 设置数据超时为5秒,0 us
}
modbus_new_rtu:建立一个modbus RTU链接
modbus_set_slave:设置slave的设备地址
modbus_connect:modbus 链接
modbus_set_byte_timeout:设置modbus超时
写数据
modbus_write_register 如果需要切换设备地址,需要先调用 modbus_set_slave;
读数据
modbus_read_registers 如果需要切换设备地址,需要先调用 modbus_set_slave
样例程序:
static bool onButtonClick_ButtonRead(ZKButton *pButton) {
LOGD(" ButtonClick ButtonRead !!!\n");
addr = atoi(mEdittextAddrPtr->getText().c_str());
reg = atoi(mEdittextRegPtr->getText().c_str());
modbus_set_slave(mctx, addr);
UINT16 buff[2]={0};
int ret = modbus_read_registers(mctx, reg,1, buff);
LOGD("read ret %d buff %x,%x",ret,buff[0],buff[1]);
mEdittextDataPtr->setText((int)buff[0]);
return true;
}
static bool onButtonClick_ButtonWrite(ZKButton *pButton) {
//LOGD(" ButtonClick ButtonWrite !!!\n");
addr = atoi(mEdittextAddrPtr->getText().c_str());
reg = atoi(mEdittextRegPtr->getText().c_str());
data = atoi(mEdittextDataPtr->getText().c_str());
modbus_set_slave(mctx, addr);
modbus_write_register(mctx, reg, data);
return true;
}
RTU测试工具界面:
终端显示界面