我正在尝试通过串口在运行Ubuntu 10.04和Arduino的BeagleBone之间进行通信。到目前为止,我可以发送一个字符串,但是我在识别换行符时遇到了问题。
从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')
被验证为真。但由于某种原因,对全局布尔变量newMsg
的赋值不起作用。尽管在serialEvent()中赋值,但它的值在loop()中仍然是绝对错误的。然而,它是一个全局变量(尽管大多数程序员厌恶它们,但它们与Arduino相当使用)。我用:( / p>)替换了loop()中的测试
if (messageReceived != "")
现在它有效。但我仍然想知道为什么存在布尔问题。
答案 0 :(得分:4)
由于newMsg在中断驱动函数中被更改,您可能需要将newMsg声明为volatile:
volatile boolean newMsg = false;
将通知编译器该值可能会更改,并且不应对其进行优化。
答案 1 :(得分:0)
如果您使用Windows,我建议:
我不知道Serial但我知道文件:
ser = serial.Serial('/dev/ttyACM0', 9600) # mode = 'w'
应以读取文本模式打开文件。而
ser = serial.Serial('/dev/ttyACM0', 9600, 'wb') # may not be correct
应以读二进制模式打开文件对象。
看看open(... mode = ...)的例子。或者看看你是否在某个地方找到'w'作为选项,你可以用'wb'代替。
在windows \ r下删除文本文件IO以兼容posix,我想。
答案 2 :(得分:0)
您缺少一些相关代码。函数serialEvent
包含while
循环,在全部数据被读取之前不会退出,并且不会调用loop
函数。
答案 3 :(得分: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
)
工作正常。