Подтвердить что ты не робот

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 каким-то образом инициализирует последовательный порт, что, в свою очередь, позволяет мне без проблем запускать его. Это, в свою очередь, подсказывает мне, что я просто не могу ввести какую-то команду инициализации. Тем не менее, я искал высоко и низко в течение нескольких дней и, похоже, не нашел ничего, что могло бы решить эту проблему.

Какое решение?

4b9b3361

Ответ 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, чтобы сделать это.

Ответ 6

Попробуйте добавить амперсанд (&) в конец команд, чтобы поместить процесс в фоновом режиме. Если консоль висит, то это означает, что script или процесс все еще запущен на вашем текущем терминале, и вы не сможете вводить или нажимать что-либо до тех пор, пока не будет выполнен процесс или script.

Вы также можете попробовать запустить команду в 1 окне терминала и открыть новое окно терминала/вкладку и попробовать оттуда оттуда.

Ответ 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