1

Arduino を使用してデータを Pachube に投稿するときに問題が発生します。Arduino は、「t」を送信すると温度の JSON データを返し、「l」を送信すると光レベルの JSON データを返すように構成されています。これは、Arduino シリアル モニターを介して完全に機能します。次に、2 つの bash スクリプトを作成しました。1 つは定期的に 't' および 'l' コマンドを Arduino に送信し、各要求の間に 10 秒間待機します。

while true; do
    echo -n t > /dev/ttyACM0
    echo "$(date): Queried Arduino for temperature."
    sleep 10
    echo -n l > /dev/ttyACM0
    echo "$(date): Queried Arduino for light."
    sleep 10
done

これはうまくいきます。10 秒ごとにエコー メッセージが表示されます。もう 1 つのスクリプトは、生成された JSON をシリアル ポートから読み取ります (基本的には、Web ページからコピーしました)。

ARDUINO_PORT=/dev/ttyACM0
ARDUINO_SPEED=9600
API_KEY='MY_PACHUBE_KEY'
FEED_ID='MY_FEED_ID'

# Set speed for usb
stty -F $ARDUINO_PORT ispeed $ARDUINO_SPEED ospeed $ARDUINO_SPEED raw
exec 6<$ARDUINO_PORT

# Read data from Arduino
while read -u 6 f ;do
    # Remove trailing carriage return character added
    # by println to satisfy stupid MS-DOS Computers
    f=${f:0:${#f} - 1}

    curl --request PUT --header "X-PachubeApiKey: $API_KEY" --data-binary "{ \"version\":\"1.0.0\", \"datastreams\":[ $f ] }" "http://api.pachube.com/v2/feeds/MY_FEED_ID"
    echo "$(date) $f was read."
done

残念なことに、このスクリプトは 10 秒ごとに数回、Pachube にデータを投稿したことを伝えるエコー メッセージでおかしくなります (最初のスクリプトが Arduino に JSON メッセージを作成するように指示したときはいつでも)。Arduinoのバッファリングされたメッセージに問題があるのではないかと思いましたが、電源を切って入れ直しても問題は残ります。何かご意見は?前もって感謝します。

4

1 に答える 1

1

私はArduinoとあなたがここで行っている他のいくつかのことには完全に慣れていませんが、私が目にするいくつかの一般的なことは次のとおりです。

  • Bash は、バイナリ データを確実に処理することがほとんどできません。NUL バイトを Bash 文字列に格納する方法はありません。任意のデータを読み取り可能にするために、いくつかの策略を講じようとしているようです。うまくいけば、文字データだけを に送信します。readそうしないと、うまくいかない可能性があります。

  • read-d改行で区切られた入力 (またはbash が十分に新しい場合は指定された値) を読み取ります。while ループが読み取っている形式はわかりませんが、改行で区切られた文字列でなければなりません。

  • read -rエスケープ シーケンスを解釈する必要がない場合に使用します。(ほとんどの場合、 が必要です-rread

  • 各文字列の末尾から無条件に文字を取り除くことは、最善ではありません。f の末尾からf=${f%+($'\r')}1 つ以上の隣接する 's を削除します。これがデフォルトでない場合は、スクリプトの先頭にあることを\r忘れないでください。shopt -s extglob

  • これによって実際に問題が発生することはありませんが、exec本当に必要な場合を除き、使用しないことをお勧めします (ここにはありません)。done <$ARDUINO_PORTループを終了して引数whileを削除するだけです(ループ内の何かが特にstdinから読み取っていて、競合できない場合を除きますが、そうではないようです)。開いている FD は、ループを抜けると自動的に閉じます。-u 6read

  • スクリプトで独自のすべて大文字の変数名を作成しないでください。それらは予約されており、環境の変数と競合する可能性があるためです。少なくとも 1 つの小文字を使用してください。これらの変数がシステム内の何かによって設定されていて、それらを使用または変更しているだけの場合、これはもちろん当てはまりません。

于 2012-04-16T12:47:27.080 に答える