xbee pro s2b接收随机数据

时间:2016-01-31 22:31:17

标签: arduino xbee

我遇到了xbee s2b的问题。

我尝试仅使用放置在sparkfun规则板(协调器API)上的xbee来接收两个操纵杆值,并在连接到浏览器板上的其他xbee s2b的Arduino Uno上处理这些数据。(路由器API)。我正确地使用X-CTU配置了xbees,我在路由器Xbee上将DIO0和DIO1调整为ADC [2]。使用一个操纵杆时没有问题。但是当我尝试同时接收两个操纵杆值时,它们无法正常工作。当我在串行监视器上查看传入数据时,我看到了;

https://lh3.googleusercontent.com/-20vjr0EchsQ/VqyZXgq84VI/AAAAAAAAA_0/WhEtoOU61vA/s1280-Ic42/Screenshot_3.jpg

我的Arduino代码是:

int packet[32];

void setup()
{
    Serial.begin(9600);
}

void loop(){
    if (Serial.available() > 0) {
        if (Serial.read() == 0x7E) {
            packet[0] = 0x7E; //start delimiter
            packet[1] = readByte(); //MSB1
            packet[2] = readByte(); //MSB2
            int dataLength = (packet[1] <<  8) | packet[2]; //between the length and the checksum

            printPacket(dataLength+4);
            Serial.println("");
        }
    }
    delay(1000);
}
void printPacket(int k) {
    for(int i=0; i < k; i++) {
        Serial.print(packet, HEX);
        Serial.print(" ");
        delay(1000);
    }
}
int readByte() {
    while (true) {
        if (Serial.available() > 0) {
            return Serial.read();
        }
    }
}

我错过了什么?你能帮帮我解决这个问题。提前谢谢。

2 个答案:

答案 0 :(得分:1)

delay(1000)语句可能会导致您丢失串行缓冲区中的字符,可能没有必要。

您分享的代码似乎不完整。你在哪里读取数据包的dataLength字节? printPacket()如何打印字节?

您的入站数据包缓冲区应该更大 - 我认为除了帧头和校验和之外,XBee S2B的网络有效负载最多可达255个字符。

您已经创建了阻止readByte()来电,这不是一个好的程序设计。请考虑这样的事情:

unsigned char packet[300];
int packet_index = 0;
int packet_length;

void loop() {
    while (Serial.available() > 0) {
        packet[packet_index++] = Serial.read();
        if (packet_index == 3) {
            packet_length = (packet[1] << 8) | packet[2];
        }
        if (packet_index > 2 && packet_index == packet_length) {
            print_packet();
            packet_index = 0;
        }
    }
}

void print_packet() {
    int i;

    for (i = 0; i < packet_length; ++i) {
        Serial.print(packet[i], HEX);
        Serial.print(" ");
    }
    Serial.println("");
}

如果要打印的数据太多而且出站串行缓冲区溢出,请尝试将控制台串口的速度提高到115200bps。或者在收到字节时打印字节,而不是等到数据包完成。

答案 1 :(得分:0)

感谢您的回复。我上传了您编写的代码,串行监视器如下所示:

https://picasaweb.google.com/106047395725756959230/DropBox?authkey=Gv1sRgCNPX5ML_3qXBXg#slideshow/6246670706256832402

我确定问题是代码。无论我做什么,我都无法解码我需要的字节。我将代码更改为此以完全查看API框架:

void setup(){
  Serial.begin(9600);
}

void loop(){
  if(Serial.available() >= 23){
    for(int i = 0; i < 24; i++){
    Serial.print(Serial.read(),HEX);
    Serial.print(",");
    }
    Serial.println();
  }
}

缓冲区中的传入字节;

7E,0,14,92,0,13,A2,0,40,E6,74,D1,3D,35,1,1,0,0,C,0,63,0,4F,1A

我需要从缓冲区中取出由0和63组成的第一个模拟样本和由0和4F组成的第二个模拟样本。但无论我编写什么代码,我只拿了一些值('0,63,0,4F'),然后模拟样本变得随机,例如我开始采用'0,13,A2,0'? !我不会忘记为什么不稳定。

你能建议我从这个数组中获取这些字节。