如何在不改变任何引脚的情况下在linux中打开串口?

时间:2011-02-23 11:47:48

标签: linux serial-port posix

Posix需要在端口打开时更改RTS引脚。我想要一种避免它的方法。

4 个答案:

答案 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硬件握手了。但您仍然可以通过调用例如:

手动控制RTS握手线的状态
    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")并不要求你做任何事情:)你可能不会收到你期望的数据。