我一直致力于一个涉及xbees的项目。我的设置只是一个Xbee(协调器Api模式)连接到Arduino作为主单元。该主单元从多个Xbees(从器件)接收数据,这些Xbees仅由电池供电并从ADC引脚17读取数据。 ADC值传输到主设备xbee以在串行终端上显示。从站Xbee配置为(路由器AT模式)。我只在两个xbees之间做这件事:1个主人和1个奴隶。我有一个代码读取发送Xbee的mac地址,然后显示发送的ADC值。所有这一切都没问题,直到我添加了另一个奴隶,我真的需要帮助,因为我无法将每个mac地址与正确的ADC值相关联。我的代码都不能从两者中读取;在某些时候它停止从一个读取。如果有关于如何在同一网络上识别来自多个xbees的数据的任何建议,我将不胜感激。 这是我的代码:
#include <XBee.h>
#include <SoftwareSerial.h>
SoftwareSerial myserial(5,6);
float distance;
uint8_t myaddress[10];
XBee xbee = XBee();
uint8_t shCmd[] = {'S','H'};
uint8_t slCmd[] = {'S','L'};
AtCommandRequest atRequestSH = AtCommandRequest(shCmd);
AtCommandRequest atRequestSL = AtCommandRequest(slCmd);
AtCommandResponse atResponse = AtCommandResponse();
void getMyAddress(){
xbee.send(atRequestSL);
if(xbee.readPacket(5000)){
xbee.getResponse().getAtCommandResponse(atResponse);
if (atResponse.isOk()){
for(int i = 0; i < atResponse.getValueLength(); i++){
myaddress[i] = atResponse.getValue()[i];
}
}
}
delay(100);
}
void setup(){
Serial.begin(1200);
myserial.begin(1200);
xbee.begin(myserial);
}
void loop() {
getMyAddress();
for(int i=0; i < 10; i++) {
Serial.print(myaddress[i], HEX);
Serial.print(" ");
}
Serial.print("\n");
if (myserial.available() >= 21) { //
if (myserial.read() == 0x7E) {
for (int i = 1; i<19; i++) { // Skip ahead to the analog data
byte discardByte = myserial.read();
}
int analogMSB = myserial.read(); // Read the first analog byte data
int analogLSB = myserial.read(); // Read the second byte
int analogReading = analogLSB + (analogMSB * 256);
distance = ((analogReading *1.0) / 1023.0)* 3.3;
Serial.println(distance);
}
}
}
答案 0 :(得分:0)
在您跳过数据以获取模拟值的代码中,您将找到发送数据的设备的MAC地址。
if (myserial.read() == 0x7E) {
for (int i = 1; i<19; i++) { // Skip ahead to the analog data
byte discardByte = myserial.read();
}
在处理数据之前,您应该仔细查看这些数据 - 通过查看帧类型,检查帧长度,检查帧结尾处的校验和来确保它是I / O样本。您正在使用的库似乎具有处理AT命令和响应的功能,也许它还具有I / O样本帧类型的功能。
这个Digi support page解释了I / O采样并记录了IO数据采样接收帧(类型0x92)中的各个字段。