使用 FTDI 电缆不支持 RS485 通信

RS485 communication not supported using FTDI cable

我正在尝试将通过 RS485 半双工 UART 通信的程序移植到 Raspberry Pi。由于 Pi 的内置 UART 不支持 RS485 标准,我使用 the USB-RS485-WE-1800-BT FTDI cable.

连接后,我可以确认电缆的 FTDI 芯片出现在 dmesg 中,ftdi_sio 驱动程序已加载,并正确地将 /dev/ttyUSB0 串行终端暴露给其余的系统。然而,当我尝试从一个简单的 C 程序启用 RS485 模式时:

struct serial_rs485 config = {
  .flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND,
  .delay_rts_before_send = 0,
  .delay_rts_after_send = 0
};
if (ioctl(fd, TIOCSRS485, &config) < 0) {
    fprintf(stderr, "ioctl failed (%d): %s\n", errno, strerror(errno));
    exit(0);
}

...我收到以下错误:

ioctl failed (25): Inappropriate ioctl for device

查看原理图,我意识到 FTDI 电缆内部使用了 2 个组件:

  1. FT232R 芯片,由 ftdi_sio 驱动程序通过 USB 控制并产生常规串行输出,并且
  2. ZT485EEN 芯片,将传统串行通信转换为 RS485。

因此,考虑到 FT232R 在技术上不发射 RS485,我理解为什么它的驱动程序在被要求启用 RS485 模式时抱怨。但它不知道的是,第二个芯片透明地负责格式转换。

对这个主题进行了一些研究并阅读了 的答案后,我现在很好奇如何继续。我是否应该将 ioctl() 调用中的请求 ID 更改为 TIOCSRS485 以外的其他内容?我应该完全删除 ioctl() 调用吗?如果我这样做,如何设置 RS485 标志和 RTS 延迟?最后,如果这意味着在此配置中不需要启用 RS485 模式,那么可以使用 Raspberry Pi 的内置 UART 结合 ZT485EEN 等芯片完全绕过 FTDI 电缆吗?

Should I change the request ID in my ioctl() call to something else than TIOCSRS485? Should I remove the ioctl() call entirely?

在这种情况下删除 ioctl() 是合适的做法,因为串行转换器完全为您处理。对你来说,就是一个读写的串口而已。

And if I do that, how can RS485 flags and RTS delays be set?

您不能使用 FTDI 电缆设置任何标志或延迟。但是,由于电缆输出的数据已经是 RS485,因此无需进行任何设置。只要你正在与之通话的是半双工的(它不会和你同时通话),这就不是问题,你可以像使用 RS232 电缆一样使用它。不过,这取决于您的具体用例。我从来没有遇到过需要RTS延迟的情况。

Finally, if this means that enabling RS485 mode is not required in this configuration, can the FTDI cable be bypassed entirely by using Raspberry Pi's built-in UARTs combined with a chip like ZT485EEN?

当然可以。您还可以使用许多不同型号的 RS485 收发器; Electronics.SE 是询问更多相关信息的地方。您可能需要在那时使用 TIOCSRS485 启用 RS485,但这将取决于驱动程序。我不知道 Pi,但至少在设置 RS485 模式之前我使用过的一些 Atmel 芯片上设置了芯片外围设备中的某个位,自动将 RTS 引脚切换为 enable/disable RS485 收发器;否则,Linux 需要切换 GPIO 才能将收发器设置为正确的状态。

特别是在 FTDI 上,有一些 GPIO 可以设置为在适当的时候变为 on/off。其中之一是 TXDEN 信号,它会自动为您控制收发器。其他用于 Tx/Rx LED。

没有“rs485”模式。忘掉它,一切都会好起来的。 RS485 只是一个电气标准,ZT485 负责从逻辑电平到差分信号的电气转换,然后再返回。您可以将该芯片(或任何等效芯片)直接与 Raspberry PI 上的 UART 引脚一起使用:它们既不是 RS232 也不是 RS485,只是裸露的异步逻辑电平 UART 引脚。您断言 Raspberry PI“不支持”RS485 毫无意义:它也不支持 RS232,而且也不应该支持。这些电气标准需要 translation/interface 级芯片,而“另一端”始终相同:逻辑级异步串行流和控制线。唯一的“陷阱”是选择合适的逻辑电平(3.3V 为 5V - 我不记得 RPI 支持什么)。