0

擬似コード;

  1. 1-ブート(赤いLED)

  2. 送信完了後、パケットをブロードキャストします(緑色のライト)

  3. パケットを受信し、パケットをデコードし、それに応じてLEDを(青に設定)として設定します
  4. コーディング後にパケットをブロードキャストし、送信が完了しました(LEDを緑色に設定)
  5. パケットを受信し、デコードして、それに応じてLEDを設定します(セット7(赤+緑+青))

この段階の後、モート1はLED.set(7)をベットし、モート2はLED.set(2)になります[モート1は送信を開始しました]、そこでは非常に正常に動作します。しかし、モート1を再起動すると、2ステップの擬似コードとモート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;
 }
4

1 に答える 1

1

受信機が 2 つあります。それらは 2 つの異なる受信モジュールに配線されていますか? そうでない場合、受信したパケットが両方の受信イベントをトリガーし、問題が発生する可能性があります。

于 2013-01-31T00:37:04.737 に答える