【问题标题】:Loss of information using XBee使用 XBee 丢失信息
【发布时间】:2016-09-06 10:12:00
【问题描述】:

我正在尝试通过串行端口在装有 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 波特正确发送。

【问题讨论】:

  • 尝试将msg 声明为int 并使用Serial.write(msg) 来回显字符。
  • 按你说的做,@mhawke,但问题仍然存在。如果我用 Python >>ser.write('Hello') 编写,我会返回 'H\x8b'
  • @mhawke Serial.write() 接受 byte 而不是 int @Jalo 尝试在 ser.write()ser.read() 之间设置延迟
  • 两者都试过了,没有什么不同...但是,根据arduino.cc/en/Serial/Write,我也可以发送整数或字符串
  • 用PySerial发送一整串好像有问题。如果我将消息分段为单个字符,即: >>ser.write('H') >>ser.write('E') ... 我可以正确获取完整的字符串

标签: python arduino serial-port pyserial xbee


【解决方案1】:

PC 无法向 Arduino 板发送超过 1 个字符的原因是有一个 XBee 模块配置了与其他模块和 pyserial 实例不同的端口参数。在这种情况下,通信是在 Python 中建立的,主要参数如下:

  • 波特率:57600

  • 字节大小:8

  • 奇偶校验:无

  • 停止位:1

如果其中一个 XBee 模块中的参数之一不同,则通信将出现故障(如本例)甚至不可能。

要检查 XBee 配置,可以使用 Digi XCTU 应用程序:将 RF 模块连接到 PC,打开程序并读取它们的配置。打开后,必须确保“串行接口”选项与前面列出的相同。

在图像中,显示了可以更改这些选项的菜单。请注意,停止位和字节大小无法配置。第一个参数直到 XB24-ZB 版本才可调,最后一个参数seems to not be possible to change

在这个问题的情况下,错误的参数是奇偶校验,因为它在其中一个模块中设置为 空间奇偶校验,而不是 no平价。因此,第一个字节被正确发送,但在它之后数据不连贯。更改此参数后,连接运行正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 2016-05-05
    • 1970-01-01
    相关资源
    最近更新 更多