协议栈中的MT包实现UART的发送与接收..doc
文本预览下载声明
协议栈中的MT包实现UART的发送与接收
文档说明
Zigbee协议栈已经把使用串口的条件准备好了,从应用角度讲,利用协议栈现有平台即ZStack自带的MT包来实现自己的串口应用,只需对协议栈做一些修改就可以实现URAT发送与接收的功能。
编写人员:任一权,刘童
版本更新记录,编写版本:V0.1 时间:2012-12-15
关键函数的解析
MT_UartInit ()①
这是为UART串口传输数据而初始化的MT函数包,在其中定义了串口的波特率,最大接收发送数据量,传输模式等相关配置。在这里的各项参数不需要改变,保持系统默认即可。
MT_UartProcessZToolData()②
这是MT程序包中URAT接收数据的代码,在这里面需要修改的地方是,在数据接收完毕后需要添加一个回车,便于我们区分不同传输数据,具体的代码为UartRxBuf.RxBuf[count]=\n;此段代码需要添加在count++;后,这里注意一下count,一会还会用到。
hal_board_cfg.h③
首先说明一下,串口接收发送数据的方式有两种:一种是中断模式,另一种是DMA模式,这里是使用中断模式。而在hal_board_cfg.h中,DMA模式的优先级要高于中断模式的,这里最简单的解决方案就是将DMA的那段预编译注释掉,即仅留一种模式——中断。
void Sampleapp_Init④
这是应用层函数初始化,即对我们自己的具体应用进行初始化,在这里面需要添加两段代码MT_UartInit()和MT_UartRegisterTaskID(SampleApp_TaskID);这两端代码要添加在Sampl Init()中。
MT_UartInit()
这段代码的作用初始化Uart接口,初始化接口配置。
MT_UartRegisterTaskID(SampleApp_TaskID);⑤
这段代码是注册一个处理串口的任务。
Sampleapp_ProcessEvent⑥
这就是我们的具体应用处理函数了,我们这里主要要用到的是串口接收和发送,所以对应的代码是case SPI_INCOMING_ZTOOL_PORT:处理此事件的代码为UartRxComCallBack();这个函数就是我们接收PC机上发送的以串字符后的操作。
代码功能及执行流程
至此,串口发送接受数据的已经全部修改完毕,可以将程序下载到板子上,利用PC机上的程序调试助手向2530发送数据,在程序调试助手和板子上的液晶屏上分别显示。我们在回顾一下代码的执行顺序
首先进行各种初始化,这里就不再详解
程序进去osal_start_system,开始进行轮询有没有要处理的事件
这时如果从串口发送一个数据,发生中断,(这里我们利用的中断模式)
在OSAL框架中,Hal_ProcessPoll()函数是在一个死循环中,所以每过一定的时间就会执行到。在Z-Stack OSAL中这个时种节奏定义是1ms,Hal_ProcessPoll()的作用是检测中断标志位,由于串口已经接收到数据,所以进入中断处理,具体处理过程如下HalUARTPoll(); ? HalUARTPollISR(); ? static uint16 HalUARTRxAvailISR(void)
?然后就进入了MT_UartProcessZToolData;(详解如下) ?数据接收完毕后又进入轮询,由于sampleapp中已经不为空了,所以就会执行sampleapp中的操作,在Sampleapp中的
case SPI_INCOMING_ZTOOL_PORT:
UartRxComCallBack();
break;
这段代码将被执行,UartRxComCallBack();中的代码如上述红字表示,完成我们设定的相应功能。
实验数据
利用程序调试助手测试一下程序的收发速率(波特率为115200)
RX TX 最小发送周期(ms) 速率B/s 3 2 18 227.8 6 5 33 333.3 11 10 47 446.8 21 20 79 519.0 31 30 119 512.5
附:涉及的代码:
①void MT_UartInit ()
{
halUARTCfg_t uartConfig;
/* Initialize APP ID */
App_TaskID = 0;
/* UART Configuration */
uartConfig.configured = TRUE;
uartConfig.baudRate = MT_UART_DEFAULT_
显示全部