我遇到了xbee s2b的问题。
我尝试仅使用放置在sparkfun规则板(协调器API)上的xbee来接收两个操纵杆值,并在连接到浏览器板上的其他xbee s2b的Arduino Uno上处理这些数据。(路由器API)。我正确地使用X-CTU配置了xbees,我在路由器Xbee上将DIO0和DIO1调整为ADC [2]。使用一个操纵杆时没有问题。但是当我尝试同时接收两个操纵杆值时,它们无法正常工作。当我在串行监视器上查看传入数据时,我看到了;
我的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();
}
}
}
我错过了什么?你能帮帮我解决这个问题。提前谢谢。
答案 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)
感谢您的回复。我上传了您编写的代码,串行监视器如下所示:
我确定问题是代码。无论我做什么,我都无法解码我需要的字节。我将代码更改为此以完全查看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'? !我不会忘记为什么不稳定。
你能建议我从这个数组中获取这些字节。