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

vit*_*.ch 14 linux posix serial-port

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

小智 6

我不知道你为什么要这样做,但这可以很容易地通过修改串行控制台的linux内核驱动程序来完成,因此它不会切换RTS.例如,对于8250系列驱动程序,drivers/tty/serial/8250/您可以更改每次写入MCR寄存器(UART_MCR)以确保从未设置位1(屏蔽为UART_MCR_RTS).

由于它是在用户空间中抽象出来的,如果你想在不修改内核驱动程序的情况下这样做,那你就不走运了.

  • "我不知道你为什么要这样做" - >嵌入式引导加载程序通常将RTS连接到复位引脚并将DTR连接到引导加载程序选择引脚(反之亦然).如果复位引脚切换,即使只有几分之一微秒,芯片也会复位.这意味着如果您还使用串行端口与设备进行一般通信,则不容易使用控制线...而不是先断开控制线:( (3认同)
  • "如果不修改内核就不可能"是一个非常好的答案.谢谢. (2认同)

Joe*_*Joe 4

遇到同样的问题,我会通过修补内核驱动程序来尝试一下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
}
Run Code Online (Sandbox Code Playgroud)

并且 RTS 握手线不再在open()调用时更改。请注意,只要加载了修改后的内核驱动程序,uart 可能就不再与 RTS/CTS 硬件握手一起工作。但您仍然可以通过调用以下命令手动控制 RTS 握手线的状态:

    int opins = TIOCM_RTS;
    ioctl(tty_fd, TIOCMBIC, &opins);
Run Code Online (Sandbox Code Playgroud)

我使用Ctrl+A+Gpicocom 2.3a 的命令对此进行了测试,运行 Kubuntu 16.04 64 位和基于Ftdi FT2232H的 USB uart 适配器。

您可能会在此处找到有关此主题的更多详细信息。