Но когда я читаю ответ, он всегда включает отправленную мною строку.
Поскольку ваша конфигурация termios уничтожила атрибуты локального эха, и вы отправляете команду AT модема, попробуйте отправить команду ATE0
, чтобы отключить эхо-сигнал от модема.
Я не испытываю этой проблемы при использовании экрана.
Это наблюдение подтверждает, что на подключенном модеме включено эхо.
Команда AT отображается (по модему) при вводе, но вы не возражаете против полученных данных в этой ситуации (потому что хотите увидеть, что вы печатаете).
Если модемне было включено эхо, тогда вы бы жаловались, что то, что вы вводите на экране , не было видно .
IOW эхо требуется при использовании программы эмулятора терминала (например, экрана )), но эхо должно быть отключено при отправке данных программой.
Каков наилучший способ чтения из UART в C с использованием Linux?
(Технически вы не читаете из "UART" , а скорее из последовательного терминала, который полностью буферизует весь ввод и вывод.)
Код, соответствующий POSIXстандартный, как описано в Правильная настройка режимов работы терминала и Руководство по последовательному программированию для операционных систем POSIX было бы намного лучше, чем у вас сейчас.
Я удивлен, что это работает вообще(например, CREAD не включен).
Может ли мультиплексный способ (с использованием select) вызывать проблемы?
Не «эхо» «проблема».
Ваша программане выполняет ничего, требующего использования select () и неблокирующего режима.
Кроме того, иногда я ничего не читаю.
Когда выписать код, который не совместим с POSIX, не следует ожидать надежного поведения программы.