ZigBee TI ZStack CC2530 3.19 串口02-接收
来源:互联网 发布:抽奖软件代码 编辑:程序博客网 时间:2024/05/29 18:03
(配套源代码、软件、文档等资料下载,可移步博客同名QQ群:263671349,博主24小时在线)
前面两节讲述了Z-Stack协议栈中串口发送功能的使用,本节将讲述串口的数据接收处理机制。
《ZigBee CC2530 Z-Stack 10 串口收发机制及使用1-发送》中提到,
uartConfig.callBackFunc = NULL;关于这句代码,由于当时暂不实现串口接收处理数据的功能,所以之前此处的串口回调函数为NULL(空)。
如果学过51单片机或者STM32等微控制器的话,大家就应该知道,串口的接收都是有对应的中断服务函数的,CC2530也不例外,毕竟它的CPU也是8051。在TI的Z-Stack协议栈中,也采取了类似的机制,不过称之为“回调函数”。在串口初始化时,如果要使用串口接收数据的功能,就必须指定一个“回调函数”,这里我们将串口0的回调函数取名为Uart0_Process( ),具体实现代码如下:
void Uart0_Process( uint8 port, uint8 event ){ uint8 Res; (void)event; // Intentionally unreferenced parameter while (Hal_UART_RxBufLen(port)) { HalUARTRead (port, &Res, 1);//读取一个字节 UART0_RX_BUFF[UART0_RX_STA&0x3F]=Res ; UART0_RX_STA++; if((UART0_RX_STA&0x80)==0)//接收未完成 { if(UART0_RX_STA&0x40)//前一个接收到的数据结束符的“前一半” { if (Res==0x0A)UART0_RX_STA |= 0x80;//接收完成了 else if(Res!=0x0D)UART0_RX_STA &= 0xBF;//不是结束符,则将前半个结束符标志置0 } else { if(Res==0x0D)UART0_RX_STA |= 0x40; } } if((UART0_RX_STA&0x80)==0x80) { UART0_RX_LEN = (UART0_RX_STA&0x3F)-2; Uart0_Handle(); Uart0_Reset(); break; } }}上述代码中实现了一个简易的串口通信协议:CC2530作为接收方,需要明确知道发送方发送的数据何时结束,这里便选择我们常规的做法,规定所有发送给CC2530串口0的数据必须以“回车换行符”(即“0x0D 0x0A”)结尾;否则发送的数据帧会被做无效处理,具体实现详见上述代码。
从上述代码可以看出,新增了3个全局变量,具体代码如下:
uint8 UART0_RX_BUFF[UART0_RX_BUFF_MAX];//接收缓存区uint8 UART0_RX_STA = 0; //接收状态标记uint8 UART0_RX_LEN = 0; //接收数据长度唯一需要强调的是UART0_RX_STA,这个全局变量在串口接收数据的过程当中,起到了类似“接收状态寄存器”的作用,8位的变量,最高位表示“是否收到0x0A”,次高位表示“是否收到0x0D”,其余6位全部用来存储接收数据的字节数,2^6=64,所以每次最大只能接收63(64-1)个字节的数据,如果有更大的数据接收需求,做简单修改即可实现。
此外,仔细读一下代码,就可以看出,真正对接收到的有效数据做处理是在Uart0_Handle( )函数中:
void Uart0_Handle(void){ if(strstr((const char*)UART0_RX_BUFF,"cmd_1")) { printf("apple\r\n"); } else if(strstr((const char*)UART0_RX_BUFF,"cmd_2")) { printf("orange\r\n"); }}
上述代码很简单,相信大家一看就明白了。在对接收到的串口数据处理完成后,需要对串口接收缓存区进行清零重置,即我们在Uart0_Handle()函数后面调用的Uart0_Reset()函数,其定义如下:
void Uart0_Reset(void){ memset(UART0_RX_BUFF,0,UART0_RX_BUFF_MAX); UART0_RX_STA = 0;}
此外,既然我们在uart0.c文件中调用了相关函数,自然就必须将对应所在的头文件包含进来,新增头文件部分如下:
#include "string.h"#include "user_printf.h"对应uart0.h文件中新增部分即uart0.c文件中新增变量和函数的声明,更改后的uart0.h文件代码如下:
#ifndef UART0_H#define UART0_H#ifdef __cplusplusextern "C"{#endif#include "hal_types.h"#define UART0_RX_BUFF_MAX 60#define UART0_TX_BUFF_MAX 60#define UART0_THRESHOLD (UART0_RX_BUFF_MAX / 2)#define UART0_IDLE_TIMEOUT 6extern uint8 UART0_RX_BUFF[UART0_RX_BUFF_MAX];//接收缓存区 extern uint8 UART0_RX_STA; //接收状态标记extern uint8 UART0_RX_LEN; //接收数据长度void Uart0_Init(uint8 baudRate);void Uart0_Process( uint8 port, uint8 event );void Uart0_Handle( void );void Uart0_Reset( void );#ifdef __cplusplus}#endif#endif /* UART0_H */
最后将程序编译下载到芯片中进行验证:
(配套源代码、软件、文档等资料下载,可移步博客同名QQ群:263671349,博主24小时在线)
阅读全文
2 0
- ZigBee TI ZStack CC2530 3.19 串口02-接收
- ZigBee TI ZStack CC2530 3.18 串口01-发送
- ZigBee TI ZStack CC2530 3.20 串口03-printf()函数移植
- ZigBee TI ZStack CC2530 3.15 按键驱动02-中断模式
- ZigBee TI ZStack CC2530 3.11 IO口02-外部中断
- ZigBee TI ZStack CC2530 1.1 总体框架
- ZigBee TI ZStack CC2530 2.2 ZigBee规范版本
- ZigBee TI ZStack CC2530 2.1 如何学习ZigBee
- ZigBee TI ZStack CC2530 2.3 协议栈版本
- ZigBee TI ZStack CC2530 3.10 IO口01-输入输出
- ZigBee TI ZStack CC2530 3.12 LED驱动移植及使用
- ZigBee TI ZStack CC2530 3.2 官方例程00-总
- ZigBee TI ZStack CC2530 2.5 搭建开发环境
- ZigBee TI ZStack CC2530 2.4 IAR软件版本
- ZigBee TI ZStack CC2530 3.9 IO口00-总
- ZigBee TI ZStack CC2530 3.6 创建基于ZStack的新工程
- ZigBee TI ZStack CC2530 3.14 按键驱动01-轮询模式
- ZigBee TI ZStack CC2530 2.6 选择开发板和下载器
- spring+webscoket注解方式
- Sass安装(windows版)
- 51Nod-1011-最大公约数GCD
- 全文搜索引擎 ElasticSearch 入门教程
- 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
- ZigBee TI ZStack CC2530 3.19 串口02-接收
- n阶矩阵相乘
- Fiori app国际化
- FBI树
- 剑指offer:和为S的连续正数序列
- 错误: 找不到或无法加载主类
- BZOJ3173[最长上升子序列] Treap+LIS
- C语言输入输出那些事儿
- 删除元素-LintCode