5989|11

144

帖子

2

TA的资源

一粒金砂(高级)

楼主
 

SimpliciTI协议的点对点通信 [复制链接]

点对点通信中,没有中心节点,有2个终端设备ED,烧录LinkTo.c的ED是Talker,烧录ListenLink.c的是Listener。
Talker的按键按下后,会发出link信息;Listener的按键按下后,会去侦听Talker发出的link信息,当连接成功后,Talker和Linker之间就可以进行通信了。
下面首先是Talker的LinkTo.c的程序
static void linkTo(void);                   //开头是都一些函数的声明

void toggleLED(uint8_t);

static uint8_t  sTxTid=0, sRxTid=0;
static linkID_t  sLinkID1 = 0;
static uint8_t  sRxCallback(linkID_t);

#define SPIN_ABOUT_A_SECOND  NWK_DELAY(1000)   //这是simpliciTI-IAR-1.2.0中新增的延时函数,延时时间不精确,但在LED上使用问题不大

void main (void)
{
  BSP_Init();                                     //硬件目标板的初始化(初始化使得LED1和LED2同时熄灭)

#ifdef I_WANT_TO_CHANGE_DEFAULT_ROM_DEVICE_ADDRESS_PSEUDO_CODE
  {
    addr_t lAddr;
    createRandomAddress(&lAddr);
    SMPL_Ioctl(IOCTL_OBJ_ADDR, IOCTL_ACT_SET, &lAddr); //设置Talker device的地址
  }
#endif
  SMPL_Init(sRxCallback);                               //Radio和SimpliciTI协议栈初始化
  /* turn on LEDs. */
  if (!BSP_LED2_IS_ON())                           //一上电,Talker的LED1和LED2同时亮
  {
    toggleLED(2);
  }
  if (!BSP_LED1_IS_ON())
  {
    toggleLED(1);
  }

/* wait for a button press... */
  do {
    FHSS_ACTIVE( nwk_pllBackgrounder( false ) ); /* manage FHSS */ //等待按键按下,当按键按下后发出Link信号,并等待连接
    if (BSP_BUTTON1() || BSP_BUTTON2())
    {
      break;
    }
  } while (1);

linkTo();
  while (1) ;
}

static void linkTo()
{
  uint8_t  msg[2], delay = 0;

  while (SMPL_SUCCESS != SMPL_Link(&sLinkID1))                       //等待连接的过程中,LED1和LED2闪烁
  {
/* blink LEDs until we link successfully */
    toggleLED(1);
    toggleLED(2);
    SPIN_ABOUT_A_SECOND; /* manages FHSS implicitly */
  }

/* we're linked. turn off red LED. received messages will toggle the green LED. */
  if (BSP_LED2_IS_ON())                       //当连接成功,Talker的LED2熄灭,而LED1继续亮
  {
    toggleLED(2);
  }

#ifndef FREQUENCY_HOPPING
/* turn on RX. default is RX off. */
  SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_RXON, 0);
#endif

/* put LED to toggle in the message */
  msg[0] = 2;  /* toggle red */
  while (1)
  {
    SPIN_ABOUT_A_SECOND; /* manages FHSS implicitly */
    if (delay > 0x00)
    {
      SPIN_ABOUT_A_SECOND; /* manages FHSS implicitly */
    }
    if (delay > 0x01)
    {
      SPIN_ABOUT_A_SECOND; /* manages FHSS implicitly */
    }
    if (delay > 0x02)
    {
      SPIN_ABOUT_A_SECOND; /* manages FHSS implicitly */
    }

/* delay longer and longer -- then start over */
    delay = (delay+1) & 0x03;
    /* put the sequence ID in the message */
    msg[1] = ++sTxTid;
    SMPL_Send(sLinkID1, msg, sizeof(msg));
  }
}


void toggleLED(uint8_t which)     //翻转LED1或LED2
{
  if (1 == which)
  {
    BSP_TOGGLE_LED1();
  }
  else if (2 == which)
  {
    BSP_TOGGLE_LED2();
  }
  return;
}

