1

我有两个 arduino,每个都加上一个 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);
}
4

1 回答 1

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);
}
于 2013-09-17T19:55:43.993 回答