首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Tinyos中接收和发送

在Tinyos中接收和发送
EN

Stack Overflow用户
提问于 2018-05-24 11:21:00
回答 2查看 524关注 0票数 0

我有两个telosb之间的程序通信通信。这是一个tinyos的例子:https://github.com/tinyos/tinyos-release/tree/tinyos-2_1_2/apps/RadioCountToLeds。此代码将发送和接收一个数值计数,如果满足条件,它将打开相应的led。我想把代码分成两部分:发送和接收。我创建了两个app: Receive:

代码语言:javascript
复制
//RadioCountToLedC.nc
#include "Timer.h"
#include "RadioCountToLeds.h"

module RadioCountToLedsC @safe() {
  uses {
    interface Leds;
    interface Boot;
    interface Receive;
    interface Packet;
  }
}
implementation {

  message_t packet;
  uint16_t counter = 0;
  event void Boot.booted()
  {

  }
  event message_t* Receive.receive(message_t* bufPtr, 
                   void* payload, uint8_t len) {
    call Leds.led0On();
    dbg("RadioCountToLedsC", "Received packet of length %hhu.\n", len);
    if (len != sizeof(radio_count_msg_t)) {return bufPtr;}
    else {
      radio_count_msg_t* rcm = (radio_count_msg_t*)payload;
      if (rcm->counter%3 == 0) {
    call Leds.led0On();
      }
      else {
    call Leds.led0Off();
      }
      if (rcm->counter%3 == 1) {
    call Leds.led1On();
      }
      else {
    call Leds.led1Off();
      }
      if (rcm->counter%3 == 2) {
    call Leds.led2On();
      }
      else {
    call Leds.led2Off();
      }
      return bufPtr;
    }
  }

}


   //RadioToLedAppC.nc
    #include "RadioCountToLeds.h"

configuration RadioCountToLedsAppC {}
  implementation {
    components MainC, RadioCountToLedsC as App, LedsC;
    components new AMReceiverC(AM_RADIO_COUNT_MSG);
    components new TimerMilliC();
    components ActiveMessageC;

  }

发送:

代码语言:javascript
复制
//RadioCountToLedC.nc


#include "Timer.h"
#include "RadioCountToLeds.h"

module RadioCountToLedsC @safe() {
  uses {
    interface Leds;
    interface Boot;
    interface AMSend;
    interface Timer<TMilli> as MilliTimer;
    interface SplitControl as AMControl;
    interface Packet;
  }
}
implementation {

  message_t packet;

  bool locked;
  uint16_t counter = 0;

  event void Boot.booted() {
    call MilliTimer.startPeriodic(250);
    call AMControl.start();
  }

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

  event void AMControl.stopDone(error_t err) {
    // do nothing
  }

  event void MilliTimer.fired() {
    if(counter<100){
       counter++;
    }else{
       counter=0;
    }
    dbg("RadioCountToLedsC", "RadioCountToLedsC: timer fired, counter is %hu.\n", counter);
    if (locked) {
      return;
    }
    else {
      radio_count_msg_t* rcm = (radio_count_msg_t*)call Packet.getPayload(&packet, sizeof(radio_count_msg_t));
      if (rcm == NULL) {
    return;
      }

      rcm->counter = counter;
      if (call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(radio_count_msg_t)) == SUCCESS) {
    dbg("RadioCountToLedsC", "RadioCountToLedsC: packet sent.\n", counter); 
    locked = TRUE;
      }
    }
  }

  event void AMSend.sendDone(message_t* bufPtr, error_t error) {
    if (&packet == bufPtr) {
      locked = FALSE;
    }
  }

}
//RadioToLedAppC.nc

    #include "RadioCountToLeds.h"

    configuration RadioCountToLedsAppC {}
    implementation {
      components MainC, RadioCountToLedsC as App, LedsC;
      components new AMSenderC(AM_RADIO_COUNT_MSG);
      components new AMReceiverC(AM_RADIO_COUNT_MSG);
      components new TimerMilliC();
      components ActiveMessageC;

      App.Boot -> MainC.Boot;

      App.AMSend -> AMSenderC;
      App.AMControl -> ActiveMessageC;
      App.Leds -> LedsC;
      App.MilliTimer -> TimerMilliC;
      App.Packet -> AMSenderC;
    }

RadioCountToLed.h

代码语言:javascript
复制
#ifndef RADIO_COUNT_TO_LEDS_H
#define RADIO_COUNT_TO_LEDS_H