/* handle received frames. */
static uint8_t sRxCallback(linkID_t port)    //接收数据处理函数
{
  uint8_t msg[2], len, tid;

  /* is the callback for the link ID we want to handle? */
  if (port == sLinkID1)
  {
    /* yes. go get the frame. we know this call will succeed. */
     if ((SMPL_SUCCESS == SMPL_Receive(sLinkID1, msg, &len)) && len)
     {
/* Check the application sequence number to detect
        * late or missing frames...
        */
       tid = *(msg+1);
       if (tid)
       {
         if (tid > sRxTid)
         {

           toggleLED(*msg);
           sRxTid = tid;
         }
       }
       else
       {

         if (sRxTid)
         {

           toggleLED(*msg);
           sRxTid = tid;
         }
       }

       return 1;
     }
  }

  return 0;
}
通过上面的粉红字,可以看到Talker的LinkTo大致是这样的:        而Listener的ListenLink.c大致是这样的:
    初始化硬件目标板                                                                         初始化硬件目标板
    设置Talker的地址                                                                          设置Listener的地址
    初始化Radio和协议栈                                                                   初始化Radio和协议栈
    上电,Talker的LED1、LED2都亮                                                 上电,Listener的LED1、LED2都亮
   按键按下,发出Link信号,等待连接                                              按键按下,LED1熄灭,LED2继续亮
  连接成功,LED1继续亮,LED2熄灭                                               进入侦听状态,直至侦听到Talker发出的Link信息
接下来时Listener的ListenLink.c的程序
static void linkFrom(void);     //开头也是一些函数的声明


void toggleLED(uint8_t);


static          uint8_t  sRxTid = 0;
static          linkID_t sLinkID2 = 0;
static volatile uint8_t  sSemaphore = 0;
static uint8_t sRxCallback(linkID_t);


void main (void)
{
  BSP_Init();                                          //硬件目标板的初始化(板子初始化使得LED1和LED2都熄灭)
#ifdef I_WANT_TO_CHANGE_DEFAULT_ROM_DEVICE_ADDRESS_PSEUDO_CODE
  {
    addr_t lAddr;


    createRandomAddress(&lAddr);
    SMPL_Ioctl(IOCTL_OBJ_ADDR, IOCTL_ACT_SET, &lAddr);  //设置Listener的地址
  }
#endif


  SMPL_Init(sRxCallback);                                    //初始化Radio和协议栈         


/* turn on LEDs. */
  if (!BSP_LED2_IS_ON())                           //刚上电时,Listener的LED1和LED2同时亮
  {
    toggleLED(2);
  }
  if (!BSP_LED1_IS_ON())
  {
    toggleLED(1);
  }
   
/* wait for a button press... */
  do {
    FHSS_ACTIVE( nwk_pllBackgrounder( false ) ); /* manage FHSS */
    if (BSP_BUTTON1() || BSP_BUTTON2())                        // 等待按键被按下,当按键按下...
    {
      break;
    }
  } while (1);


  linkFrom();
  while (1) ;
}


static void linkFrom()
{
  uint8_t     msg[2], tid = 0;


/* Turn off one LED so we can tell the device is now listening.
   * Received messages will toggle the other LED.
   */
  toggleLED(1);                                        //当按键按下,Listener的LED1熄灭,LED2继续亮,并进入侦听Link信息状态


/* listen for link forever... */
  while (1)
  {
/* SMPL_LinkListen handles FHSS implicittly */
    if (SMPL_SUCCESS == SMPL_LinkListen(&sLinkID2))
    {
      break;                                                                                                  //侦听Link信息成功,退出循环
    }
  }


/* turn on LED1 on the peer in response to receiving a frame. */
   *msg = 0x01;                                                                                                   
/* turn on RX. default is RX off. */
   SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_RXON, 0);
   while (1)
   {
    FHSS_ACTIVE( nwk_pllBackgrounder( false ) ); /* manage FHSS */


        if (sSemaphore)
     {
       *(msg+1) = ++tid;
       SMPL_Send(sLinkID2, msg, 2);


       sSemaphore = 0;
     }
   }
}


