Как открыть последовательный порт в Linux без изменения какого-либо вывода?

Posix требует изменения вывода RTS при открытии порта. Я хочу, чтобы избежать этого.

Ответ 1

Имея ту же проблему, я бы попытался исправить драйвер ядра 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
}

а линия подтверждения связи RTS больше не изменяется при вызове open(). Обратите внимание, что uart, возможно, больше не работает с аппаратным рукопожатием RTS/CTS, если загружен модифицированный драйвер ядра. Однако вы можете управлять состоянием линии квитирования RTS вручную, вызывая, например:

    int opins = TIOCM_RTS;
    ioctl(tty_fd, TIOCMBIC, &opins);

Я проверил это с помощью команды Ctrl+A+G picocom 2.3a, запустив Kubuntu 16.04 64 бит и Ftdi FT2232H на основе usb uart адаптер.

Вы можете найти более подробную информацию по этому разделу здесь.

Ответ 2

Я понятия не имею, почему вы хотите это сделать, но это можно сделать довольно легко, изменив драйвер ядра Linux для вашей последовательной консоли, чтобы он не переключал RTS. Например, для драйвера серии 8250 в drivers/tty/serial/8250/ вы можете изменить каждую запись в регистр MCR (UART_MCR), чтобы гарантировать, что бит 1 (маска UART_MCR_RTS) никогда не устанавливается.

Поскольку он абстрагируется в пользовательском пространстве, вам не повезло, если вы хотите сделать это без изменения драйвера ядра.

Ответ 3

вызов fopen("/dev/ACM0", "r") не требует, чтобы вы ничего делали:) Вы можете не получать данные, которые ожидаете, хотя.