基于CC2430/31的Zigbee实践(7)—Zstack1.4.3实现协调器和路由器之间串口通信

define symbols :CC2430DB、HAL_UART

一、初始化UART
   在ZMain中的HalDriverInit()函数根据HAL_UART预定于变量 初始化UART。HalUARTInit()初始化UART 0 。在Hal_board_cfg.h中使能UART0:

#define HAL_UART_0_ENABLE  TRUE
#define HAL_UART_1_ENABLE  FALSE

在HalUARTInit()中如果没有使能HAL_UART_DMA,则仅仅做以下代码的执行工作:

// Set UART0 I/O location to P0.
PERCFG &= ~HAL_UART_0_PERCFG_BIT;
/* Enable Tx and Rx on P0 */
P0SEL |= HAL_UART_0_P0_RX_TX;
/* Make sure ADC doesnt use this */
ADCCFG &= ~HAL_UART_0_P0_RX_TX;
/* Mode is UART Mode */
U0CSR = CSR_MODE;
/* Flush it */
U0UCR = UCR_FLUSH;

二、打开UART0
      在SampleApp_Init()后添加自己的应用,打开UART0:

  //UART Configuration
halUARTCfg_t uartConfig;
uartConfig.configured = TRUE;
uartConfig.baudRate = HAL_UART_BR_38400;
uartConfig.flowControl = FALSE;
uartConfig.flowControlThreshold = 1;
uartConfig.rx.maxBufSize = 255;
uartConfig.tx.maxBufSize = 255;
uartConfig.idleTimeout = 1;
uartConfig.intEnable = TRUE;
uartConfig.callBackFunc = rxCB;
HalUARTOpen (HAL_UART_PORT_0, &uartConfig);

    其中uartConfig.callBackFunc = rxCB; 因此需要在SampleApp.c中添加自己的UART回调函数(也就是说当UART0中断产生时,需要调用该函数,进行数据处理)

#define UART_BUFFER_MAX_LENGTH 255
void rxCB( uint8 port,uint8 events )
{
uint8 temp[UART_BUFFER_MAX_LENGTH]; //the max length is 255
uint8 cnt;
cnt=HalUARTRead(port,temp,UART_BUFFER_MAX_LENGTH); //芯片通过串口读数据
//HalUARTWrite(port,temp, cnt);
if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
    SAMPLEAPP_PERIODIC_CLUSTERID,
    cnt,
    temp,//(uint8*)&SampleAppPeriodicCounter,
    &SampleApp_TransID,
    AF_DISCV_ROUTE,
    AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  {
  }
  else
  {
    // Error occurred in request to send.
  }
}

     在语句cnt=HalUARTRead(port,temp,UART_BUFFER_MAX_LENGTH);穿进去的是UART_BUFFER_MAX_LENGTH,但是返回的是在 rxBuf中的数据temp的长度。(因为是非定长的)。然后根据返回的cnt值,来决定发送广播发送数据的长度。
    这个rxCB()实现的是从串口缓冲区中读取数据,并且将读到的数据广播发送出去。如果//HalUARTWrite(port,temp, cnt); 不注释的话,那么会将独到的数据在本地串口 调试助手上显示。

三、实现 任意长度字符串发送
   将缓冲区的原始值设为’/0’, 更改hal_uart.c中的串口收发 函数
  1)将缓冲区设为’/0’
    在HalUARTOpen()函数中在分配了 串口的收 、 发缓冲区后,将缓冲区都置为'/0’.
    osal_memset(cfg->txBuf,0,cfg->txMax+1 );
     osal_memset(cfg->rxBuf,0,cfg->rxMax+1 );

  2)收处理, HalUARTWrite不需要改动
    收:HalUARTRead,当每读完一个字符将该位置的字符置为’/0’

while ( (cfg->rxTail != cfg->rxHead) && (cnt < len) &&(cfg->rxBuf[cfg->rxTail]!='/0') )
  {
    *buf++ = cfg->rxBuf[cfg->rxTail];
    cfg->rxBuf[cfg->rxTail]='/0';  //将读取过的地方复位为/0. 初始化时全为/0
    if ( cfg->rxTail == cfg->rxMax )
    {
      cfg->rxTail = 0;
    }
    else
    {
      cfg->rxTail++;
    }
    cnt++;
  }

四、实验现象

COM1为协调器(想路由器定时发送 Coordin,COM2为路由器 向协调器定时发送 RouterZ
协调器通过 串口发送 字符串 zhoujun haha xiuzing/nlixujing/n

基于CC2430/31的Zigbee实践(7)—Zstack1.4.3实现协调器和路由器之间串口通信_第1张图片 

基于CC2430/31的Zigbee实践(7)—Zstack1.4.3实现协调器和路由器之间串口通信_第2张图片

你可能感兴趣的:(基于CC2430/31的Zigbee实践(7)—Zstack1.4.3实现协调器和路由器之间串口通信)