typedef nx_struct radio_count_msg {
  nx_uint16_t counter;
} radio_count_msg_t;

enum {
  AM_RADIO_COUNT_MSG = 6,
};

#endif

但是当我运行它时,它不起作用。如果我像上面的例子一样在同一个文件中编写接收和发送RadioCountToLedC.nc。它会工作得很好。我的应用程序出了什么问题?

EN

回答 2

Stack Overflow用户

发布于 2018-05-24 16:21:41

我觉得你需要

代码语言:javascript
复制
call AMControl.start();

在你的接收器的启动功能中。这将打开无线电并允许您接收消息。

PS如果这不能完全解决您的问题,请提供更多有关您在运行时观察到的情况的详细信息。

票数 0
EN

Stack Overflow用户

发布于 2018-07-19 18:24:06

有许多简单的方法来解决这个问题,最简单的方法是只有一个变量来控制程序流,或者使用每个节点的TinyOS ID来控制流。

例如,您可能有(只做了4个小更改):

代码语言:javascript
复制
#include "Timer.h"
#include "RadioCountToLeds.h"

/**
 * Implementation of the RadioCountToLeds application. RadioCountToLeds 
 * maintains a 4Hz counter, broadcasting its value in an AM packet 
 * every time it gets updated. A RadioCountToLeds node that hears a counter 
 * displays the bottom three bits on its LEDs. This application is a useful 
 * test to show that basic AM communication and timers work.
 *
 * @author Philip Levis
 * @date   June 6 2005
 */

module RadioCountToLedsC @safe() {
  uses {
    interface Leds;
    interface Boot;
    interface Receive;
    interface AMSend;
    interface Timer<TMilli> as MilliTimer;
    interface SplitControl as AMControl;
    interface Packet;
  }
}
implementation {

  message_t packet;

  bool locked;
  uint16_t counter = 0;

  enum state {TX, RX} mode; //Change 1: Define States

  event void Boot.booted() {
    call AMControl.start();
    mode = RX; // CHANGE 2: Set States - "RX" for receiver & "TX" for transmitter
  }

  event void AMControl.startDone(error_t err) {
    if (err == SUCCESS) {
      if(mode == TX) //CHANGE 3: Only the transmitter sends
          call MilliTimer.startPeriodic(250);
    }
    else {
      call AMControl.start();
    }
  }

  event void AMControl.stopDone(error_t err) {
    // do nothing
  }

  event void MilliTimer.fired() {
    counter++;
    dbg("RadioCountToLedsC", "RadioCountToLedsC: timer fired, counter is %hu.\n", counter);
    if (locked) {
      return;
    }
    else {
      radio_count_msg_t* rcm = (radio_count_msg_t*)call Packet.getPayload(&packet, sizeof(radio_count_msg_t));
      if (rcm == NULL) {
    return;
      }

      rcm->counter = counter;
      if (call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(radio_count_msg_t)) == SUCCESS) {
    dbg("RadioCountToLedsC", "RadioCountToLedsC: packet sent.\n", counter); 
    locked = TRUE;
      }
    }
  }

  event message_t* Receive.receive(message_t* bufPtr, 
                   void* payload, uint8_t len) {
    dbg("RadioCountToLedsC", "Received packet of length %hhu.\n", len);

    if(mode == TX) return bufPtr; //CHANGE 4: Only RX processes packets

    if (len != sizeof(radio_count_msg_t)) {return bufPtr;}
    else {
      radio_count_msg_t* rcm = (radio_count_msg_t*)payload;
      if (rcm->counter & 0x1) {
    call Leds.led0On();
      }
      else {
    call Leds.led0Off();
      }
      if (rcm->counter & 0x2) {
    call Leds.led1On();
      }
      else {
    call Leds.led1Off();
      }
      if (rcm->counter & 0x4) {
    call Leds.led2On();
      }
      else {
    call Leds.led2Off();
      }
      return bufPtr;
    }
  }

  event void AMSend.sendDone(message_t* bufPtr, error_t error) {
    if (&packet == bufPtr) {
      locked = FALSE;
    }
  }

}

如果愿意,您也可以使用C预处理器来设置mode变量,而不是在启动事件中设置模式。

您创建的接收器应用程序的问题是它

i)不启动收发器,因为它不会在Boot.Booted()事件中调用AMControl.start()

ii) RadioCountToLedsAppC接线不正确,没有连接任何接口。您需要连接所有接口(启动、Leds、接收和AMControl)。类似于您在发送者中连接它们的方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50500419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档