2012-05-08 21 views
3

私はUbuntu 10.04を実行しているBeagleBoneとArduinoの間でシリアル経由で通信しようとしています。これまでのところ、文字列を送信することはできますが、改行文字の認識に問題があります。 、のpython3とPySerialを使用して、私は(ちょうど関連ビットのために編集)しているBB側からシリアル通信PythonとArduino - キャリッジリターンを認識できない

:アルドゥイーノ側で

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')) 

私が持っている:

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; 
     } 
    } 
} 

問題ですif (inByte == '\n')が本当に真であると検証されないため、newMsgはtrueに設定されません。私は両方の側で '\ r'とタイプ可能な文字( '#')でしようとしましたが、このテストは決してうまくいきません。文字列「ビーグル」はそれをうまく通り抜けます。だから、incomingMsgは大丈夫です。

奇妙なことに、私はこれをArduinoとProcessing(Bluetooth経由でノートパソコンの処理に接続するロボットのArduino)との間で動作させています。なぜ私はここで働いていないのか分かりません。何かご意見は?

UPDATE:私は部分的な回答がありますが、現在はうまくいくでしょうが、何が壊れているかを知りたいのですが。

if (inByte == '\n')が真であると検証されています。しかし、なんらかの理由でグローバルブール変数newMsgにtrueを代入しても機能しません。 serialEvent()での代入にもかかわらず、その値はlo​​op()内では断然偽のままです。しかし、それはグローバル変数です(ほとんどのプログラマーの嫌悪にもかかわらず、Arduinoでかなり使用されています)。私はloop()のテストを次のように置き換えました:

if (messageReceived != "") 

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

+1

LCDに各文字を表示しようとしましたが、あなたはあなたが得るべきだと思っていますか? – Craig

+0

うん、それを試してみました。そしてyes - カーソルが1行下がったので、改行は間違いなく到着しました:...( –

答えて

0

Windowsを使用している場合、私はこのことを提案する:

私はシリアル知っdonnotが、私は、ファイルを知っている:

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

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

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

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

例としてopen(... mode = ...)を見てください。または、あなたが 'wb'で置き換えることができるオプションとしてどこかに 'w'があるかどうか見てください。

テキストファイルIOがposixと互換性があるようにwindows \ r下に削除されていると思います。

+0

その行はファイルを書いていないシリアルオブジェクトをインスタンス化しているので、括弧内の項目はコンストラクタのパラメータです。 'option。 –

+0

これを試してください:.encode(' ascii ')を.encode(' hex ')に置き換え、Serial.read()。decode(' hex ')(または16進ではなくbase64)を調整してください。 – User

+0

serBasic:31:error: 'int'型ではない 'Serial.HardwareSerial :: read()'にメンバー 'decode'のリクエストがあります –

0

関連するコードがありません。関数serialEventには、すべてのデータが読み込まれ、loop関数が呼び出されるまで終了しないwhileループが含まれています。newMsg以来

+0

いいえ、該当するコードがありません。それがArduinoの仕組みです。自動的にloop()関数を実行します。 serialEvent()関数は、シリアルポートにデータが到着するたびに自動的に呼び出されます。したがって、loop()が実行され、データが到着したときにserialEvent()にポップしてから、loop()に戻ります。その部分は機能します! loop()関数で 'if(newMsg)'テストを削除した場合は、着信文字列を問題なく出力します。キャリッジリターンを認識しないことだけです。 –

4

あなたは揮発性としてnewMsgを宣言する必要があるかもしれない割り込み駆動機能に変更されている:

volatile boolean newMsg = false; 

ザ・値は変更される可能性があり、コンパイラに通知し、それはそれを最適化するべきではありません。私はPARITY_ODD /バイトサイズ= serial.SEVENBITS を使用したとき、私はそれを変更したので、私はこの問題を抱えていた

Arduino Volatile reference

+0

ありがとう、私はそれを試してみましょう。現時点では、私は他の問題に陥っています。最初の謎を部分的に解決したので、私は発疹であり、クラスを書くことに決めました。だから、すべてが現在再び壊れている...;) –

0

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

が正常に動作します。

関連する問題