将数据从 Xbee 协调器传输到 Arduino Uno 上的远程 XBee
Transmitting Data from Xbee Coordinator to Remote XBee on Arduino Uno
我正在尝试将一串数据从连接到我的计算机的 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)
这是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 脚本时,它一直抛出异常 "Fail to send!",即 Arduino 和 Python 之间没有通信。
我已经通过我的 Arduino (Uno) 所连接的 USB 端口进行通信,测试了上面的两个代码,一切正常。
我试过按以下方式配置我的 XBees:
- XBee(协调器)和 XBee(终端设备)- 均处于 AT 模式(API 禁用)
- XBee(协调器)- API 模式和 XBee(终端设备)-AT 模式
但没有结果。
请问我哪里出错了?
2018 年 2 月 15 日更新:
我不确定提供此信息是否有帮助,但目前,这是我配置 XBee 系列 1 模块的方式:
我知道 XBee 收音机有很多固件,我想知道我面临的问题是否是由于 802.15.4 协议的限制(尽管我认为情况并非如此)。
我觉得你应该破题,从底层做起。您是否尝试过将 Arduino 连接到计算机串行监视器并观察您收到的信息?如果您没有正确接收字符,请尝试使用 xbee 软件终端手动发送它们,以确保您可以正确接收它们并且 xbees 之间的连接正常。然后,您可以开始调试您的代码(如果问题还没有解决!)
我发现我的Coordinator和End Device的地址设置错了~ Coordinator可以收到我的End Device的消息,因为我配置了End Device的地址指向Coordinator,但是我忘记了将我的协调器的目标地址设置为与我的终端设备相同。
我真的很抱歉我的疏忽。
在 2 个独立的设备上使用 TeraTerm 帮助解决了我的问题,因为它消除了我的 Arduino 代码的任何问题。
谢谢@TheEngineer!
我正在尝试将一串数据从连接到我的计算机的 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)
这是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 脚本时,它一直抛出异常 "Fail to send!",即 Arduino 和 Python 之间没有通信。
我已经通过我的 Arduino (Uno) 所连接的 USB 端口进行通信,测试了上面的两个代码,一切正常。
我试过按以下方式配置我的 XBees:
- XBee(协调器)和 XBee(终端设备)- 均处于 AT 模式(API 禁用)
- XBee(协调器)- API 模式和 XBee(终端设备)-AT 模式 但没有结果。
请问我哪里出错了?
2018 年 2 月 15 日更新: 我不确定提供此信息是否有帮助,但目前,这是我配置 XBee 系列 1 模块的方式:
我知道 XBee 收音机有很多固件,我想知道我面临的问题是否是由于 802.15.4 协议的限制(尽管我认为情况并非如此)。
我觉得你应该破题,从底层做起。您是否尝试过将 Arduino 连接到计算机串行监视器并观察您收到的信息?如果您没有正确接收字符,请尝试使用 xbee 软件终端手动发送它们,以确保您可以正确接收它们并且 xbees 之间的连接正常。然后,您可以开始调试您的代码(如果问题还没有解决!)
我发现我的Coordinator和End Device的地址设置错了~ Coordinator可以收到我的End Device的消息,因为我配置了End Device的地址指向Coordinator,但是我忘记了将我的协调器的目标地址设置为与我的终端设备相同。
我真的很抱歉我的疏忽。
在 2 个独立的设备上使用 TeraTerm 帮助解决了我的问题,因为它消除了我的 Arduino 代码的任何问题。
谢谢@TheEngineer!