c-不支持使用FTDI电缆进行RS485通信



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

连接后,我可以确认电缆的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): %sn", errno, strerror(errno));
exit(0);
}

我得到以下错误:

ioctl failed (25): Inappropriate ioctl for device

查看示意图,我意识到FTDI电缆内部使用两个组件:

  1. FT232R芯片,由USB上的ftdi_sio驱动器控制,并产生常规串行输出,以及
  2. ZT485EEN芯片,将传统的串行通信转换为RS485

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

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

我应该将ioctl()调用中的请求ID更改为TIOCSRS485以外的其他内容吗?我应该完全删除ioctl()调用吗?

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

如果我这样做,如何设置RS485标志和RTS延迟?

您不能使用FTDI电缆设置任何标志或延迟。然而,由于电缆输出的数据已经是RS485,因此无需设置任何内容。只要你正在通话的是半双工的(它不会和你同时通话(,这就不是问题,你可以像使用RS232电缆一样使用它。这取决于您的具体用例。我从未遇到过RTS延迟的必要性。

最后,如果这意味着在这种配置中不需要启用RS485模式,那么可以通过使用Raspberry Pi的内置UART与ZT485EEN等芯片来完全绕过FTDI电缆吗?

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

特别是在FTDI上,可以设置GPIO,这些GPIO将在适当的时间打开/关闭。其中之一是TXDEN信号,它自动为您控制收发信机。其他用于Tx/Rx LED。

没有"rs485"模式。忘了它,一切都会好起来的。RS485只是一个电气标准,ZT485可以实现从逻辑电平到差分信号的电气转换。您可以将该芯片(或任何等效芯片(直接与复盆子PI上的UART引脚一起使用:这些引脚既不是RS232也不是RS485,只是裸露的异步逻辑级UART引脚。你断言复盆子PI"不支持"RS485是没有意义的:它也不支持RS232,也不应该支持。这些电气标准需要电平转换/接口芯片,而"另一面"总是一样的:逻辑级异步串行流和控制线。唯一的"陷阱"是选择正确的逻辑电平(3.3V就是5V——我不记得RPI支持什么(。

最新更新