#include "modbus_rtu_test.h"
#include "modbus.h"
#include "stdio.h"
#include "string.h"
#include "pcf8574.h"
//#define RS485_RE GET_PIN(G, 8)
#define RS485_RE 6 //(0-7)
#define I2C_BUS "i2c2"
static void test_thread(void *param)
{
uint16_t tab_reg[64] = {0};
modbus_t *ctx = RT_NULL;
int rc; /* 存放modbus函数返回值 */
/*初始化pcf8574*/
pcf8574_device_t dev = RT_NULL;
dev = pcf8574_init(I2C_BUS, RT_NULL);
if (dev == RT_NULL)
{
rt_kprintf("pcf8574 init fail\n");
}
ctx = modbus_new_rtu("/dev/uart2", 115200, 'N', 8, 1);
if (ctx == NULL) {
rt_kprintf("failed to create modbus context");
}
modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS485);
pcf8574_pin_write(dev, RS485_RE, 0);//设置RS485_RE为接收模式
// modbus_rtu_set_rts(ctx, RS485_RE, MODBUS_RTU_RTS_UP);
modbus_set_slave(ctx, 3);
rc=modbus_connect(ctx);
if (rc == -1) {
rt_kprintf("failed to connect to server");
}
modbus_set_response_timeout(ctx, 0, 1000000);
int num = 0;
while (1)
{
memset(tab_reg, 0, 64 * 2);
int regs = modbus_read_registers(ctx, 0, 20, tab_reg);
printf("-------------------------------------------\n");
printf("[%4d][read num = %d]", num, regs);
num++;
int i;
for (i = 0; i < 20; i++)
{
printf("<%#x>", tab_reg[i]);
}
printf("\n");
printf("-------------------------------------------\n");
rt_thread_mdelay(5000);
}
//7-关闭modbus端口
modbus_close(ctx);
//8-释放modbus资源
modbus_free(ctx);
}
static int rtu_test_init(void)
{
// 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;
}
INIT_APP_EXPORT(rtu_test_init);
因为板子的rs485引脚是用pcf8574的p6引脚控制的,所以注释了modbus_rtu_set_rts和rt_pin_mode(RS485_RE, PIN_MODE_OUTPUT)并加了pcf8574的引脚控制,但发现与从机没有数据传输,不知道问题出在哪里。。。
从机设置了20个寄存器后依然不能通信
RS485 没有方向没有控制吗?一直处于接收状态?