Arduino 如何在API模式下读取XBee RSSI?

Arduino 如何在API模式下读取XBee RSSI?,arduino,xbee,Arduino,Xbee,我试图在接收端以API模式测试XBee RSSI,如何在arduino中检索接收无线电的RSSI值。 我在API-2模式下配置了两个XBee,并通过引脚4-5(rxtx和txrx)连接到arduino,以连接XBee无线电 发送帧码如下,两端传输没有问题 uint8_t data[] = {'H','i'}; XBeeAddress64 addr64 = XBeeAddress64(); addr64.setMsb(0x00000000); // Msb address of rec

我试图在接收端以API模式测试XBee RSSI,如何在arduino中检索接收无线电的RSSI值。
我在API-2模式下配置了两个XBee,并通过引脚4-5(rxtx和txrx)连接到arduino,以连接XBee无线电

发送帧码如下,两端传输没有问题

  uint8_t data[] = {'H','i'};
  XBeeAddress64 addr64 = XBeeAddress64();
  addr64.setMsb(0x00000000); // Msb address of receiver
  addr64.setLsb(0x00000000); // Lsb address of receiver
  ZBTxRequest zbTx = ZBTxRequest(addr64, data, sizeof(data));
  xbee.send(zbTx); 
  delay(1000);
在接收端,我尝试了arduino的
pulseIn
和的
.getRssi()
,前一个函数的结果为“0”,而后一个函数的结果为“102”,但在我将Xbee无线电彼此移开时保持不变。
我需要做什么才能在接收端获得正确的RSSI?

希望这个答案能帮助您和其他人。
假设您正在使用以下库:
您有一个系列1模块,可以使用以下测试代码进行快速诊断。当然,如果需要,也可以使用注释部分

#include <XBee.h>
#include <SoftwareSerial.h>

// XBee's DOUT (TX) is connected to pin 8 (Arduino's Software RX)
// XBee's DIN (RX) is connected to pin 9 (Arduino's Software TX)
SoftwareSerial serial1(8, 9); // RX, TX

XBee xbee = XBee();
XBeeResponse response = XBeeResponse();
Rx16Response rx16 = Rx16Response();
Rx64Response rx64 = Rx64Response();

// uint8_t xbeeOption = 0;
// uint8_t xbeeData = 0;
uint8_t xbeeRssi = 0;

void setup() {
  Serial.begin(9600);
  serial1.begin(9600);
  xbee.setSerial(serial1);
}

void loop() {
  xbee.readPacket(100);
  if (xbee.getResponse().isAvailable())  {
    Serial.println("Xbee available");
    if (xbee.getResponse().getApiId() == RX_64_RESPONSE || xbee.getResponse().getApiId() == RX_16_RESPONSE)  {
      Serial.println("64 or 16");
      if (xbee.getResponse().getApiId() == RX_16_RESPONSE)  {
        Serial.println("16");
        xbee.getResponse().getRx16Response(rx16);
        // xbeeOption = rx16.getOption();
        //Serial.print("xbeeOption: "); Serial.println(xbeeOption);
        //xbeeData = rx16.getData(0);
        //Serial.print("xbeeData: "); Serial.println(xbeeData);
        xbeeRssi = rx16.getRssi();
        Serial.print("xbeeRssi: "); Serial.println(xbeeRssi);
      }
      else  {
        Serial.println("64");
        xbee.getResponse().getRx64Response(rx64);
        //xbeeOption = rx64.getOption();
        //Serial.print("xbeeOption: "); Serial.println(xbeeOption);
        //xbeeData = rx64.getData(0);
        //Serial.print("xbeeData: "); Serial.println(xbeeData);
        xbeeRssi = rx64.getRssi();
        Serial.print("xbeeRssi: "); Serial.println(xbeeRssi);
      }
    }
  }
#包括
#包括
//XBee的DOUT(TX)连接到引脚8(Arduino的软件RX)
//XBee的DIN(RX)连接至引脚9(Arduino的软件TX)
软件系列1(8,9);//接收,发送
XBee XBee=XBee();
XBEERResponse response=XBEERResponse();
Rx16Response rx16=Rx16Response();
rx64响应rx64=rx64响应();
//uint8\u t xbeeOption=0;
//uint8_t xbeeData=0;
uint8_t xbeeRssi=0;
无效设置(){
Serial.begin(9600);
serial1.begin(9600);
xbee.集合序列(序列1);
}
void循环(){
xbee.读包(100);
if(xbee.getResponse().isAvailable()){
Serial.println(“Xbee可用”);
如果(xbee.getResponse().getapid()==RX_64_RESPONSE | | xbee.getResponse().getapid()==RX_16_RESPONSE){
序列号。打印号(“64或16”);
if(xbee.getResponse().getapid()==RX\u 16\u RESPONSE){
序列号:println(“16”);
xbee.getResponse().getRx16Response(rx16);
//xbeeOption=rx16.getOption();
//Serial.print(“xbeeOption”);Serial.println(xbeeOption);
//xbeeData=rx16.getData(0);
//Serial.print(“xbeeData:”);Serial.println(xbeeData);
xbeeRssi=rx16.getRssi();
Serial.print(“xbeeRssi:”);Serial.println(xbeeRssi);
}
否则{
Serial.println(“64”);
xbee.getResponse().getRx64Response(rx64);
//xbeeOption=rx64.getOption();
//Serial.print(“xbeeOption”);Serial.println(xbeeOption);
//xbeeData=rx64.getData(0);
//Serial.print(“xbeeData:”);Serial.println(xbeeData);
xbeeRssi=rx64.getRssi();
Serial.print(“xbeeRssi:”);Serial.println(xbeeRssi);
}
}
}
如果您使用系列2模块,只有使用硬件pwm信号的方法:为了更新RSSI pwm信号,它需要接收API数据包。此外,对于系列2 Xbee,这仅适用于数据包的最后一个跃点,因此从最后一个路由器到目的地。您需要使用Xbee RSSI引脚和一些编码,具体取决于您的设备。
距离的rssi不是很可靠,在发送数据包时,可能每10到15米就会看到一次变化。因此,在工作场所移动Xbee不会改变值。
编辑:
当使用系列2模块时,有以下可能:将xbee(6)的rssi引脚连接到Arduino pwm引脚(如10)并测量传入信号,然后将其映射到质量或/和距离范围。因此,编写您自己的rssi函数。通常的xbee LIB仅支持系列1模块。

您使用的是哪个库的.getRssi()函数?这将使您更容易获得帮助。请为以后的请求添加尽可能多的信息(如使用的LIB、版本、环境a.s.o.)等待您的回复我在某个地方学过,他们在
中使用了它,但它对我不起作用,因为我想我以前试过,它对我不起作用,它的值没有改变,即使我超出了Xbee可以通信的范围。在Xbee的程序员应用程序中,没有路由器,我正在两个节点之间测试它(XCTU)我们可以看到RSSI值甚至在两个XBee之间变化,所以不需要太远。您使用过diag程序吗?您确定您有一个系列1 XBee。请在编写之前回答问题。XCTU中的RSSI不是库中的RSSI。我们在这里讨论库函数。请阅读我的文章的最后一部分回答并检查术语(路由器=最后一个节点)=>如果只有两个xbee,那么发送方就是路由器。是的,我使用的是系列2 xbee,我只想用每个接收数据包读取xbee Rssi,不管到达需要多大的跳数,但最后我需要接收器xbee的Rssi,