【问题标题】:Transmitting Data from Xbee Coordinator to Remote XBee on Arduino Uno将数据从 Xbee 协调器传输到 Arduino Uno 上的远程 XBee
【发布时间】:2018-07-22 13:13:54
【问题描述】:

我正在尝试从连接到我的计算机的 XBee 系列 1 设备(协调器)向远程 XBee 系列 1 设备(终端设备)发送一串数据,以打开和关闭 2 个 LED。

这是我用来从 XBee 协调器发送数据字符串的 Python 代码 到 XBee 终端设备:

import serial
import time

arduino = serial.Serial('COM13', 9600, timeout=1)
#msg = arduino.readline()  # read everything in the input buffer

time.sleep(3)

ASCIIdata = '121210'

for i in range(len(ASCIIdata)):

    if ASCIIdata[i] == '1':
        strin = '1'
        arduino.write(strin.encode())
        print strin.encode()
        time.sleep(0.2)
        # print(ASCIIdata[i])
        try:
            print ("Message from arduino: ")
            print arduino.readline()
            raise
        except Exception as e:
            print ("Fail to send!")

    if ASCIIdata[i] == '2':
        strin = '2'
        arduino.write(strin.encode())
        time.sleep(0.2)
        # print(ASCIIdata[i])
        try:
            print ("Message from arduino: ")
            print arduino.readline()
        except:
            print "Fail to send!"

    if ASCIIdata[i] == '0':
         strin = '0'
         arduino.write(strin.encode())
         time.sleep(0.2)
         # print(ASCIIdata[i])
         try:
             print ("Message from arduino: ")
             print arduino.readline()
         except:
             print "Fail to send!"

strin = 'p'
arduino.write(strin.encode()) # tell arduino a phase shifter setting has been finished
strin = 's'
arduino.write(strin.encode())

arduino.close()
time.sleep(0.5) # waits for 2 s
print('Data to be transfered: %s'%ASCIIdata)

这是远程 XBee 终端设备连接到的 Arduino 端的代码:

#define pins
int pinLED1 = 5;
int pinLED2 = 12;
char c;

void setup() {
pinMode(pinLED1, OUTPUT);
pinMode(pinLED2, OUTPUT);
Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    c = Serial.read();
    Serial.print(c);
    if (c == '1') {
      digitalWrite(pinLED1, HIGH);
      digitalWrite(pinLED2, LOW);
      Serial.print("1 ON, 2 OFF\n");
    }
    else if (c == '2') {
      digitalWrite(pinLED1, LOW);
      digitalWrite(pinLED2, HIGH);
      Serial.print("1 OFF, 2 ON\n");
    }
    else if (c == '0') {
      digitalWrite(pinLED1, LOW);
      digitalWrite(pinLED2, LOW);
      Serial.print("Both unlit.\n");
    }
  }
  else{
    Serial.print("Nope");
  }
}

正确的输出应该是 Arduino 上的 2 个 LED 将以交替方式切换然后打开,而 Serial.print() 输出应该反映在 Python 终端上。

但是,当我运行 Python 脚本时,它一直抛出异常“发送失败!”,即 Arduino 和 Python 之间没有通信。

我已经通过我的 Arduino (Uno) 所连接的 USB 端口进行通信测试了上述两个代码,并且一切正常。

我已尝试按以下方式配置我的 XBees:

  1. XBee(协调器)和 XBee(终端设备) - 均处于 AT 模式(禁用 API)
  2. XBee(协调器)-API 模式和 XBee(终端设备)-AT 模式 但没有产生任何结果。

请问我哪里出错了?

2018 年 2 月 15 日更新: 我不确定提供这些信息是否有帮助,但目前,这是我配置 XBee 系列 1 模块的方式:

我知道 XBee 无线电有许多固件,我想知道我面临的问题是否是由于 802.15.4 协议的限制(尽管我认为情况并非如此)。

【问题讨论】:

    标签: python arduino xbee


    【解决方案1】:

    我认为你应该打破问题,从底部开始。您是否尝试过将您的 Arduino 连接到计算机串行监视器并观察您收到的内容?如果您没有正确接收字符,请尝试使用 xbee 软件终端手动发送它们,以确保您可以正确获取它们并且 xbees 之间的连接正常。然后,您可以开始调试您的代码(如果问题尚未解决!)

    【讨论】:

    • 感谢您的回复。我目前正在使用 XCTU,其中我的 XBee 系列 1 协调器连接到,并且我连接了我的另一个 XBee 系列 1 终端设备(均配置为 AT 模式)。通过 TeraTerm。我意识到从 Coordinator 到 End Device 的传输仍然无法正常工作,但 End Device 可以向 Coordinator 发送数据。 (即我在 TeraTerm 中输入的内容出现在 XCTU 上)。请问为什么会这样?谢谢! :)
    • 确保其中一个 xbees 的 id 是另一个 xbees 的目标,反之亦然。我真的想不出别的了。除非您的波特率或代码有问题...
    • 谢谢!我意识到我在 XBees 的 ATMY 和 ATDL 上犯了错误,因为我过去使用单向链路使用 3 个端节点。 x.x 对于我的愚蠢错误,我真的很抱歉。感谢您的指导。 :)
    【解决方案2】:

    我发现我的Coordinator和End Device的地址设置错了~ Coordinator可以收到我的End Device的消息,因为我配置了End Device的地址指向Coordinator,但是我忘记设置我的协调器的目标地址与我的终端设备相同。

    我真的很抱歉我的粗心疏忽。

    在 2 个单独的设备上使用 TeraTerm 帮助解决了我的问题,因为它消除了我的 Arduino 代码的任何问题。

    谢谢@TheEngineer!

    【讨论】:

      猜你喜欢
      • 2015-05-25
      • 2015-11-20
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      相关资源
      最近更新 更多