void toggleLED(uint8_t which)
{
  if (1 == which)
  {
    BSP_TOGGLE_LED1();
  }
  else if (2 == which)
  {
    BSP_TOGGLE_LED2();
  }
  return;
}


/* handle received messages */
static uint8_t sRxCallback(linkID_t port)
{
  uint8_t msg[2], len, tid;


/* is the callback for the link ID we want to handle? */
  if (port == sLinkID2)
  {
  /* yes. go get the frame. we know this call will succeed. */
  if ((SMPL_SUCCESS == SMPL_Receive(sLinkID2, msg, &len)) && len)//我觉得 if (SMPL_SUCCESS == SMPL_Receive(sLinkID2, msg, &len))
     {                                                                                                                  //就可以了,接收成功就好了,不理解后面为什么要和len相与???求指导!
/* Check the application sequence number to detect
        * late or missing frames...
        */
   tid = *(msg+1);
       if (tid)    //当连接成功之后,Talker向Listen发送确认信息,那时msg[1]就已经是1了,所以tid没有可能是0的,所以觉得else之后的是多余???                                  //求指导!!!       
       {
         if (tid > sRxTid) //当第一次数据交换之后,tid=++sTxTid(已经是1了),而此时sRxTid=0,即使多次数据交换之后,tid也总是大于sRxTid的,即
         {                           //tid > sRxTid总为真,这里是不是也是多余啊????严重求指导!!!
        
           toggleLED(*msg);
           sRxTid = tid;
         }
       }
       else
       {


         if (sRxTid)
         {
      
           toggleLED(*msg);
           sRxTid = tid;
         }
       }
/* Post to the semaphore to let application know so it sends
        * the reply
        */
       sSemaphore = 1;
   
       return 1;
     }
  }
  return 0;

}
我没有在上面描述数组msg[2],从资料上了解到,该数组存放了2个字节:第1个字节,表示闪烁灯的标号;第2个字节,表示当前是第几次数据交换。
当Talker和Listener的按键都被按下,Talker发出link信息,Listener侦听到该Link信息并建立起连接,当连接成功之后,Talker会向Listener发送确认信息,而这个确认信息就是数组msg[2](msg[0]和msg[1])
在Talker的LinkTo.c的LinkTo()函数中,可以知道,msg[0]=2,msg[1]=++sTxTid;,通过  SMPL_Send(sLinkID1, msg, sizeof(msg));发送给Listener,而Listener在ListenLink.c的接收数据处理函数static uint8_t sRxCallback(linkID_t port)中通过SMPL_Receive(sLinkID2, msg, &len)函数接收该信息,并按照指令toggleLED(*msg);将相应的LED翻转(因为第一次通信时,msg[0]=2.于是让Listener的LED2翻转,即LED2熄灭),而且,Listener会将当前的交换次数msg[1]保存在变量tid中,也会通过 SMPL_Send(sLinkID2, msg, sizeof(msg))向Talker发送确认信息。
且msg[0]=0x01,msg[2]=++tid;当Talker接收到这个确认信息时,也会翻转相应的LED,在这里,Talker熄灭了LED1。
通过上面的粉红字,可以看到Talker的LinkTo大致是这样的:        而Listener的ListenLink.c大致是这样的:
    初始化硬件目标板                                                                         初始化硬件目标板
    设置Talker的地址                                                                          设置Listener的地址
    初始化Radio和协议栈                                                                   初始化Radio和协议栈
    上电,Talker的LED1、LED2都亮                                                 上电,Listener的LED1、LED2都亮
   按键按下,发出Link信号,等待连接                                              按键按下,LED1熄灭,LED2继续亮
  连接成功,LED1继续亮,LED2熄灭                                               进入侦听状态,直至侦听到Talker发出的Link信息

