本文主要是介绍rt-thread 使用libmodbus-rtu库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
将libmodbus库从软件包里启用, libmodbus是基于select操作的,依赖于文件系统和libc,需要在rt-thread中开启对应的支持。
一开始以为作为主站时,有函数可以自动的指定读取的从站地址的范围,比如设定从从站1读到从站20,找了会没找到,就自己通过动态调用modbus_set_slave(ctx, slaveaddrs);来实现轮询了,这样好处还是挺明显的,灵活性比较大。测试使用的是RS232, 如果是485的话需要指定 modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS232); //改为485
modbus_rtu_set_rts(ctx, RS485_RE, MODBUS_RTU_RTS_UP); //指定485控制引脚和电平
#include “modbus_rtu_test.h”
#include “modbus.h”
#include “stdio.h”
#include “string.h”#include <rtthread.h>
#include <sys/socket.h> /* 使用BSD socket,需要包含socket.h头文件 */
#include <netdb.h>
#include <string.h>
#include <finsh.h>#define RS485_RE GET_PIN(G, 8)static void test_thread(void *param)
{int slaveaddrs = 3;uint16_t tab_reg[64] = {0};modbus_t *ctx = RT_NULL;ctx = modbus_new_rtu("/dev/uart2", 9600, ‘N’, 8, 1);modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS232);//modbus_rtu_set_rts(ctx, RS485_RE, MODBUS_RTU_RTS_UP);modbus_set_slave(ctx, slaveaddrs);modbus_connect(ctx);modbus_set_response_timeout(ctx, 0, 200000); //50msint num = 0;while (1){memset(tab_reg, 0, 64 * 2);int regs = modbus_read_registers(ctx, 0, 20, tab_reg);if (regs == -1){rt_kprintf(“error addrs %d—\n”, slaveaddrs);if(slaveaddrs == 2){slaveaddrs = 3;}else {slaveaddrs = 2;}modbus_set_slave(ctx, slaveaddrs);}else {rt_kprintf("-->addrs %d", slaveaddrs);rt_kprintf("[%4d][read num = %d]", num, regs);num++;int i;for (i = 0; i < 20; i++){rt_kprintf("<%#x>", tab_reg[i]);}rt_kprintf("\n");if(slaveaddrs == 2){slaveaddrs = 3;}else {slaveaddrs = 2;}modbus_set_slave(ctx, slaveaddrs);}rt_thread_mdelay(500);
}
//7-关闭modbus端口
modbus_close(ctx);//8-释放modbus资源
modbus_free(ctx);
}static void rtu77(int argc, char **argv)
{//rt_pin_mode(RS485_RE, PIN_MODE_OUTPUT);rt_thread_t tid;tid = rt_thread_create(“test”,test_thread, RT_NULL,2048,12, 10);if (tid != RT_NULL)rt_thread_startup(tid);return RT_EOK;
}MSH_CMD_EXPORT(rtu77, a rtu test);
这篇关于rt-thread 使用libmodbus-rtu库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!