Serial monitor терминала только для чтения без блокировки последовательного порта для загрузки скетча

Я хотел бы, чтобы весь последовательный вывод Arduino (nano) выводился на терминал в Linux, не блокируя последовательный порт для загрузки новой версии скетча (для быстрого цикла отладки) при использовании Arduino-Makefile:

[Errno 16] could not open port /dev/ttyUSB0: [Errno 16] Device or resource busy: '/dev/ttyUSB0'

Что-то уже сделано для этого? Я прочитал около 10 связанных вопросов здесь и в других местах (используя screen, socat и другие), но ни один из них не касается вопроса, как не блокировать порт.

В конечном итоге я мог бы написать что-то на Python, которое будет отключаться при получении сигнала и снова подключаться через несколько секунд (я использую собственный Makefile для загрузки), и я полагаю, что последовательный монитор Arduino IDE делает что-то подобное.

Другие советы по решению проблемы приветствуются!

, 👍2


2 ответа


Лучший ответ:

2

(используя screen, socat и другие), но ни один из них не занимается вопросом, как не блокировать порт.

Другие советы по решению проблемы приветствуются!

Я говорю:

Практически все аппаратные проблемы можно решить с помощью программного обеспечения. Но иногда программную проблему за 50 000 долларов можно решить с помощью аппаратного решения за 2 доллара.

Это один из таких случаев. Купить CP2102 6-контактный последовательный USB-адаптер UART для < 2 доллара на Ebay или для < 10 долларов на Amazon, чтобы предоставить второй последовательный интерфейс для того же Arduino (оба подключены к одному и тому же аппаратному UART, встроенному в микроконтроллер ATmega328 Arduino). Пусть основной последовательный интерфейс USB обрабатывает загрузку кода в Arduino. Пусть этот второй внешний UART обрабатывает ТОЛЬКО ДЛЯ ЧТЕНИЯ от Arduino!

Подключите его:

Arduino     CP2102 USB 6-pin UART
-------     ---------------------
Tx          Rx
GND         GND

Готово. НЕ подключайте CP2102 Tx ни к чему.

Теперь используйте screen или мой грубый последовательный терминал Python для регистрации данных, который я написал здесь (eRCaGuy_PyTerm) , или второй экземпляр Arduino IDE с последовательным монитором, или любой другой последовательный терминал, если на то пошло, для чтения с CP2102, пока встроенный USB-адаптер Arduino выполняет загрузку кода.

Два последовательных интерфейса с одними и теми же выводами на Arduino: один выполняет Tx/Rx к/от Arduino, а другой только Rx для чтения из Arduino.

Я постоянно использую 2-й UART как этот трюк, чтобы позволить мне считывать данные с Arduino в один последовательный монитор в одном экземпляре Arduino IDE, чтобы я мог см. цифры, и я использую внешний USB-адаптер CP2101 для считывания тех же данных с Arduino на последовательный плоттер другого экземпляра Arduino IDE. так что я могу видеть графики в реальном времени!

Удивительно, как хорошо это работает. Быстрый взлом. Простое решение.


Примечание. Чтобы использовать мой последовательный терминал Python eRCaGuy_PyTerm, сначала установите все параметры последовательного порта в user_config.py. , затем запустите python3 serial_terminal.py, чтобы запустить программу. Это двухсторонний последовательный терминал, с регистрацией данных. Это работает очень хорошо. Я действительно должен улучшить его файл readme и когда-нибудь опубликовать несколько примеров.

,

Прохладный!! На самом деле у меня есть несколько таких адаптеров, это будет решение за 0 долларов :), @eudoxos


1

Вы можете написать свой собственный скрипт Python, который распечатывает полученный последовательный вывод. Используя try/except в цикле, вы можете «приостановить» свой последовательный монитор во время загрузки.

Некоторое время назад я сделал то же самое, используя pyserial в Linux. Я хотел бы поделиться им, но в данный момент у меня нет доступа к моей другой машине. Я могу опубликовать его позже, если хотите.

,

Пожалуйста, опубликуйте это, это было бы здорово! Я еще не пробовал, но повторное подключение во время загрузки приведет к сбою; Вы можете справиться с этим или есть просто фиксированное время ожидания после сбоя?, @eudoxos

@eudoxos k, я поищу код. Вы не можете получить доступ к порту двумя процессами одновременно, но вы можете поймать исключение, @Sim Son