ZigBee TI ZStack CC2530 3.19 串口02-接收

简介: (配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 前面两节讲述了Z-Stack协议栈中串口发送功能的使用,本节将讲述串口的数据接收处理机制。 《ZigBee CC2530 Z-Stack 10 串口收发机制及使用1-发送》中提到, uartConfig.callBackFunc = NULL;关于这句代码,由于当时暂不实现串口接收处理数据的功能,所以之前此处的串口回调函数为NULL(空)。

(配套源码软件开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911


前面两节讲述了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 __cplusplus
extern "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   6

extern 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群/TB店铺:拿破仑940911

相关文章
|
物联网 芯片
|
传感器 网络协议 物联网
基于CC2530(ZigBee)设计的自动照明系统
基于ZigBee的自动照明系统设计,上面连接了光感传感器,ESP8266WIFI模块。通过ESP8266与手机APP之间通信,ESP8266创建热点,配置为TCP服务器模式; 手机APP连接上ESP8266的热点之后,再连接ESP8266创建的服务器,完成通信。 手机APP上通过按钮可以控制B,C开发板上LED灯的开关。
587 0
|
传感器 物联网 Linux
基于CC2530(ZigBee设计)的温度报警器
这是基于CC2530设计的远程温度报警器,通过CC2530终端检测环境温度上传给手机APP实时显示。 一共有两块CC2530开发板,这里就分别称为A板(当做协调器)、B板(当做温度节点),A板上接了ESP8266 WIF模块,用于与手机APP之间通信。B板上接了DS18B20 温度传感器模块,用于给A板传递检测的温度,A板收到DS18B20的温度之后,发送给手机APP显示。APP上位机采用Qt框架设计,支持跨平台,Android、windows、IOS、Linux都可以编译运行安装。
885 0
|
传感器 网络协议 物联网
基于CC2530(ZigBee)设计的景观照明控制系统+配套手机APP
基于CC2530(ZigBee)设计的景观照明控制系统+配套手机APP
593 0
基于CC2530(ZigBee)设计的景观照明控制系统+配套手机APP
|
传感器 物联网
( zigbee)CC2530+BH1750光敏传感器获取光照强度
( zigbee)CC2530+BH1750光敏传感器获取光照强度
863 0
( zigbee)CC2530+BH1750光敏传感器获取光照强度
|
物联网
ZigBee(CC2530)最小系统PCB设计(AD18开发软件)
ZigBee(CC2530)最小系统PCB设计(AD18开发软件
ZigBee(CC2530)最小系统PCB设计(AD18开发软件)
|
物联网
ZigBee TI ZStack CC2530 2.3 协议栈版本
(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 一、协议栈发展历史 TI的ZigBee 协议栈Z-Stack,从最开始的Z-Stack 0.1到大家熟悉的ZStack-CC2530-2.5.1a,再到几个月前刚刚发布的最新版本——Z-Stack 3.0.1,历经了非常多的版本。
3276 0
|
移动开发 物联网 流计算
ZigBee TI ZStack CC2530 3.12 LED驱动移植及使用
(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 一、前言 关于Z-Stack协议栈中的LED控制,如果使用协议栈中自带的驱动,很简单就可以实现非常丰富的功能。
2110 0
|
物联网
ZigBee TI ZStack CC2530 3.14 按键驱动01-轮询模式
(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 在Z-Stack协议栈中,对于按键的检测,分为两种不同的机制,分别称为“轮询模式”和“中断模式”,类比单片机中的按键检测,还是很好理解的。
1734 0
Adobe XD CC 55.2.12.2 是一款非常专业的矢量图形规划软件Adobe XD 2023版本软件下载安装教程(内含所有版本)
Adobe XD CC 55.2.12.2 是一款非常专业的矢量图形规划软件,全新的桌面端UX原型工具,这是新一代网页与移动应用的UX设计工具。xd能够帮助设计者快速有效的设计图形、建立手机APP以及网站原型等等设计制作,支持设备的尺寸多样。集原型、设计和交互等功能于一体,从网站和移动应用程序到语音交互都可轻松实现,Adobe XD CC带来了响应调整大小、自动动画、语音原型、插件和应用程序集成等新功能,

热门文章

最新文章