我正在尝试通过运行 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 永远不会被设置为 true,因为它if (inByte == '\n')
永远不会被验证为 true。我什至尝试在两边都使用'\r',甚至使用可输入字符('#'),但这个测试永远不会奏效。不过,字符串“Beagle”可以很好地通过,因此incomingMsg
可以正常使用。
奇怪的是,我在 Arduino 和 Processing 之间工作(机器人上的 Arduino 通过蓝牙连接到笔记本电脑上的 Processing)。我只是不明白为什么它在这里不起作用。有什么想法吗?
更新:我有一个部分答案,并且现在可以使用,尽管我仍然想知道有什么问题。
if (inByte == '\n')
正在被验证为真实。但是由于某种原因,将 true 分配给全局布尔变量newMsg
不起作用。尽管在 serialEvent() 中进行了赋值,但它的值在 loop() 中仍然是绝对错误的。然而它是一个全局变量(尽管大多数程序员不喜欢它们,但在 Arduino 中使用得相当多)。我将 loop() 中的测试替换为:
if (messageReceived != "")
现在它可以工作了。但我仍然想知道为什么存在这个布尔问题。