当前位置: 代码迷 >> python >> 将数据从Xbee Coordinator传输到Arduino Uno上的远程XBee
  详细解决方案

将数据从Xbee Coordinator传输到Arduino Uno上的远程XBee

热度:101   发布时间:2023-07-16 11:00:49.0

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

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

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)

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

#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 Series 1模块的方式:

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

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

我意识到我错误地设置了协调器和终端设备的地址?协调器可以从终端设备接收消息,因为我将终端设备的地址配置为指向协调器,但是却忘记了设置目标地址我的协调人必须与我的终端设备相同。

对于我的疏忽,我真的感到非常抱歉。

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

谢谢@TheEngineer!

  相关解决方案