web-dev-qa-db-ja.com

Bash、シリアルI / OおよびArduino

だから、私は少し頭を抱えており、解決策に非常に近づいているように感じますが、それはまだまったく機能していません。私の状況は次のとおりです。

私はArduinoマイクロコントローラーで作業しており、(a)Arduinoユニットから出てくるすべてのシリアルデータを標準出力に印刷する2つのBashスクリプト(現在Mac OS X 10.6で実行中)を記述しようとしています。 (b)Arduinoユニットにシリアルデータを送信できるようにします。これらのスクリプトは、Adobe AIRのNativeProcess APIを使用して呼び出され、ArduinoユニットとFlex Adobe AIR アプリケーションとの緊密な統合を可能にします。

私の2つのスクリプトは非常に単純です-

WriteToSerial.shスクリプトは次のとおりです。

echo $1 > $2

(明らかに$ 1は私の文字列で、$ 2はシリアルポートの場所です-現在は/dev/tty.usbserial-A800eIUj)

そして、これが私のReadSerialOutput.shスクリプトです。

tail -f $1

($ 1は私のシリアルポートの場所で、現在は/dev/tty.usbserial-A800eIUjです)

これらのスクリプトのいずれかを呼び出すと(または単にコマンドをBashコンソールに直接入力しても)、コンピューターがハングするだけです-文字を入力できますが、 Ctrl + C プロセスの外。

ただし、Arduino IDEを開いてシリアルモニターをオンにすると、tail -fポート、シリアルモニターを閉じて、「テスト」>シリアルポートをエコーし​​ます。すべて正常に動作します。

これは、Arduino内でシリアルモニターを開くIDEが何らかの理由でシリアルポートを初期化することを示唆しているので、問題なくそれを追跡することができます。 mある種の初期化コマンドの入力に失敗するだけですが、私は何日も高低を検索しており、この問題に対処するものを見つけることができないようです。

解決策は何ですか?

25
Myk

ツールを使用してみてください stty

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

いつものように、上記を適用する前にマンページを読んでください。 creadを使用すると、データを受信できます。フロー制御を使用している場合は、clocalを省略できます。上記の設定がわからない場合は質問してください。より完全な答えを書くことができます。

13
J. Polfer

私も同じ問題を抱えています。私はUbuntu 12.04でArduino Unoを使用しています。数時間の検索と試行の後、Arduinoはresetシリアルデバイスが開かれたときに初めて、しかしシリアルデバイスが再び開いた。

そのため、bashでコマンド-echo "input string">/dev/ttyXXXを実行するとArduinoがリセットされ、送信されます)入力文字列」すぐに。 Arduinoは初期化に時間がかかり、この文字列を受け取るのに十分な速さではありません。 cat/dev/ttyXXXはArduinoもリセットします。

/ dev/ttyXXXが最初にどこかで開かれると、これらのコマンドは機能します。

私の解決策は次のとおりです。

1)/ dev/ttyXXXをファイルの説明3にリダイレクトして/ dev/ttyXXXを開きます

exec 3 <>/dev/ttyXXX

2)Arduinoの初期化を待つ

寝る1

3)Arduinoと通信する

echo "何かを入力してください">&3

猫<&3

4)/ dev/ttyXXXを閉じます

exec 3>&-

29
Yihui Xiong

私もこの問題に苦しみました。片方のつま先に立っている間、/ dev/tty.usbserial-FTF7YNJ5(私の場合)にファイルを接続するstty設定とトリックの終わりを試みませんでした。

それから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
chrism

Linuxでは、ポートを正しく読み書きできるようにするには、setserialを呼び出してシリアルポートオプション(ボーレート、パリティ、フロー制御など)を構成する必要があります。

Mac OS X Bashシステムでこれを行う方法を見つける必要があります。

または、 Python script と書いてこれを行うことができます。

2
J. Polfer

たぶん、serial-1.0に似たシリアルコマンドラインツールを試してみてください。

参照: シリアルポートループバック/デュプレックステスト、BashまたはC?(プロセス置換)

1
dan
0
tilo

Arduinoユニットへのデータの送信/データの受信が、Arduino IDE&シリアルモニター。

さらに、Xcodeに切り替えることで(デバッグ機能などの点で)メリットが得られるかどうかを確認することもできます。

参照: Arduino ATMega328(Duemilanove)へのコンパイルとアップロードのためのXcodeのセットアップ

0
tol

ワンライナー動作する何かreally welldatalogging、and action on data:

  • モニタリング:arduino出力はコンピューターでアクションをトリガーできます
  • data-logging:同時にストリーミングデータをファイルに保存します
  • 未検査? sending-messages:私はまだarduinoにデータを送信しようとしませんでしたが、2番目の例を参照してください。シリアルにメッセージを送信できる可能性がありますいくつかのcmdline utilを介した移植。

次のタイムスタンプと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

0
gskielian

コマンドの最後にアンパサンド(&)を追加して、プロセスをバックグラウンドに入れてみてください。コンソールがハングアップしている場合、それはスクリプトまたはプロセスが現在の端末でまだ実行中であり、プロセスまたはスクリプトが完了するまで何も入力またはクリックできないことを意味します。

また、1つのターミナルウィンドウでコマンドを実行し、新しいターミナルウィンドウ/タブを開いて、そこからテーリングを試みることもできます。

0
bm7150

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マイクロコントローラーと通信する方法を示すもう1つのCocoaサンプルコードは、objective-candarduino(Googleコードでホストされています)です。

0
ceeit