Bash, последовательный ввод/вывод и Arduino
Итак, я немного передо мной, и мне кажется, что я очень близок к решению, но он просто не работает. Вот моя ситуация:
Я работаю с микроконтроллером Arduino, и я пытаюсь написать два сценария Bash (сейчас он работает в Mac OS X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X блок к стандартному выходу, и (б) разрешить мне отправлять последовательные данные в блок Arduino. Эти сценарии затем будут вызываться с использованием API Adobe AIR NativeProcess, чтобы обеспечить тесную интеграцию между устройством Arduino и Flex Adobe AIR.
Мои два скрипта очень просты -
Здесь мой WriteToSerial.sh script:
echo $1 > $2
($ 1, очевидно, моя строка, $2 - местоположение последовательного порта - в настоящее время /dev/tty.usbserial-A800eIUj)
И вот мой ReadSerialOutput.sh script:
tail -f $1
($ 1 - это местоположение моего последовательного порта, в настоящее время /dev/tty.usbserial-A800eIUj)
Когда я вызываю любой из этих скриптов (или даже если я просто набираю команды непосредственно в консоли Bash), мой компьютер просто зависает - я могу вводить символы, но ничего не происходит до тех пор, пока я Ctrl + C из процесса.
Однако, если я открою Arduino IDE и включите последовательный монитор, затем tail -f
порт, закройте последовательный монитор, а затем эхо "test" > последовательный порт, все будет отлично.
Это говорит мне о том, что открытие Serial Monitor внутри Arduino IDE каким-то образом инициализирует последовательный порт, что, в свою очередь, позволяет мне без проблем запускать его. Это, в свою очередь, подсказывает мне, что я просто не могу ввести какую-то команду инициализации. Тем не менее, я искал высоко и низко в течение нескольких дней и, похоже, не нашел ничего, что могло бы решить эту проблему.
Какое решение?
Ответы
Ответ 1
Попробуйте использовать инструмент stty:
stty -F /dev/my_serial_port <baud_rate> cs8 cread clocal
Как всегда, прочитайте man-страницу, прежде чем применять вышеописанное. cread
позволяет получать данные. Вы можете опустить clocal
, если используете управление потоком. Если вы не знаете, что такое настройки, спросите, и я могу написать более полный ответ.
Ответ 2
У меня тоже проблема. Я использую Arduino Uno с Ubuntu 12.04. После нескольких часов поиска и поиска я обнаружил, что Arduino будет reset, когда серийное устройство будет открыто в первый раз, но не будет reset, когда серийное устройство снова открывается.
Итак, команда run - echo "input string" > /dev/ttyXXX в bash будет reset Arduino и сразу же отправит "входную строку". Arduino нужно потратить некоторое время на инициализацию и недостаточно быстро получить эту строку. cat/dev/ttyXXX будет reset Arduino тоже.
Когда/dev/ttyXXX открывается где-то во-первых, эти команды будут работать.
Вот мое решение:
1) открыть /dev/ttyXXX путем перенаправления /dev/ttyXXX в описание файла 3
exec 3 < > /dev/ttyXXX
2) дождитесь инициализации Arduino
сон 1
3) общаются с Arduino
echo "input something" > & 3
cat < & 3
4) закрыть /dev/ttyXXX
exec 3 > & -
Ответ 3
Я тоже пытался справиться с этой проблемой, не пытаясь избавиться от устаревших настроек и трюков, чтобы портировать мои файлы в /dev/tty.usbserial-FTF7YNJ5 (в моем случае), стоя на одной носке и т.д.
Затем я сделал ls/dev и заметил /dev/cu.usbserial-FTF7YNJ5 - о, что это? По-видимому, версия "вызывающего устройства" устройства, которая не ожидает или не обеспечивает никакого управления потоком. Сбрасывает байты в порт. Именно то, что мне нужно.
Так просто: cat super_file.bin > /dev/cu.usbserial-XXXXX
Надеюсь, это поможет. И только теперь, когда я знаю ответ, я нашел это: http://stuffthingsandjunk.blogspot.com/2009/03/devcu-vs-devtty-osx-serial-ports.html
Ответ 4
В Linux вам нужно вызвать setserial, чтобы настроить параметры последовательного порта (скорость передачи, контроль четности, управление потоком и т.д.), прежде чем вы сможете правильно читать/записывать порт.
Вам нужно найти способ сделать это с помощью вашей Mac OS X Bash.
Или вы могли бы написать Python script, чтобы сделать это.
Ответ 5
Может быть, попробуйте инструмент последовательной командной строки, похожий на serial-1.0.
Смотрите: Тест шлейфа/дуплексного последовательного порта в Bash или C? (замена процесса)
Ответ 6
Попробуйте добавить амперсанд (&) в конец команд, чтобы поместить процесс в фоновом режиме. Если консоль висит, то это означает, что script или процесс все еще запущен на вашем текущем терминале, и вы не сможете вводить или нажимать что-либо до тех пор, пока не будет выполнен процесс или script.
Вы также можете попробовать запустить команду в 1 окне терминала и открыть новое окно терминала/вкладку и попробовать оттуда оттуда.
Ответ 7
Попробуйте/измените ttyecho:
http://www.humbug.in/2010/utility-to-send-commands-or-data-to-other-terminals-ttypts/
Ответ 8
Проверьте, работает ли отправка данных в/прием данных с устройства Arduino с помощью другого приложения, такого как Cornflake (последовательный терминал для Mac OS X), вместо использования Arduino IDE и последовательного монитора.
Кроме того, вы можете проверить, можете ли вы воспользоваться переключением на Xcode (с точки зрения функций отладки и т.д.).
Смотрите: Настройка Xcode для компиляции и загрузки в Arduino ATMega328 (Duemilanove)
Ответ 9
Также имеется инструмент командной строки Apple SerialPortSample, который позволяет устанавливать произвольные скорости передачи:
// from: SerialPortSample/SerialPortSample.c
// ...
// Starting with Tiger, the IOSSIOSPEED ioctl can be used to set arbitrary baud rates
// other than those specified by POSIX. The driver for the underlying serial hardware
// ultimately determines which baud rates can be used. This ioctl sets both the input
// and output speed.
// ...
Для получения дополнительной информации см. http://www.arduino.cc/playground/Interfacing/Cocoa
Другой фрагмент кода Cocoa, который показывает вам, как разговаривать с микроконтроллером Arduino по последовательному соединению, является объективным - candarduino (размещен в коде Google).
Ответ 10
Один вкладыш Что-то, что работает действительно хорошо для регистрации данных и действует на данные:
Резюме
- мониторинг: выход arduino может запускать действия на компьютере.
- запись данных: одновременно сохраняет данные потоковой передачи в файл
- notchecked? отправные сообщения: Я еще не пробовал отправлять данные в arduino, но см. второй пример, мог бы отправить сообщение в последовательный порт через какой-либо ресурс cmdline.
следующие временные метки и отправляет на stdout
cat /dev/cu.usbmodem1421 | awk '{ for (i=0; i<NF; i++) printf $i + system("echo , `date`")}'
Пример вывода:
![enter image description here]()
Этот метод может быть даже адаптирован для мониторинга и обработки данных в реальном времени:
cat /dev/cu.usbmodem1421 | awk '{ for (i=0; i<NF; i++) printf $i + system("echo , `date`)}'
больше примеров здесь:
https://github.com/gskielian/Arduino-DataLogging/tree/master/Bash-One-Liner