Bash, последовательный ввод / вывод и Arduino - PullRequest
25 голосов
/ 12 октября 2010

Итак, я немного над головой и чувствую, что я очень близок к решению, но оно просто пока не работает. Вот моя ситуация:

Я работаю с микроконтроллером Arduino и пытаюсь написать два сценария Bash (прямо сейчас работающих в Mac OS X 10.6), которые будут (а) печатать все последовательные данные, поступающие из блока Arduino, в стандарт вывод, и (б) позволяют мне отправлять последовательные данные в блок Arduino. Затем эти сценарии будут вызываться с использованием API-интерфейса NativeProcess Adobe AIR, чтобы обеспечить тесную интеграцию между модулем Arduino и приложением Flex Adobe AIR .

Мои два сценария очень просты -

Вот мой скрипт WriteToSerial.sh:

echo $1 > $2

($ 1, очевидно, моя строка, $ 2 - местоположение последовательного порта - в настоящее время /dev/tty.usbserial-A800eIUj)

А вот мой скрипт ReadSerialOutput.sh:

tail -f $1

($ 1 - это местоположение моего последовательного порта, в настоящее время /dev/tty.usbserial-A800eIUj)

Когда я вызываю любой из этих сценариев (или даже если я просто набираю команды непосредственно в консоли Bash), мой компьютер просто зависает - я могу печатать символы, но ничего не происходит, пока я Ctrl + C вне процесса.

Однако, если я открою IDE Arduino и включу Serial Monitor, затем tail -f порт, закройте последовательный монитор, а затем выведите «test»> последовательный порт, все работает просто замечательно.

Это наводит меня на мысль, что открытие Serial Monitor в Arduino IDE каким-то образом инициализирует последовательный порт, что, в свою очередь, позволяет без проблем подключить его. Это, в свою очередь, подсказывает мне, что я просто не могу ввести какую-то команду инициализации. Тем не менее, я искал высоко и низко в течение нескольких дней и не могу найти ничего, что решило бы эту проблему.

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

Ответы [ 10 ]

29 голосов
/ 30 августа 2012

У меня тоже такая же проблема. Я использую Arduino Uno с Ubuntu 12.04. После нескольких часов поиска и попыток я обнаружил, что Arduino сбросит при первом открытии последовательного устройства ,, но не сбросит при повторном открытии последовательного устройства .

Итак, команда run - echo "input string"> / dev / ttyXXX в bash сбросит Arduino и немедленно отправит "input string" . Для инициализации Arduino требуется некоторое время, и он недостаточно быстр для получения этой строки. cat / dev / ttyXXX также сбросит Arduino.

Когда / dev / ttyXXX сначала открывается где-то, эти команды будут работать.

Вот мое решение:

1) открыть / dev / ttyXXX, перенаправив / dev / ttyXXX в описание файла 3

exec 3 <> / dev / ttyXXX

2) дождаться инициализации Arduino

сон 1

3) общаться с Arduino

echo "введите что-то"> & 3

кошка <& 3 </p>

4) закрыть / dev / ttyXXX

exec 3> & -

13 голосов
/ 13 октября 2010

Попробуйте использовать инструмент stty :

stty -F /dev/my_serial_port <baud_rate> cs8 cread clocal

Как всегда, прочитайте man-страницу перед применением вышеуказанного.cread позволяет получать данные.Вы можете пропустить clocal, если вы используете управление потоком.Если вы не уверены, каковы вышеупомянутые настройки, спросите, и я могу написать более полный ответ.

4 голосов
/ 24 апреля 2011

Я также боролся с этой проблемой, пытаясь без конца использовать настройки и приемы, чтобы перебирать мои файлы в /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

2 голосов
/ 13 октября 2010

В Linux вам нужно вызвать setserial, чтобы настроить параметры последовательного порта (скорость передачи, четность, управление потоком и т. Д.), Прежде чем вы сможете правильно читать / записывать порт.

Вам нужно найти способ сделать это с вашей системой Mac OS X Bash.

Или вы могли бы написать скрипт Python для этого.

1 голос
/ 13 октября 2010

Может быть, попробуйте какой-нибудь инструмент для последовательной командной строки, похожий на serial-1.0.

См .: Тестирование петли / дуплекс последовательного порта в Bash или C?(процесс замены)

0 голосов
/ 19 января 2014

Однострочник Что-то, что работает очень хорошо для регистрации данных и работы с данными:

Резюме
  • мониторинг: вывод arduino может запускать действия на компьютере
  • регистрация данных: одновременно сохранять эти потоковые данные в файл
  • не проверено? посылка сообщений: Я еще не пробовал отправлять данные в arduino, но, см. Второй пример, возможно, удастся отправить сообщение на последовательный порт с помощью некоторого утилиты cmdline.

следующие метки времени и отправляет на стандартный вывод

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

0 голосов
/ 15 октября 2010

Существует также инструмент командной строки 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

Еще один фрагмент кода кода Какао, который показываетВы, как разговаривать с микроконтроллером Arduino через последовательное соединение, - target-candarduino (размещено в коде Google).

0 голосов
/ 14 октября 2010

Проверьте, работает ли отправка / получение данных с устройства Arduino с помощью другого приложения, такого как Cornflake (последовательный терминал для Mac OS X) - вместо использования Arduino IDE и последовательного монитора.

Кроме того, вы можете проверить, можете ли вы выиграть от перехода на Xcode (с точки зрения функций отладки и т. Д.).

См .: Настройка Xcode для компиляции и загрузки вArduino ATMega328 (Duemilanove)

0 голосов
/ 13 октября 2010
0 голосов
/ 12 октября 2010

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

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

...