我正在尝试将一个通过RS485半双工UART通信的程序移植到Raspberry Pi。由于Pi的内置UART不支持RS485标准,所以我使用的是USB-USB 485-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): %s\n", errno, strerror(errno));
exit(0);
}
..。我得到以下错误:
ioctl failed (25): Inappropriate ioctl for device
看一下原理图,我意识到FTDI电缆内部使用两个组件:
ftdi_sio
驱动程序在USB上控制,并产生常规串行输出。因此,考虑到FT232R在技术上没有发出RS485,我理解为什么它的驱动程序在被要求启用RS485模式时会抱怨。然而,它不知道的是,第二个芯片透明地处理格式转换。
在对这个主题进行了一番研究并阅读了类似的问题的答案之后,我现在很好奇如何继续下去。我是否应该将ioctl()
调用中的请求ID更改为TIOCSRS485
以外的其他内容?我应该完全删除ioctl()
调用吗?如果我这样做,如何设置RS485标志和RTS延迟?最后,如果这意味着在此配置中不需要启用RS485模式,那么是否可以使用Raspberry的内置UART与ZT485EEN等芯片相结合来完全绕过FTDI电缆?
发布于 2020-11-23 20:33:29
我是否应该将
ioctl()
调用中的请求ID更改为TIOCSRS485
以外的其他内容?我应该完全删除ioctl()
调用吗?
在这种情况下,删除ioctl()
是合适的,因为串行转换器完全是为您处理的。就您而言,它只是您读写的一个串行端口。
如果我这样做,如何设置RS485标志和RTS延迟?
不能使用FTDI电缆设置任何标志或延迟。但是,由于从电缆中得到的数据已经是RS485,所以没有必要设置任何内容。只要您正在与之交谈的是半双工(它不与您同时通话),这就不是问题,您可以像使用RS232电缆一样使用它。这取决于您的具体用例。我从未遇到过需要RTS延迟的情况。
最后,如果这意味着在此配置中不需要启用RS485模式,那么是否可以使用Raspberry的内置UART与ZT485EEN等芯片相结合来完全绕过FTDI电缆?
当然,你能做到的。您还可以使用许多不同型号的RS485转译器;Electronics.SE将是要求提供更多有关这方面信息的地方。您可能需要在此使用RS485启用TIOCSRS485
,但这将取决于驱动程序。我不知道Pi,但至少在设置RS485模式之前使用过的一些Atmel芯片上,在芯片的外围设置了一定的位,可以自动切换RTS引脚以启用/禁用RS485传输;否则,Linux需要切换一个GPIO才能将transciever设置为正确的状态。
特别是在FTDI上,有一些GPIOs可以在适当的时候打开/关闭。其中之一是TXDEN信号,它自动为您控制传输。其他的则用于Tx/Rx LED。
发布于 2020-11-23 22:45:55
没有“rs485”模式。算了吧,一切都会好起来的。RS485只是一个电气标准,ZT485完成了从逻辑级到差分信令和反向的电气转换。您可以直接在Raspberry上的UART引脚上使用该芯片(或任何类似的芯片):这些不是RS232或RS485,只是裸露的异步逻辑级别的UART引脚。您关于Raspberry“不支持”RS485的断言是没有意义的:它也不支持RS232,也不应该支持。这些电气标准需要电平转换/接口芯片,而“另一边”总是相同的:逻辑级异步串行流和控制线。唯一的“陷阱”是选择正确的逻辑级别(3.3V是5V -我不直接记住RPI支持什么)。
https://stackoverflow.com/questions/64973041
复制相似问题