ZStack-CC2530-2.5.1a开发(九)串口收发通信(改造协议栈里的串口回调函数)

ZStack版本:ZStack-CC2530-2.5.1a
下载和调试器:SmartRF04EB
IDE开发软件:IAR Embedded Workbench IDE - 8051 10.20.1
开发平台:基于TI-CC2530的任意厂家的
工程模板:ZStack-CC2530-2.5.1a\Projects\zstack\Samples\GenericApp
1、建立工程
安装ZStack-CC2530-2.5.1a协议栈,双击ZStack-CC2530-2.5.1a协议栈文件,按照提示,一步步按照协议栈。
安装好协议栈后,按照前面博文ZStack-CC2530-2.5.1a开发(一)工程建立https://blog.csdn.net/fhkj5769/article/details/104990850的步骤,建立工程,并打开工程。
2、添加串口相关代码
以协调器设置模式为例,其余模式步骤相同。
2.1添加相关头文件
在Coordination.c文件中的头文件末尾处,添加如下头文件:

#include "MT_UART.H"
#include "MT.h"

2.2 添加串口初始化函数
在Coordination.c文件中的用户任务初始化函数GenericApp_Init的最后添加如下代码

MT_UartInit ();
MT_UartRegisterTaskID(GenericApp_TaskID);

2.3 添加串口事件处理分支
在Coordination.c文件中的用户事件处理函数GenericApp_ProcessEvent中,添加如下分支代码:

case CMD_SERIAL_MSG:
      SerialData_Proccess(((mtOSALSerialData_t*)MSGpkt)->msg);
break;

2.4 添加串口数据处理函数
在Coordination.c文件中的函数声明处,添加串口数据处理函数的声明:

void SerialData_Proccess(uint8* msg);

在Coordination.c文件的末尾,添加串口数据处理函数的定义

void SerialData_Proccess(uint8* msg)
{
  if(zgDeviceLogicalType == ZG_DEVICETYPE_COORDINATOR)
    HalUARTWrite(0,msg+1,*msg);
  else if(zgDeviceLogicalType == ZG_DEVICETYPE_ROUTER)
    HalUARTWrite(0,msg+1,*msg);
  else if(zgDeviceLogicalType == ZG_DEVICETYPE_ENDDEVICE)
    HalUARTWrite(0,msg+1,*msg);
}

3、改造协议栈中关于监控串口的相关代码
3.1 更改串口基本设置
在MT_UART.h头文件中,将

#define MT_UART_DEFAULT_BAUDRATE         HAL_UART_BR_38400

改成

#define MT_UART_DEFAULT_BAUDRATE         HAL_UART_BR_115200

#define MT_UART_DEFAULT_OVERFLOW       TRUE

改成

#define MT_UART_DEFAULT_OVERFLOW       FALSE

3.2 改造串口数据回调函数
将MT_UART.c文件中的MT_UartProcessZToolData更改如下:

void MT_UartProcessZToolData ( uint8 port, uint8 event )
{
#if 1
  uint8  ch;
    uint8  rxBuffer[128];
    uint8 len = 0;
    uint8 i;
    while (Hal_UART_RxBufLen(port))
    {      		
	HalUARTRead (port, &ch, 1);
	rxBuffer[len+1]  = ch;
	len++;  	
    }  	
    if(len)
    {   rxBuffer[0] = len;   		
        pMsg = (mtOSALSerialData_t *)osal_msg_allocate( sizeof ( mtOSALSerialData_t )+len+1);
        if (pMsg)
        {
             /* Fill up what we can */
             pMsg->hdr.event = CMD_SERIAL_MSG;
             pMsg->msg = (uint8*)(pMsg+1);
             for(i = 0; i<= len; i++)
             pMsg->msg[i] = rxBuffer[i];
             osal_msg_send(App_TaskID,(byte*)pMsg);
             osal_msg_deallocate((uint8*)pMsg);
        }
    } 
#else
............................................
原代码内容
............................................
#endif
}

使用#if #else #endif 语句将原来函数中语句移除编译,添加新语句编译。
4、测试
4.1 添加网络状态改变打印函数
在Coordination.c文件中的用户事件处理函数GenericApp_ProcessEvent的网络状态改变分支的if语句中添加:

HalUARTWrite(0,"device is ok!\r\n",osal_strlen("device is ok!\r\n"));

4.2 编译下载
在上位机打开串口调试软件,波特率为115200,将代码烧录到芯片并运行,串口打印出信息:
"device is ok!”。同过串口发送数据,数据可正确回传到上位机。
5、更改UART0位置,进行测试
ZStack-CC2530-2.5.1a协议栈串口0默认位于位置1:P0_2----RX P0_3----TX,
如果你的板子串口0位于位置2:P1_4----RX P1_5----TX,将串口位置由位置1更改为位置2的方法如下:
打开_hal_uart_dma.c文件,在static void HalUARTInitDMA(void)函数体中,将
PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O to Alt. 1 location on P0.注释掉,
添加PERCFG |= HAL_UART_PERCFG_BIT; // Set UART0 I/O to Alt. 2 location on P1.
将PxSEL |= HAL_UART_Px_RX_TX;注销,添加P1SEL |= 0x30; // Enable Tx and Rx on P1.两条语句。

#if (HAL_UART_DMA == 1)
  //PERCFG &= ~HAL_UART_PERCFG_BIT;    // Set UART0 I/O to Alt. 1 location on P0.
  PERCFG |= HAL_UART_PERCFG_BIT;    // Set UART0 I/O to Alt. 2 location on P1
#else
........
//PxSEL  |= HAL_UART_Px_RX_TX;
P1SEL  |= 0x30;       // Enable Tx and Rx on P1.

更改完成后,UART0的位置就被放到了P1口,编译下载测试即可。

你可能感兴趣的:(Zigbee)