我正在尝试通过串行端口在带有Ubuntu 14.04LTS的PC和我的RoMeo Arduino Board(Atmega 328)之间建立通信。使用的串行接口是2个Xbee模块,一个在PC上,另一个在电路板上。
首先,我正在尝试开发一个简单的程序来向主板发送消息并将其接收回来。我用于Arduino板的代码如下:
void loop(void)
{
char msg;
if (Serial.available()){
msg = Serial.read();
msg = Serial.print(msg);
}
}
当我发送一个独特的角色时,PC会正确收到它。但是,我面临的问题是,对于更长的字符串,以下字符拼写错误,因为我获得了奇怪的十六进制数字,如下所示:
>>> import serial
>>> ser = serial.Serial(port='/dev/ttyUSB0', baudrate=57600, timeout=0.1)
>>> ser.write('H')
>>> ser.read(1)
'H'
>>> ser.write('Hello')
>>> ser.read(5)
'H\x8b\xbd'
提前致谢。
编辑:似乎XBee modules存在溢出问题,但我无法完全理解:如果我在发送的字符之间等待0.01秒或更长时间,问题就解决了,这是一个巨大的数量时间。也就是说,我现在用于发送单词的代码是:for letter in word:
serial.write(letter)
time.sleep(0.01)
但是,只有在从PC向Arduino发送数据时才需要此等待时间。当通信走向另一个方向(Arduino将数据发送到PC)时,我不需要睡眠,并且在57600波特处正确地发送了所有字节。
答案 0 :(得分:0)
PC无法向Arduino板发送超过1个字符的原因是,有一个XBee模块配置了与其他模块和pyserial实例不同的端口参数。在这种情况下,通信在Python中建立,具有以下主要参数:
波特率:57600
Bytesize:8
奇偶校验:无
停止位:1
如果其中一个参数在其中一个XBee模块中不同,则通信将出现故障(如本例),甚至不可能。
要检查XBee配置,可以使用Digi XCTU应用程序:将RF模块连接到PC,打开程序并阅读其配置。打开后,必须确保“Serial interfacing”选项与之前列出的选项相同。
在图像中,显示可以更改这些选项的菜单。请注意,无法配置停止位和字节大小。第一个参数在XB24-ZB版本和最后一个版本seems to not be possible to change之前不可调整。
对于这个问题,错误的参数是奇偶校验,因为它在其中一个模块中设置为 space parity ,而不是 no奇偶校验。因此,第一个字节被正确发送,但在此之后数据不一致。更改此参数后,连接运行正常。