先再写一个 两块板之间的数据传输

本文详细介绍了如何在ZigBee协议栈ZStack-CC2530-2.3.0-1.4.0中配置串口,并实现数据的周期性发送与接收。通过具体代码示例,展示了配置串口参数、定义数据包处理函数、设置数据发送周期等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我想写的是ZigBee的广播  组播  点对点播,但是他们都是建立在这个传输的之上,所以先学习这个吧 ,顺便我也在学习一下。


首先打开一个协议栈。ZStack-CC2530-2.3.0-1.4.0   \    Projects    \    zstack    \   Samples   \   SampleApp    \   CC2530DB  怕你们弄混了就把目录贴出来。




一、    首先配置一下串口   :

1 先在SampleApp.c文件中添加串口头文件  #include   "MT_UART.h" 

2  然后在void SampleApp_Init( uint8 task_id )函数下添加以下内容。

void SampleApp_Init( uint8 task_id )
{
  SampleApp_TaskID = task_id;
  SampleApp_NwkState = DEV_INIT;
  SampleApp_TransID = 0;
  
<span style="color:#cc6600;">  MT_UartInit();
  MT_UartRegisterTaskID(task_id);//注册串口
  HALUARTWrite(0,"Reset",sizeof("Reset"));//提示复位  协调器复位一下  就打印一次也是证明串口配置好得标志</span>

/*
然后go to 进去MT_UartInit();函数
你会看到:
</pre><pre name="code" class="cpp">void MT_UartInit ()
{
  halUARTCfg_t uartConfig;


  /* Initialize APP ID */
  App_TaskID = 0;


  /* UART Configuration */
  uartConfig.configured           = TRUE;
  uartConfig.baudRate             =<span style="color:#33cc00;"> MT_UART_DEFAULT_BAUDRATE</span>;
  uartConfig.flowControl          = MT_UART_DEFAULT_OVERFLOW;
  uartConfig.flowControlThreshold = MT_UART_DEFAULT_THRESHOLD;
  uartConfig.rx.maxBufSize        = MT_UART_DEFAULT_MAX_RX_BUFF;
  uartConfig.tx.maxBufSize        = MT_UART_DEFAULT_MAX_TX_BUFF;
  uartConfig.idleTimeout          = MT_UART_DEFAULT_IDLE_TIMEOUT;
  uartConfig.intEnable            = TRUE;
#if defined (ZTOOL_P1) || defined (ZTOOL_P2)
  uartConfig.callBackFunc         = MT_UartProcessZToolData;
#elif defined (ZAPP_P1) || defined (ZAPP_P2)
  uartConfig.callBackFunc         = MT_UartProcessZAppData;
#else
  uartConfig.callBackFunc         = NULL;
</pre><pre name="code" class="cpp">*/
 然后  go to 到上边绿色的的值   
</pre><pre name="code" class="cpp">会看到
#if !defined( MT_UART_DEFAULT_OVERFLOW )
  #define MT_UART_DEFAULT_OVERFLOW       TRUE     <span style="color:#ff0000;">//如果你用的是 两线的串口DDL 那么就需要修改成 FALSE</span><div class="client_siderbar_list_item">
</div>
#endif


#if !defined MT_UART_DEFAULT_BAUDRATE
#define MT_UART_DEFAULT_BAUDRATE        <span style="color:#ff6666;"> HAL_UART_BR_38400 </span><span style="color:#cc0000;">   //这一句就是波特率值  默认  38400  我们改成 115200</span>
#endif
#define MT_UART_DEFAULT_THRESHOLD        MT_UART_THRESHOLD
#define MT_UART_DEFAULT_MAX_RX_BUFF      MT_UART_RX_BUFF_MAX
#if !defined( MT_UART_DEFAULT_MAX_TX_BUFF )

}



到这步我们的串口配置完了。如果烧到板子中  复位   就会打印Reset


打印出来的是不是乱码了!!!!!!!!!!!!!

进行一下配置



结果:





//////////////////////////////////////////////***************************************************************************************///////////////////////////////////////////////


接下来才是正事。


二 .Dat for   Receive And Send


回到SampleApp.c文件

