串行通信Python到Arduino - 无法识别回车

时间:2012-05-08 20:17:32

标签: python arduino pyserial

我正在尝试通过串口在运行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 != "")

现在它有效。但我仍然想知道为什么存在布尔问题。

4 个答案:

答案 0 :(得分:4)

由于newMsg在中断驱动函数中被更改,您可能需要将newMsg声明为volatile:

volatile boolean newMsg = false;

将通知编译器该值可能会更改,并且不应对其进行优化。

Arduino Volatile reference

答案 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
)

工作正常。