我试图在运行Raspian Buster的Raspberry Pi和FTDI USB到串行适配器上,使用libmodbus设置半双工RS-485通信。运行ls / dev /时,我的FTDI适配器显示为ttyUSB0。
我尝试了以下示例代码:
#include <modbus.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main(void) {
modbus_t *ctx = modbus_new_rtu("/dev/ttyUSB0", 19200, 'N', 8, 1);
if (ctx == NULL) {
fprintf(stderr, "Unable to create the libmodbus context\n");
return 0;
}
if (modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS485) == -1) {
fprintf(stderr, "Error setting the serial port as RS-485\n");
fprintf(stderr, "errno: %d\n (EBADF == 9)", errno);
modbus_free(ctx);
return 0;
}
}
与编译gcc test1.c -I/usr/include/modbus -lmodbus。而且,即使我使用来运行此代码,我也会得到errnoas 9或。
有一个非常简单的解决方案来解决您的问题:只需不设置即可MODBUS_RTU_RS485,很可能您不需要它。
对于没有自动(硬件)方向控制的设备,此模式实际上是一种解决方法。如您所知,Modbus RTU在半双工RS485链路上工作(仅允许一个设备通话,而其他所有设备只能通话),因此需要附加的(对RX和TX)信号来控制向哪个设备写入数据总线始终(方向控制)。
因此,仅MODBUS_RTU_RS485在您的设备缺少此功能时才需要进行设置,而这在如今已经不太可能,或者您正在构建自己的收发器时。特别是,大多数基于FTDI芯片的设备都应具有此功能,因为该芯片本身具有TXDEN(发送使能)引脚。有关更多详细信息和将TXDEN信号暴露给非默认引脚的技巧,请参见此处。
当您没有此功能时(一种常见的情况是,您想通过RS485将Rpi上的嵌入式UART用于Modbus,实现自己的收发器),则需要一种软件(或硬件)解决方法。这就是MODBUS_RTU_RS485应该方便的地方,重新调整了RTS流量控制信号的用途。不幸的是,大多数串行驱动程序(包括ftdi_sio您可能正在使用的驱动程序)都不支持该模式(再次参考上面的链接)。
幸运的是,有一些解决方法,请参见此处以获取完整的讨论。您也可以看一下这个答案,在这里我解释了如何设置libmodbus并支持使用Rpi上的GPIO引脚切换总线方向(也适用于大多数SBC,我已经在Pocket上成功使用了此方法例如,芯片计算机)。
您可以在其他地方找到有关此问题的更多背景信息:此处和此处。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。