2013-01-09 34 views
0

伪代码;TinyOS,重新启动微尘后无法收到数据包

  1. 1启动(红色LED)

  2. 广播数据包,后发送完成(绿灯)

  3. 接收数据包,解码包,并设定相应的领导为(设置蓝色)
  4. 广播编码后的数据包,发送完成(LED绿色集)
  5. 接收数据包,将其解码并设置相应的领导为(设置7(红+绿+蓝))

这个阶段微尘1之后将赌注LED.set(7)和微尘2将LED.set(2)[微尘1已开始传输],直到有它工作得很好。但是当我重新启动mote 1时,它会运行,直到2步的伪代码和mote 2无法接收数据包)

implementation{ 
bool busy = FALSE; 
message_t pkt; 
message_t i_pkt; 
event void Boot.booted() { 

    call Leds.set(1); 
    call AMControl.start(); 
    printf("Booted %d\n",1); 
    call CC2420Packet.setPower(&pkt, 20); 
    call CC2420Packet.setPower(&i_pkt, 2); 
} 

event void Timer0.fired() { 

    if (!busy) { 
     FindRoute_t *btrpkt = (FindRoute_t*)(call Packet.getPayload(&pkt, sizeof (FindRoute_t))); 

     btrpkt->counter = 4; 
     if (call firstsender.send(AM_BROADCAST_ADDR, &pkt, sizeof(FindRoute_t)) == SUCCESS) { 
     busy = TRUE; 
     } 
    } 

} 


event void AMControl.startDone(error_t err) { 
    if (err == SUCCESS) { 
     call Timer0.startOneShot(250); 
    } 
    else { 
     call AMControl.start(); 
    } 
} 

event void AMControl.stopDone(error_t err) { 
} 

event void firstsender.sendDone(message_t *msg, error_t error) { 
    if (&pkt == msg) { 
     call Leds.set(2); 
     busy = FALSE; 
    } 
} 

event message_t* firstreceiver.receive(message_t* msg, void* payload, uint8_t len) { 
    if (len == sizeof(FindRoute_t)) { 
     FindRoute_t* btrpkt = (FindRoute_t*)payload; 
     call Leds.set(btrpkt->counter); 

     call Timer1.startOneShot(3000); 
    } 
    return msg; 
} 


    event void Timer1.fired(){ 

    if (!busy) { 
     FindRoute_t *btrpkt = (FindRoute_t*)(call Packet.getPayload(&i_pkt, sizeof (FindRoute_t))); 

     btrpkt->counter = 7; 
     if (call nextsender.send(AM_BROADCAST_ADDR, &i_pkt, sizeof(FindRoute_t)) == SUCCESS) { 
     busy = TRUE; 
     } 
    } 
    } 
    event void nextsender.sendDone(message_t *msg, error_t error) { 
    if (&i_pkt == msg) { 
     call Leds.set(2); 
     busy = FALSE; 
    } 
} 

    event message_t* nextreceiver.receive(message_t* msg, void* payload, uint8_t len) { 
    if (len == sizeof(FindRoute_t)) { 
     FindRoute_t* btrpkt = (FindRoute_t*)payload; 
     call Leds.set(btrpkt->counter); 
    } 
    return msg; 
} 

回答

1

您有两个接收器。他们是否连线到两个不同的接收模块?否则,收到的数据包将触发它们的接收事件,这可能会导致一些问题。