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 делает что-то подобное.
Другие советы по решению проблемы приветствуются!
@eudoxos, 👍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 и когда-нибудь опубликовать несколько примеров.
Вы можете написать свой собственный скрипт Python, который распечатывает полученный последовательный вывод. Используя try/except в цикле, вы можете «приостановить» свой последовательный монитор во время загрузки.
Некоторое время назад я сделал то же самое, используя pyserial
в Linux. Я хотел бы поделиться им, но в данный момент у меня нет доступа к моей другой машине. Я могу опубликовать его позже, если хотите.
Пожалуйста, опубликуйте это, это было бы здорово! Я еще не пробовал, но повторное подключение во время загрузки приведет к сбою; Вы можете справиться с этим или есть просто фиксированное время ожидания после сбоя?, @eudoxos
@eudoxos k, я поищу код. Вы не можете получить доступ к порту двумя процессами одновременно, но вы можете поймать исключение, @Sim Son
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
Прохладный!! На самом деле у меня есть несколько таких адаптеров, это будет решение за 0 долларов :), @eudoxos