开发者社区> 问答> 正文

如何解决Linux和Modbus的错误文件描述符

我试图在运行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或。

展开
收起
祖安文状元 2020-01-08 15:38:48 804 0
1 条回答
写回答
取消 提交回答
  • 有一个非常简单的解决方案来解决您的问题:只需不设置即可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上成功使用了此方法例如,芯片计算机)。

    您可以在其他地方找到有关此问题的更多背景信息:此处和此处。

    2020-01-08 15:38:54
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载