3

Ubuntu 10.04 を実行している BeagleBone と Arduino の間でシリアル経由で通信しようとしています。これまでのところ、文字列は問題なく送信できますが、改行文字の認識に問題があります。

BB 側からは、Python3 で PySerial を使用して、(関連する部分だけを編集しました):

import serial
ser = serial.Serial('/dev/ttyACM0', 9600)

ser.write(chr(13).encode('ascii')) # establishes serial connection 
                                   # which will reset Arduino

delay(3000) # give time for reset. This method is from my own library

mesg = 'Beagle\n'
ser.write(mesg.encode('ascii'))

Arduino側には次のものがあります:

boolean newMsg = false;
String incomingMsg = "";

void setup()
{
   /* some stuff - not relevant */
   Serial.begin(9600);
}

void loop()
{
    if(newMsg) {
        lcd.print(incomingMsg);
        newMsg = false;
    }
}

void serialEvent()
{
    incomingMsg = "";
    while (Serial.available() > 0) {
        char inByte = Serial.read();
        if (inByte == '\n') {
            newMsg = true;
        } else {
            incomingMsg = incomingMsg + inByte;
        }
    }
}

問題は、newMsg が trueif (inByte == '\n')として検証されないため、true に設定されないことです。両側に '\r' と入力可能な文字 ('#') を使用してみましたが、このテストは機能しません。ただし、文字列「Beagle」は問題なく通過するため、問題なくincomingMsg構築されます。

奇妙なことに、これは Arduino と Processing (Bluetooth 経由でラップトップの Processing に接続するロボットの Arduino) の間で機能しています。ここで機能しない理由がわかりません。何かご意見は?

更新:私は部分的な答えを持っていますが、何が壊れているのか知りたいのですが、今のところうまくいきます。

if (inByte == '\n')真であると検証されています。しかし、何らかの理由で、グローバル boolean var への true の割り当てが機能しnewMsgていません。serialEvent() での割り当てにもかかわらず、その値は loop() 内では断固として false のままです。しかし、これはグローバルな var です (ほとんどのプログラマーの嫌悪感にもかかわらず、Arduino ではかなり使用されています)。loop() のテストを次のように置き換えました。

if (messageReceived != "")

そして今それは動作します。しかし、そのブール値の問題が存在する理由を知りたいです。

4

4 に答える 4

4

newMsg は割り込み駆動関数で変更されているため、newMsg を揮発性として宣言する必要がある場合があります。

volatile boolean newMsg = false;

は、値が変更される可能性があり、最適化すべきではないことをコンパイラに通知します。

Arduino揮発性リファレンス

于 2012-05-09T20:02:17.563 に答える
0

Windowsを使用している場合、私はこれを提案します。

私はシリアルを知りませんが、ファイルは知っています:

ser = serial.Serial('/dev/ttyACM0', 9600) # mode = 'w'

読み取りテキストモードでファイルを開く必要があります。一方

ser = serial.Serial('/dev/ttyACM0', 9600, 'wb') # may not be correct

読み取りバイナリモードでファイルオブジェクトを開く必要があります。

例については、open(... mode = ...)をご覧ください。または、オプションとして「w」がどこかにあるかどうかを調べて、「wb」に置き換えることができます。

Windowsでは、テキストファイルIOがposixと互換性を持つように、\rが削除されていると思います。

于 2012-05-08T20:25:12.847 に答える
0

PARITY_ODD/bytesize=serial.SEVENBITS を使用したときにこの問題が発生しました。

ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate=9600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_TWO,
    bytesize=serial.EIGHTBITS
)

正常に動作します。

于 2013-04-18T23:00:05.590 に答える
0

関連するコードがいくつかありません。関数には、すべてのデータが読み取られるまで終了せず、関数を呼び出さないループがserialEvent含まれています。whileloop

于 2012-05-08T20:43:16.187 に答える