先看看uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )函数

uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
{
  afIncomingMSGPacket_t *MSGpkt;
  (void)task_id;  // Intentionally unreferenced parameter

  if ( events & SYS_EVENT_MSG )
  {
    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
    while ( MSGpkt )
    {
      switch ( MSGpkt->hdr.event )
      {
        // Received when a key is pressed
        case KEY_CHANGE:
          SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
          break;

        // Received when a messages is received (OTA) for this endpoint
        case AF_INCOMING_MSG_CMD: 
          SampleApp_MessageMSGCB( MSGpkt );<span style="color:#ff0000;">//这是接收到的数据包处理函数   go  to  进去</span>
/*
         <span style="color:#009900;"> void SampleApp_MessageMSGCB( </span><span style="color:#993399;">afIncomingMSGPacket_t</span><span style="color:#ff6666;"> </span><span style="color:#009900;">*pkt )  </span><span style="color:#993399;">//我们的数据都在这里面 可以 go  to</span>
<span style="color:#993399;"> 进去  发现他是一个结构体   然后再go  to   afMSGCommandFormat_t  就会发现我们的数据都在那里 。
</span><span style="color:#009900;">          {
            uint16 flashTime;


            switch ( pkt->clusterId )
               {
             case SAMPLEAPP_PERIODIC_CLUSTERID:</span><span style="color:#ff0000;">//发送定义的数据包ID  #define SAMPLEAPP_PERIODIC_CLUSTERID     1</span>
<span style="color: rgb(51, 204, 0); white-space: pre;">			</span><span style="color:#ff0000;">//添加  HalUARTWrite(0,"I get  data",sizeof("<span style="font-family: Arial, Helvetica, sans-serif;">I get  data</span>"));//提示收到数据</span><span style="color:#33cc00;">
          </span><span style="color:#009900;">   break;


             case SAMPLEAPP_FLASH_CLUSTERID:
             flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
             HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
             break;
              }
          }
          */</span>
          break;

        // Received whenever the device changes state in the network
        case ZDO_STATE_CHANGE:
          SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
          if ( (SampleApp_NwkState == DEV_ZB_COORD)
              || (SampleApp_NwkState == DEV_ROUTER)
              || (SampleApp_NwkState == DEV_END_DEVICE) )
          {
            // Start sending the periodic message in a regular interval.   <span style="color:#ff0000;"> //下面的的三个参数决定发送数据的周期命脉</span>
            osal_start_timerEx(<span style="color:#ff6666;"> SampleApp_TaskID,   </span><span style="color:#ff0000;">//它就是任务ID  函数开头定义了 SampleAPP初始化任务ID</span><span style="color:#ff6666;">

                              SAMPLEAPP_SEND_PERIODIC_MSG_EVT,    </span><span style="color:#ff0000;"> //他在SampleApp.h文件中    #define SAMPLEAPP_SEND_PERIODIC_MSG_EVT   0x0001</span><span style="color:#ff6666;">
                              SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT </span>);  <span style="color:#ff0000;">//  #define SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT   5000  <span style="font-family: Arial, Helvetica, sans-serif;">时间  毫秒单位  5s</span></span>

          }
          else
          {
            // Device is no longer in the network
          }
          break;

        default:
          break;
      }

      // Release the memory
      osal_msg_deallocate( (uint8 *)MSGpkt );

      // Next - if one is available
      MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
    }

    // return unprocessed events
    return (events ^ SYS_EVENT_MSG);
  }

  // Send a message out - This event is generated by a timer
  //  (setup in SampleApp_Init()).
  if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )<span style="color:#ff0000;">//事件 ID标志号  #define SAMPLEAPP_SEND_PERIODIC_MSG_EVT    0x0001</span> 
  {
    // Send the periodic message
    SampleApp_SendPeriodicMessage();<span style="color:#ff0000;">//这是主要代码  这是周期性发射数据函数   go to 进去</span>
<span style="color:#009900;">/*</span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="color:#009900;">void SampleApp_SendPeriodicMessage( void )
{</span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="color: rgb(0, 153, 0); white-space: pre;">	</span><span style="color:#ff0000;">添加  uint8 data[</span><span style="color:#3333ff;">10</span><span style="color:#ff0000;">] = {'0','1','2','3','4','5','6','7','8','9'};</span><span style="color:#009900;">
  if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
                       SAMPLEAPP_PERIODIC_CLUSTERID,
                       1,   </span><span style="color:#ff0000;">//改成 </span><span style="color:#3333ff;">10</span><span style="color:#009900;">
                       (uint8*)&SampleAppPeriodicCounter,  </span><span style="color:#ff0000;">// 改成data</span><span style="color:#009900;">
                       &SampleApp_TransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  {
  }
  else
  {
    // Error occurred in request to send.
  }
}
</span></span>
<span style="color:#009900;"><span style="font-family: Arial, Helvetica, sans-serif;">*</span><span style="font-family: Arial, Helvetica, sans-serif;">/</span></span>
    // Setup to send message again in normal period (+ a little jitter)
    osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
        (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );

    // return unprocessed events
    return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
  }

  // Discard unknown events
  return 0;
}

好了 大部分代码 写完了  接着就是  写个函数将 语句读出来

找到下边 这个函数   就是  读出  信息的函数了   我们做一些  修改 。

void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  uint16 flashTime;

  switch ( pkt->clusterId )
  {
    case SAMPLEAPP_PERIODIC_CLUSTERID:
<span style="white-space:pre">	</span>HalUARTWrite(0,"I get data",sizeof(<span style="font-family: Arial, Helvetica, sans-serif;">"I get data"</span>));<span style="color:#ff0000;">//提示收到数据</span>
<span style="white-space:pre">	</span>HalUARTWrite(0,&pkt->cmd.Data[0],10);<span style="color:#ff0000;">//指针打印数据</span>
<span style="white-space:pre">	</span>HalUARTWrite(0,"\n",1);<span style="color:#ff0000;">//换行</span>
      break;

    case SAMPLEAPP_FLASH_CLUSTERID:
      flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
      HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
      break;
  }
}

然后进行烧写 需要注意是





实验结果




我的源码  http://download.csdn.net/detail/csdnhejingzhou/9218595

后面写的  广播   组播  点对点  都是依托此实训 写的 。

敬请期待。





### C语言实现向两块EEPROM连续写入数据 为了实现在C语言中向两块EEPROM连续写入数据的功能,可以采用I2C协议来通信。每一块EEPROM都有唯一的地址,在初始化阶段定义好这两块设备的地址。 当准备写入数据到两个不同的EEPROM芯片时,选择第一个目标EEPROM并完成所需的数据传输操作;之后再切换至第二个EEPROM继续执行类似的流程[^1]。 下面是一个简单的例子展示如何通过I2C接口对两块不同地址的24LC02B型号EEPROM进行连续写入: ```c #include <stdint.h> #include "iic.h" // 假设这是自定义库文件用于处理IIC/I2C通讯 #define EEPROM_ADDR_1 0xA0 /* 设备1 I2C 地址 */ #define EEPROM_ADDR_2 0xA8 /* 设备2 I2C 地址 */ void write_to_eeprom(uint8_t addr, uint16_t mem_addr, const void *data, size_t length){ iic_start(); iic_write(addr); // 发送起始位置高字节和低字节 iic_write((mem_addr >> 8) & 0xFF); iic_write(mem_addr & 0xFF); while (length--) { iic_write(*(((uint8_t *) data)++)); } iic_stop(); } // 主函数部分 int main(){ char buffer[] = {'H', 'e', 'l', 'l', 'o'}; // 向第一块EEPROM写入数据 write_to_eeprom(EEPROM_ADDR_1, 0x00, buffer, sizeof(buffer)); // 向第二块EEPROM写入相同或不同数据 write_to_eeprom(EEPROM_ADDR_2, 0x00, buffer, sizeof(buffer)); return 0; } ``` 上述代码片段展示了基本框架,实际应用可能还需要考虑错误处理机制以及更复杂的逻辑控制以适应具体应用场景的需求。此外,对于某些特定硬件平台来说,具体的寄存器配置可能会有所不同,请参照相应开发的手册调整参数设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值