TinyOs例子之TestSerial学习

学习TestSerial

1、建立模块 TestSerialC

2、使用到的接口有:

   uses {

   interface Leds;

interface Boot;

   /*主要是下面几个*/

interfaceSplitControl asControl;

   interface Receive;

   interface AMSend;

   interface Timer asMilliTimer;

   interface Packet;

  }

查找tinyos自带的可以知道共有以下接口可以使用

TinyOs例子之TestSerial学习_第1张图片

3、实现中常用函数(implementation)

3.1Packet中的函数有

command void clear(message_t* msg); //清除packet内容

command uint8_t payloadLength(message_t* msg);//返回msg的数据(payload)长度

command void setPayloadLength(message_t* msg,uint8_t len); //设定packet的长度

command uint8_t maxPayloadLength();Return the maximum payload length that thiscommunication layer

command void* getPayload(message_t* msg, uint8_tlen);Return a pointer to aprotocol's payload region in a packet.例如:test_serial_msg*rcm=( test_serial_msg*)(callPacket.getPayload(&msg, sizeof(test_serial_msg_t))) 即返回test_serial_msg_t类型的结构体指针指向消息包的有效载荷区(数据区)

3.2Receive中的函数有

event message_t* receive(message_t* msg, void* payload, uint8_tlen);

* Receivea packet buffer, returning a buffer for the signaling component to use for thenext reception. The return value  can bethe same as msg, as long as the handling  component copies out the data it needs

3.3 Send中函数有

 

  command error_t send(message_t* msg, uint8_tlen);

  commanderror_t cancel(message_t* msg);

 

 

  event void sendDone(message_t* msg, error_terror);

  command uint8_t maxPayloadLength();

  command void* getPayload(message_t* msg,uint8_t len);

3.4SplitControl中的函数有

command error_t start();

 Start this component and all of itssubcomponents.  Return values of SUCCESSwill always result in a startDone()  event being signalled.

event void startDone(error_t error);

  /**

   *Notify caller that the component has been started and is ready to

   * receiveother commands.

   *

   *@param error -- SUCCESS if the component was successfully

  *                        turnedon, FAIL otherwise

   */

command error_t stop();

  Startthis component and all of its subcomponents. Return values of SUCCESS will always result in astartDone() event being signalled.

event void stopDone(error_t error);

   *Notify caller that the component has been stopped.

  * @paramerror -- SUCCESS if the component was successfully

 *                        turned off, FAIL otherwise

 

3.5AMSend中的函数有

 command error_tsend(am_addr_t addr, message_t* msg, uint8_t len);

    * Send a packet with a data payload oflen to address

 command error_tcancel(message_t* msg);

    * Cancel a requested transmission. ReturnsSUCCESS if the

    * transmission was canceled properly (notsent in its entirety).

event void sendDone(message_t* msg, error_t error);

    * Signaled in response to an accepted sendrequest. msg is

    * the message buffer sent, anderror indicates whether the send was successful.

command uint8_t maxPayloadLength();

*Return the maximum payload lengththat this communication layer can provide.

 *This command behaves identically toPacket.maxPayloadLength and is included in this

command void* getPayload(message_t* msg, uint8_t len);

    * Return a pointer to a protocol's payloadregion in a packet.

    * This command behaves identically toPacket.getPayload

* (minus the length parameter) and isincluded in this interface

下面是基于主动消息的接口

3.5AMPacket中的函数有

command am_addr_taddress(); 

  command am_addr_tdestination(message_t* amsg);

  command am_addr_tsource(message_t* amsg);

  command voidsetDestination(message_t* amsg, am_addr_t addr);

  command voidsetSource(message_t* amsg, am_addr_t addr);

  command boolisForMe(message_t* amsg);

  command am_id_ttype(message_t* amsg);

  command voidsetType(message_t* amsg, am_id_t t);

  command am_group_tgroup(message_t* amsg);

  command voidsetGroup(message_t* amsg, am_group_t grp);

  command am_group_tlocalGroup();

4、建立连接线

 components TestSerialC as App, LedsC, MainC;

 components SerialActiveMessageC as AM;

 components new TimerMilliC();

 App.Boot -> MainC.Boot;

 App.Control -> AM;

 App.Receive -> AM.Receive[AM_TEST_SERIAL_MSG];

 App.AMSend -> AM.AMSend[AM_TEST_SERIAL_MSG];

 App.Leds -> LedsC;

 App.MilliTimer -> TimerMilliC;

 App.Packet -> AM;

如下图:

 TinyOs例子之TestSerial学习_第2张图片

 

学习内容:

         i.             在这个例子中,主要是了解tinyos系统的基于主动消息的通信模型。在主动消息通信中,每个消息都维护一个应用层的处理器(处理子程序)。当目标节点收到这个消息后,会把这个消息中的数据作为参数,传递给应用层的处理器进行处理。

       ii.             主动消息的缓存管理机制

     iii.             主动消息的显示确认机制

      iv.             消息缓存抽象

/*

 * This resource is used toarbitrate access between ActiveMessageC,

 * Ieee154MessageC andpossibly future MessageC components to the

 * underlying radio driver.

 */

typedef nx_struct message_t {

  nx_uint8_theader[sizeof(message_header_t)];   //头部

  nx_uint8_tdata[TOSH_DATA_LENGTH];//有下载何区,数据

  nx_uint8_tfooter[sizeof(message_footer_t)];//尾部

  nx_uint8_tmetadata[sizeof(message_metadata_t)];//元数据

} message_t;

注意:headr/footer/metadata 都是不透明的,不可以直接访问。Data字节的访问必须通通过packet、Ampacket.

你可能感兴趣的:(TinyOS)