我有两个arduinos,每个都配有一个arduino无线盾牌和一个xbee。
通讯未按预期工作。我可以接收和发送字节,但模块之间的连接经常被中断,所以串行缓冲区正在增长很多。
此外,如果我将模块移动距离彼此超过1米,则完全拒绝连接。
我想知道,如果我的xbee模块可能是一种破坏,或者我可能错误配置它们。
有什么想法吗?
发件人的源代码:
void setup()
{
Serial.begin(9600);
}
void loop()
{
int sensorValue = analogRead(0);
int val = map(sensorValue, 0, 1023, 35, 160);
Serial.write(char(val));
delay(250);
}
接收者的源代码:
#include <Servo.h>
Servo motor1;
Servo motor2;
Servo motor3;
Servo motor4;
void setup()
{
motor1.attach(9);
motor2.attach(10);
motor3.attach(3);
motor4.attach(11);
Serial.begin(9600);
}
void loop()
{
if(Serial.available() > 0)
{
byte incoming = Serial.read();
int inValue = constrain(incoming, 35, 160);
motor1.write(inValue);
motor2.write(inValue);
motor3.write(inValue);
motor4.write(inValue);
}
delay(250);
}
答案 0 :(得分:3)
需要考虑的一些事项:
确保无线电尚未在通道26(0x1A)上形成网络。 XBee模块必须在该通道上以较低功率运行,因此我通常将ATSC
设置为0x7FFF以排除通道26.
该型号的XBee使用位于模块锥形部分的PCB天线。确保其上方或下方没有任何金属(地平面,组件,电线),并且没有将其放在会限制信号的大金属外壳中。
检查分组超时ATRO
的值。如果您希望XBee在进入时传输字符,而不是等待更多数据可能在一个数据包中组合在一起,您可能希望将其设置为低值(3-5)或甚至0或1。
如果您遇到范围问题,请检查ATPL
(功率级别)和ATPM
(超级模式)设置。启用升压模式(ATPM=1
)和最高功率级别(ATPL=4
)可能有助于解决范围问题。
您可能希望更改接收代码以更频繁地轮询字节,或者甚至忽略多个字节并仅使用最后接收的值。这样可以防止接收端积压字节。
处理任何未完成的字节:
while (Serial.available() > 0)
{
byte incoming = Serial.read();
int inValue = constrain(incoming, 35, 160);
motor1.write(inValue);
motor2.write(inValue);
motor3.write(inValue);
motor4.write(inValue);
}
忽略缓冲的字节,只写最后一个值:
if (Serial.available() > 0)
{
byte incoming;
// read all bytes but only use the last value read
while (Serial.available() > 0) incoming = Serial.read();
int inValue = constrain(incoming, 35, 160);
motor1.write(inValue);
motor2.write(inValue);
motor3.write(inValue);
motor4.write(inValue);
}