打印
[Atmel]

轻型网络简单远程实例解析

[复制链接]
650|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ddllxxrr|  楼主 | 2015-12-10 21:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
每天跟我读点资料,读得是轻型网络栈。但读到最后总有用的一天。

我今天看个轻型网络栈的一个例程,简单远程

我想把我读到的写一下:

首先在config.h中定义如下:

#ifndef _CONFIG_H_
#define _CONFIG_H_

/*- Definitions ------------------------------------------------------------*/

// Address must be set to 0 for the first device, and to 1 for the second one.
#define APP_ADDR                  0
#define APP_CHANNEL               0x0f
#define APP_PANID                 0x4567
#define APP_ENDPOINT              1

#define NWK_BUFFERS_AMOUNT                  3
#define NWK_DUPLICATE_REJECTION_TABLE_SIZE  5
#define NWK_DUPLICATE_REJECTION_TTL         1000 // ms
#define NWK_ROUTE_TABLE_SIZE                5
#define NWK_ROUTE_DEFAULT_SCORE             3
#define NWK_ACK_WAIT_TIME                   1000 // ms

#define NWK_ENABLE_ROUTING

#endif // _CONFIG_H_


这里边最最重要的一句话是: Address must be set to 0 for the first device, and to 1 for the second one.


比如你有两块开发板:这里必须变成第一个是0第二个是1,我想就是把地址打散,这样才能通讯。




又定义如下数据结构:



typedef enum AppState_t
{
  APP_STATE_INITIAL,
  APP_STATE_IDLE,
  APP_STATE_WAIT_CONF,
} AppState_t;

typedef struct AppMessage_t
{
  uint8_t buttonState;
} AppMessage_t;


而在mdkDataReq.h中定义了系统及的数据结构


typedef struct NWK_DataReq_t
{
  // service fields
  void         *next;
  void         *frame;
  uint8_t      state;

  // request parameters
  uint16_t     dstAddr;
  uint8_t      dstEndpoint;
  uint8_t      srcEndpoint;
  uint8_t      options;
#ifdef NWK_ENABLE_MULTICAST
  uint8_t      memberRadius;
  uint8_t      nonMemberRadius;
#endif
  uint8_t      *data;
  uint8_t      size;
  void         (*confirm)(struct NWK_DataReq_t *req);

  // confirmation parameters
  uint8_t      status;
  uint8_t      control;
} NWK_DataReq_t;



而按键的状态靠这个函数发出去
/*************************************************************************//**
*****************************************************************************/
static void appSendMessage(uint8_t state)
{
  appMessage.buttonState = state;

  appNwkDataReq.dstAddr = 1 - APP_ADDR;
  appNwkDataReq.dstEndpoint = APP_ENDPOINT;
  appNwkDataReq.srcEndpoint = APP_ENDPOINT;
  appNwkDataReq.options = NWK_OPT_ACK_REQUEST;
  appNwkDataReq.data = (uint8_t *)&appMessage;
  appNwkDataReq.size = sizeof(appMessage);
  appNwkDataReq.confirm = appDataConf;

  NWK_DataReq(&appNwkDataReq);

  appState = APP_STATE_WAIT_CONF;
}


而收函数是靠这个函数接的

/*************************************************************************//**
*****************************************************************************/
static bool appDataInd(NWK_DataInd_t *ind)
{
  AppMessage_t *msg = (AppMessage_t *)ind->data;

  if (msg->buttonState)
    HAL_GPIO_LED_set();
  else
    HAL_GPIO_LED_clr();

  return true;
}



对比系统定义的数据结构,其实就一个在工作。就是data.
收和发都是通过这个变量来进行的。

而对状态处理如下,主要是自已赋值:从一个状态到另一个靠自己改变。

/*************************************************************************//**
*****************************************************************************/
static void APP_TaskHandler(void)
{
  switch (appState)
  {
    case APP_STATE_INITIAL:
    {
      // Hardware initialization
      HAL_GPIO_BUTTON_in();
      HAL_GPIO_BUTTON_pullup();

      HAL_GPIO_LED_out();
      HAL_GPIO_LED_set();

      // Network initialization
      NWK_SetAddr(APP_ADDR);
      NWK_SetPanId(APP_PANID);
      PHY_SetChannel(APP_CHANNEL);
      PHY_SetRxState(true);

      NWK_OpenEndpoint(APP_ENDPOINT, appDataInd);

      appState = APP_STATE_IDLE;
    } break;

    case APP_STATE_IDLE:
    {
      if (appButtonState != HAL_GPIO_BUTTON_read())
      {
        appButtonState = HAL_GPIO_BUTTON_read();
        appSendMessage(appButtonState);
      }
    } break;

    case APP_STATE_WAIT_CONF:
      break;
  }
}
而主函数就是在不断的循环一个管网络堆栈,一个管状态判断

/*************************************************************************//**
*****************************************************************************/
int main(void)
{
  SYS_Init();

  while (1)
  {
    SYS_TaskHandler();
    APP_TaskHandler();
  }
}


这个程序我想就是两个板对发数据,其中的一个按下,另外的LED就亮,相反也可。

等近几天做个实验验证一下。

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2398

主题

6955

帖子

67

粉丝