xbee之间没有同步

时间:2015-04-22 21:39:56

标签: arduino-uno xbee

我必须使用xbee S2,一个作为连接到arduino的协调器API,另一个作为路由器AT, 我的项目是关于向路由器发送命令来点亮一个led。如果我点击一个按钮,协调员发送数据。 问题是路由器没有立即做出反应需要一段时间来接收数据。 请有人帮我吗 这个代码我用

int led = 13;
const int bouton = 2;
void setup() {
  // put your setup code here, to run once:
pinMode(led, OUTPUT);
Serial.begin(9600);
pinMode(bouton, INPUT);
}
void loop() {
  // put your main code here, to run repeatedly:
   if(digitalRead(bouton)==HIGH)
  {
    digitalWrite(led,HIGH);
    setRemoteState(0x5);
    delay(500);
  }
     if(digitalRead(bouton)==LOW)
  {
      digitalWrite(led,LOW);
      setRemoteState(0x4);
      delay(500);
  
  }
}
void setRemoteState(char value){
  Serial.write(0x7E); // start byte
  Serial.write((byte)0x0);
  Serial.write(0x10);
  Serial.write(0x17);
  Serial.write((byte)0x0);
  // id of recipient or use 0xFFFF for broadcast
  Serial.write((byte)00);
  Serial.write((byte)00);
  Serial.write((byte)00);
  Serial.write((byte)00);
  Serial.write((byte)00);
  Serial.write((byte)00);
  Serial.write(0xFF);
  Serial.write(0xFF);
  // 16 bit of reciepent 
  Serial.write(0xFF);
  Serial.write(0xFE);  
  
   Serial.write(0x02); 
   
   Serial.write('D');
   Serial.write('2');
   
   Serial.write(value);
   
   long sum = 0x17 + 0xFF + 0xFF + 0xFF + 0xFE + 0x02 + 'D' + '2' + value;
   Serial.write(0xFF - ( sum & 0xFF) );
   Serial.print(sum,HEX);
}
   
   

2 个答案:

答案 0 :(得分:0)

现在,无论是否从上次改变,你每1/2秒就按一次按钮状态。你正在做很多不必要的工作,包括每秒发送两帧。

您应该将循环修复为仅在状态发生变化时发送帧:

state = digitalRead(bouton);
if (state != laststate) {
  laststate = state;
  digitalWrite(led, state);
  if (state == HIGH) {
    setRemoteState(5);
  } else {
    setRemoteState(4);
  }
}    

通过此更改,您不再需要延迟loop()功能,因此按下按钮会更加敏感。 LED应立即更改并发送消息。使用旧代码,检测按钮更改可能需要700毫秒。

答案 1 :(得分:0)

我正在尝试用字符串替换按钮!当我写在xbee上发送消息来打开led时,当我写下xbee发送消息关闭led!在这个例子中我将使用arduino mega因为我需要串口一个用于读取该字,一个用于将命令发送到路由器

void loop() {
 receivedata();  
if (inputString.length() >0) {
    Serial.println(inputString);
if (inputString == "on"){
 digitalWrite(led,HIGH);
}

if (inputString == "off"){
 digitalWrite(led,LOW);
}
inputString=""; 
}
  // put your main code here, to run repeatedly:
 state = digitalRead(led);
if (state != laststate) {
  laststate = state;
  digitalWrite(led, state);
  if (state == HIGH) {
    setRemoteState(5);
  } else {
    setRemoteState(4);
  }
}  
}
void receivedata(){
   while (Serial.available() ) {
    // get the new byte:
    delay(3);  
    char inChar = Serial.read();
    // add it to the inputString:
    inputString += inChar;
       
}}

它仍然不起作用:/