Posix需要在端口打开时更改RTS引脚。我想要一种避免它的方法。
答案 0 :(得分:6)
我不知道您为什么要这样做,但这可以通过修改串行控制台的Linux内核驱动程序来轻松完成,因此它不会切换RTS。例如,对于drivers/tty/serial/8250/
中的8250系列驱动程序,您可以更改每次写入MCR寄存器(UART_MCR)以确保从未设置位1(掩码为UART_MCR_RTS)。
由于它是在用户空间中抽象出来的,如果你想在不修改内核驱动程序的情况下这样做,那你就不走运了。
答案 1 :(得分:3)
遇到同样的问题,我会通过修补ftdi_sio
内核驱动程序来试一试。您只需要在ftdi_dtr_rts()
中取消注释一小段代码,如下所示:
static void ftdi_dtr_rts(struct usb_serial_port *port, int on) {
...
/* drop RTS and DTR */
if (on)
set_mctrl(port, TIOCM_DTR /*| TIOCM_RTS*/); // <<-- HERE
else
clear_mctrl(port, TIOCM_DTR /*| TIOCM_RTS*/); // <<-- and HERE
}
并且在open()
调用时不再更改RTS握手线。
注意,只要你的修改后的内核驱动程序被加载,uart就可能不再使用RTS / CTS硬件握手了。但您仍然可以通过调用例如:
int opins = TIOCM_RTS;
ioctl(tty_fd, TIOCMBIC, &opins);
我使用picocom 2.3a的Ctrl+A+G
命令测试了这个,运行Kubuntu 16.04 64位和基于Ftdi FT2232H的usb uart适配器。
您可以找到有关此主题的更多详细信息here。
答案 2 :(得分:1)
(最终)使用命令行可以避免DTR引脚发生变化
stty -F /dev/ttyUSB0 -hupcl
这具有使DTR打开的效果;随后打开和关闭端口时,DTR不受影响。
来源:https://raspberrypi.stackexchange.com/questions/9695/disable-dtr-on-ttyusb0/27706#27706
那里有代码可以通过termios
从python进行相同的操作,这可以在通过pyserial打开端口之前完成:
import termios
path = '/dev/ttyACM0'
# Disable reset after hangup
with open(path) as f:
attrs = termios.tcgetattr(f)
attrs[2] = attrs[2] & ~termios.HUPCL
termios.tcsetattr(f, termios.TCSAFLUSH, attrs)
OP在Raspberry Pi上执行此操作,但我只是在x86_64的Linux Mint上进行了尝试,它确实有效。我不知道RTS如何受到影响。
我觉得这个有用的原因是为了与Arduino Nano通讯-板载USB->串行芯片-通常,每次从Linux打开串行端口时,Arduino都会重置(DTR的上升沿导致重启)。对于某些应用程序来说,这不是问题,但对于其他应用程序而言,避免这种情况显然是有用的,并且要从连接DTR到重置的Arduino上移除小电容并非易事。
执行stty命令时(插入USB电缆后),您仍将获得一次重置。但是,至少在此之后您可以继续打开和关闭串行端口,而无需进行进一步的重置。
答案 3 :(得分:-2)
调用fopen("/dev/ACM0", "r")
并不要求你做任何事情:)你可能不会收到你期望的数据。