我认为,从硬件方面详细阐述罗德尼的答案可能会为将来面临类似问题的其他人增加一些价值。
虽然我来这里是为了寻找线程问题的答案(为什么我得到了一个ioctl尝试在 pyserial 上激活 RS485 模式时出错(我实际上是从 pyModbus 调用的)我找到了上面问题的答案。简单明了,并提供比罗德尼更简短的答案:你不能。您将无法在 FTDI 上激活 RS485 模式,因为没有功能使用 RTS 信号作为 RS485 芯片的驱动使能。
某些设备,例如使用atmel_串行驱动程序确实实现了此功能,但您不会发现那么多。深入研究这个问题,您会发现人们说您可以基于支持 RS485 模式的驱动程序之一编写自己的驱动程序(例如,请参阅:自动更改 RS-485 通信的 RTS https://stackoverflow.com/questions/25250731/automatically-changing-rts-for-rs-485-communication,但在我看来他们是错误的)
现在您有了坏消息,您可以问自己为什么需要使用 RS485 模式?我想像我一样,您正在尝试使用两线 RS485 设置在两个设备之间建立半双工链路(这在许多具有主从配置的工业设备中非常频繁,其中一侧发送数据请求,另一方及时响应,就像使用 Modbus 一样)。
如果您正在寻找软件解决方案,您仍然可以在开始传输之前和完成传输之后手动将 RTS 信号设置为高电平和低电平。该解决方案适用于测试,并且在大多数环境中只是为了好玩(至少在我尝试过的环境中,它甚至可以在 Raspberry Pi 上使用 Python 使用 GPIO 线来控制驱动器启用/〜读取启用信号),但我不会使用它如果你想获得良好的可靠性。对于任何非实时操作系统,都不能保证您将获得正确的计时,并且某些设备非常挑剔,并且会报告timeout错误。如果您可以自由选择巴士的两侧(如果您有两个以上的车站,则选择全部),您可以随时增加tiemout到处都希望有最好的结果。
好消息是,正如 Rodney 所说,在 FTDI 芯片上,引脚 13 上有 TXDEN 信号,因此您可以立即使用它。不幸的是,最便宜的 USB 转串口
适配器 PCB 板上无法轻松访问该信号。我的 Sparkfun 主板就是这样。如果您不愿意接受将电缆直接连接到 SMD IC 的挑战,您可以执行我所做的操作:从 FTDI 下载 mprog 3.5,连接到 EPROM,在 I/O Controls 下选择 TXDEN 而不是 TXLED,然后单击“保存”进行写入更新固件到芯片。然后,您可以轻松地将电缆连接到 LED 焊盘并将其用作驱动启用/~读取启用信号(参见图片,示波器快照显示它工作良好)。
修改后的 FTDI 板,TXLED 上带有 TXDEN 信号 https://i.stack.imgur.com/A21Fq.jpg
修改后电路的示波器捕获:蓝色是 TX,黄色是 TXDEN https://i.stack.imgur.com/otZw2.jpg
最后,如果您不幸遇到其他没有此选项 (TXDEN) 的芯片,例如 PL2303,您可以始终采用老方法并使用 555 定时器构建硬件 TXDEN(请参阅此处:http://www.embeddedsys.com/subpages/resources/images/documents/microsys_art_RS485.pdf http://www.embeddedsys.com/subpages/resources/images/documents/microsys_art_RS485.pdf)。我测试了这个电路,它工作正常,至少在 9600 bps 下(请注意,我必须使用 39K 电阻器而不是 3.9K,我认为这是一个拼写错误,但我可能是错的,我没有详细说明,我只是需要一些快速而肮脏的东西来与我的 FTDI 配对。