[ZigBee] 8、ZigBee之UART剖析·二(串口收发)
前言:上一节讲UART基本知识介绍完了,并深入剖析了一个串口发送工程,本节将进一步介绍串口收发!
1、初始化
在串口初始化部分,和上一节不同的地方是:
51 U0CSR |= 0x40; //允许接收
52 IEN0 |= 0x84; //开总中断允许接收中断
第51行使能接收数据,上一节介绍的仅仅是发送,所以没有这一句配置:

第51行开总中断和UART0中断:

/****************************************************************************
* 文 件 名: main.c
* 描 述: 设置串口调试助手波特率:115200bps 8N1
* 串口调试助手给CC2530发字符串时,开发板会返回接收到的字符串
****************************************************************************/
#include <ioCC2530.h>
#include <string.h> typedef unsigned char uchar;
typedef unsigned int uint; #define UART0_RX 1
#define UART0_TX 2
#define SIZE 51 char RxBuf;
char UartState;
uchar count;
char RxData[SIZE]; //存储发送字符串 /****************************************************************************
* 名 称: DelayMS()
* 功 能: 以毫秒为单位延时
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{
uint i,j; for (i=; i<msec; i++)
for (j=; j<; j++);
} /****************************************************************************
* 名 称: InitUart()
* 功 能: 串口初始化函数
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitUart(void)
{
PERCFG = 0x00; //外设控制寄存器 USART 0的IO位置:0为P0口位置1
P0SEL = 0x0c; //P0_2,P0_3用作串口(外设功能)
P2DIR &= ~0xC0; //P0优先作为UART0 U0CSR |= 0x80; //设置为UART方式
U0GCR |= ;
U0BAUD |= ; //波特率设为115200
UTX0IF = ; //UART0 TX中断标志初始置位0
U0CSR |= 0x40; //允许接收
IEN0 |= 0x84; //开总中断允许接收中断
} /****************************************************************************
* 名 称: UartSendString()
* 功 能: 串口发送函数
* 入口参数: Data:发送缓冲区 len:发送长度
* 出口参数: 无
****************************************************************************/
void UartSendString(char *Data, int len)
{
uint i; for(i=; i<len; i++)
{
U0DBUF = *Data++;
while(UTX0IF == );
UTX0IF = ;
}
} /****************************************************************************
* 名 称: UART0_ISR(void) 串口中断处理函数
* 描 述: 当串口0产生接收中断,将收到的数据保存在RxBuf中
****************************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = ; // 清中断标志
RxBuf = U0DBUF;
}
/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定为32M
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ InitUart(); //调用串口初始化函数
UartState = UART0_RX; //串口0默认处于接收模式
memset(RxData, , SIZE); while()
{
if(UartState == UART0_RX) //接收状态
{
if(RxBuf != )
{
if((RxBuf != '#')&&(count < ))//以'#'为结束符,一次最多接收50个字符
RxData[count++] = RxBuf;
else
{
if(count >= ) //判断数据合法性,防止溢出
{
count = ; //计数清0
memset(RxData, , SIZE);//清空接收缓冲区
}
else
UartState = UART0_TX; //进入发送状态
}
RxBuf = ;
}
} if(UartState == UART0_TX) //发送状态
{
U0CSR &= ~0x40; //禁止接收
UartSendString(RxData, count); //发送已记录的字符串。
U0CSR |= 0x40; //允许接收
UartState = UART0_RX; //恢复到接收状态
count = ; //计数清0
memset(RxData, , SIZE); //清空接收缓冲区
}
}
}
2、中断回调函数
第77~82行是UART0中断处理函数,每次有数据从上位机发送下来都会触发该函数执行,在概述内将上位机发送来的数据保存在RxBuf中:
77 #pragma vector = URX0_VECTOR
78 __interrupt void UART0_ISR(void)
79 {
80 URX0IF = 0; // 清中断标志
81 RxBuf = U0DBUF;
82 }
3、main函数流程
串口初始状态为接收状态,其中100-118行把中断处理函数中暂存的接收数据RxBuf转存到RxData数组中,接收过程中发现结束标志位则将状态转换为发送状态,则120~128行发送数据的代码段将被执行:
120 if(UartState == UART0_TX) //发送状态
121 {
122 U0CSR &= ~0x40; //禁止接收
123 UartSendString(RxData, count); //发送已记录的字符串。
124 U0CSR |= 0x40; //允许接收
125 UartState = UART0_RX; //恢复到接收状态
126 count = 0; //计数清0
127 memset(RxData, 0, SIZE); //清空接收缓冲区
128 }
这里要特别注意,发送的时候要禁止接收,发送完毕要使能接收,着也就是122行和124行代码的意图!
Zigbee系列文章:
[ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭
[ZigBee] 5、ZigBee基础实验——图文与代码详解定时器1(16位定时器)(长文)
[ZigBee] 6、ZigBee基础实验——定时器3和定时器4(8 位定时器)
[ZigBee] 7、ZigBee之UART剖析(ONLY串口发送)
PS:如果您觉得还不错,点个赞,让更多人受益~
@beautifulzzzz 2016-07-16 continue~
e-mail:beautifulzzzz@qq.com
sina:http://weibo.com/beautifulzzzz?is_all=1
[ZigBee] 8、ZigBee之UART剖析·二(串口收发)的更多相关文章
- ZigBee学习四 无线+UART通信
ZigBee学习四 无线+UART通信 1) 协调器编程 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique messag ...
- libevent源码深度剖析二
libevent源码深度剖析二 ——Reactor模式 张亮 前面讲到,整个libevent本身就是一个Reactor,因此本节将专门对Reactor模式进行必要的介绍,并列出libevnet中的几个 ...
- STM32F103C8T6-CubeMx串口收发程序详细设计与测试(1)——CubeMx生成初始代码
STM32F103C8T6-CubeMx串口收发程序详细设计与测试(1)--CubeMx生成初始代码 关键词:STM32F103C8T6 CubeMX UART 详细程序设计 1.开发环境 (1)ST ...
- stm32串口收发导致的死机
stm32串口收发导致的死机 很久以前有偶尔遇到过串口死机的情况,那是当时的我写出来的代码自己都觉得有问题,也就没注意.用了stm32做项目以后也就没遇到过了,今天做了个高压测试,每5ms定时发送一次 ...
- [ZigBee] 7、ZigBee之UART剖析(ONLY串口发送)
综述:USART0和USART1是串行通信接口,它们能够分别运行于异步UART模式或者同步SPI 模式.两个USART具有同样的功能,可以设置在单独的I/O 引脚. 1.UART 模式 UART 模式 ...
- 【接口时序】3、UART串口收发的原理与Verilog实现
一.软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1.FPGA型号:XC6SLX45- ...
- jdk源码剖析二: 对象内存布局、synchronized终极原理
很多人一提到锁,自然第一个想到了synchronized,但一直不懂源码实现,现特地追踪到C++层来剥开synchronized的面纱. 网上的很多描述大都不全,让人看了不够爽,看完本章,你将彻底了解 ...
- Django Rest Framework源码剖析(二)-----权限
一.简介 在上一篇博客中已经介绍了django rest framework 对于认证的源码流程,以及实现过程,当用户经过认证之后下一步就是涉及到权限的问题.比如订单的业务只能VIP才能查看,所以这时 ...
- s3c2440裸机-UART编程(二、UART编程实现)
UART编程 1.初始化 我们的2440支持3个UART串口,以uart0为例讲解. 那么我们需要实现以下这几个函数完成串口的最基本功能: (1)uart0_init()用于初始化串口 (2)putc ...
随机推荐
- JSON字符串解析
有时保存在数据库的数据是一串json字符串,需要进行读取的时候就需要解析操作. 简单介绍两种: 1.net.sf.json.* 2.com.alibaba.fastjson.* 需要的包自行下载. 第 ...
- 【Java学习笔记】静态导入
package p2; //import static java.util.Collections.max; import java.util.ArrayList; import static jav ...
- 原生ajax基础
/*ajax对象的成员常用属性:responseText:以字符串形式接收服务器端返回的信息responseXML:以Xml Document对象形式接收服务器返回的信息readyState:返回当前 ...
- javascript code snippet -- Forwarding Mouse Events Through Layers
Anyone who has worked with web apps has likely created a masking element at some point, and the grea ...
- 两个list<object> 比较 得到相同数据 差异数据
package com.lizi.admin.utils.contrast;import java.lang.reflect.InvocationTargetException;import java ...
- springboot使用之一:连接生产数据库,添加连接池
项目中,难免遇到连接数据库的情形,目前来说springboot连接mybatis有两种,我这边使用的是mybatis官方提供XML方式的整合. 后面,对项目进行完善,引入了连接池,PageHelper ...
- Linux配置网络YUM源
配置网络yum源 RHEL6.5 [root@xuegod163 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun ...
- C# 计算字符串在控制台中的显示长度
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- PHP-Mysqli扩展库的预编译
(1)预编译的好处 假如要执行100条类似的sql语句,每一次执行,在MySQL端都会进行一次编译,效率很低.提高效率的方法就是--减少编译的次数. 先制造一个sql语句的模板,在MySQL端预先编译 ...
- Pointers and Dynamic Allocation of Memory
METHOD 1: Consider the case where we do not know the number of elements in each row at compile time, ...