Talker 向Listener发送确认信息:                                                      Listener 接收来自Talker的确认信息:
                                    msg[0]=2                                                        按照确认信息,熄灭LED2     
                                    msg[1]=++sTxTid                                           tid=msg[1]当前交换次数保存在变量tid里
                                                                                                               Listener接收完确认信息后,又向Talker发送确认信息:
                                                                                                                                                                      msg[0]=0x01;
                                                                                                                                                                       msg[1]=++tid;  
Talker接收来自Listener的确认信息:     
                     熄灭LED1
                     tid=msg[1];
但是到了这里,通信好像就停止了,因为在Talker的LinkTo()函数中,msg[1]不是msg[1]=++tid,而是msg[1]=++sTxTid  ???
对这里的回调函数  static uint8_t sRxCallback(linkID_t port)  ,了解到它是无线收发的中断服务函数中会被调用一次,也就明白
SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_RXON, 0)存在的意义,相当于开中断。
而 现在不理解的就是回调函数 !!!   向各位大神求助,先谢过                                                      




此帖出自编程基础论坛

最新回复

求教!!!为什么我用这个程序,LED1一直闪,按什么键都没有反应  详情 回复 发表于 2015-8-7 14:00
点赞 关注(1)
 

回复
举报

144

帖子

2

TA的资源

一粒金砂(高级)

沙发
 
有没有哪位大侠想转让手里头的eZ430 RF 2500?我想要
此帖出自编程基础论坛
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

板凳
 
SimpliciTI的操作比较简单,只调用了几步而已。
不信,从main()函数看起:


此帖出自编程基础论坛
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

4
 
抱歉,画的图不能直接粘贴,只能上传附件,里面是我对simple_Peer_to_Peer整个程序的理解以及出现的疑惑,欢迎大家参与讨论!

simple_peer_to_peer.doc

63.5 KB, 下载次数: 41

此帖出自编程基础论坛
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

5
 
这是simpliciTI-IAR-1.2.0中基于SRF05_8051平台的例程simple_Peer_to_Peer,大家如果不是很理解word中的图,可以自己看例程。

Simple_Peer_To_Peer.zip

17.51 KB, 下载次数: 20

此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

6
 
嗯,我看到你的邮件了,这几天晚上有点忙,等我闲下来看看
此帖出自编程基础论坛

点评

恩~好的。您忙您的,我的问题已经解决。 然后,至于远一点好,还是近一点好,是频段的问题,433和915的区别。 再次感谢!  详情 回复 发表于 2014-4-22 21:42
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

7
 
辛昕 发表于 2014-4-22 21:27
嗯,我看到你的邮件了,这几天晚上有点忙,等我闲下来看看

恩~好的。您忙您的,我的问题已经解决。
然后,至于远一点好,还是近一点好,是频段的问题,433和915的区别。
再次感谢!
此帖出自编程基础论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

8
 
蟹蟹,LZ的分享
此帖出自编程基础论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

9
 
你好,我是一名刚刚出来工作的大学生,最近在做这个simpliciti无线组网的协议,看了你谢谢的几篇文章都得到很多收获,但是还是有一些问题还没有解决,可以加一下你的QQ问你吗?
此帖出自编程基础论坛

点评

您好,这个课题是我一年前参与的,协议栈的很多东西现在也有些忘记了。当时在论坛里得到了移位热心坛友的帮助,他建议我直接去ti英文官网找帖子和文档,这样的确比中文百度节省很多时间  详情 回复 发表于 2015-6-5 11:02
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(中级)

10
 
mark
此帖出自编程基础论坛
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

11
 
阳阳熊猫 发表于 2015-5-30 16:32
你好,我是一名刚刚出来工作的大学生,最近在做这个simpliciti无线组网的协议,看了你谢谢的几篇文章都得到很多收获,但是还是有一些问题还没有解决,可以加一下你的QQ问你吗?

您好,这个课题是我一年前参与的,协议栈的很多东西现在也有些忘记了。当时在论坛里得到了移位热心坛友的帮助,他建议我直接去ti英文官网找帖子和文档,这样的确比中文百度节省很多时间
此帖出自编程基础论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

12
 
求教!!!为什么我用这个程序,LED1一直闪,按什么键都没有反应
此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表