3

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

现在它可以工作了。但我仍然想知道为什么存在这个布尔问题。

4

4 回答 4

4

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

volatile boolean newMsg = false;

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

Arduino易失参考

于 2012-05-09T20:02:17.563 回答
0

如果您使用 Windows,我建议:

我不知道串行,但我知道文件:

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 兼容。

于 2012-05-08T20:25:12.847 回答
0

您缺少一些相关代码。该函数serialEvent包含一个循环,在读取所有while数据之前不会退出,并且不会调用您的函数。loop

于 2012-05-08T20:43:16.187 回答
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
)

工作正常。

于 2013-04-18T23:00:05.590 回答