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 != "")
そして今それは動作します。しかし、そのブール値の問題が存在する理由を知りたいです。