前言:上一节讲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] 1、 ZigBee简介

[ZigBee] 2、 ZigBee开发环境搭建

[ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭

[ZigBee] 4、ZigBee基础实验——中断

[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剖析·二(串口收发)的更多相关文章

  1. ZigBee学习四 无线+UART通信

    ZigBee学习四 无线+UART通信 1) 协调器编程 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique messag ...

  2. libevent源码深度剖析二

    libevent源码深度剖析二 ——Reactor模式 张亮 前面讲到,整个libevent本身就是一个Reactor,因此本节将专门对Reactor模式进行必要的介绍,并列出libevnet中的几个 ...

  3. STM32F103C8T6-CubeMx串口收发程序详细设计与测试(1)——CubeMx生成初始代码

    STM32F103C8T6-CubeMx串口收发程序详细设计与测试(1)--CubeMx生成初始代码 关键词:STM32F103C8T6 CubeMX UART 详细程序设计 1.开发环境 (1)ST ...

  4. stm32串口收发导致的死机

    stm32串口收发导致的死机 很久以前有偶尔遇到过串口死机的情况,那是当时的我写出来的代码自己都觉得有问题,也就没注意.用了stm32做项目以后也就没遇到过了,今天做了个高压测试,每5ms定时发送一次 ...

  5. [ZigBee] 7、ZigBee之UART剖析(ONLY串口发送)

    综述:USART0和USART1是串行通信接口,它们能够分别运行于异步UART模式或者同步SPI 模式.两个USART具有同样的功能,可以设置在单独的I/O 引脚. 1.UART 模式 UART 模式 ...

  6. 【接口时序】3、UART串口收发的原理与Verilog实现

    一.软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1.FPGA型号:XC6SLX45- ...

  7. jdk源码剖析二: 对象内存布局、synchronized终极原理

    很多人一提到锁,自然第一个想到了synchronized,但一直不懂源码实现,现特地追踪到C++层来剥开synchronized的面纱. 网上的很多描述大都不全,让人看了不够爽,看完本章,你将彻底了解 ...

  8. Django Rest Framework源码剖析(二)-----权限

    一.简介 在上一篇博客中已经介绍了django rest framework 对于认证的源码流程,以及实现过程,当用户经过认证之后下一步就是涉及到权限的问题.比如订单的业务只能VIP才能查看,所以这时 ...

  9. s3c2440裸机-UART编程(二、UART编程实现)

    UART编程 1.初始化 我们的2440支持3个UART串口,以uart0为例讲解. 那么我们需要实现以下这几个函数完成串口的最基本功能: (1)uart0_init()用于初始化串口 (2)putc ...

随机推荐

  1. JSON字符串解析

    有时保存在数据库的数据是一串json字符串,需要进行读取的时候就需要解析操作. 简单介绍两种: 1.net.sf.json.* 2.com.alibaba.fastjson.* 需要的包自行下载. 第 ...

  2. 【Java学习笔记】静态导入

    package p2; //import static java.util.Collections.max; import java.util.ArrayList; import static jav ...

  3. 原生ajax基础

    /*ajax对象的成员常用属性:responseText:以字符串形式接收服务器端返回的信息responseXML:以Xml Document对象形式接收服务器返回的信息readyState:返回当前 ...

  4. 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 ...

  5. 两个list<object> 比较 得到相同数据 差异数据

    package com.lizi.admin.utils.contrast;import java.lang.reflect.InvocationTargetException;import java ...

  6. springboot使用之一:连接生产数据库,添加连接池

    项目中,难免遇到连接数据库的情形,目前来说springboot连接mybatis有两种,我这边使用的是mybatis官方提供XML方式的整合. 后面,对项目进行完善,引入了连接池,PageHelper ...

  7. Linux配置网络YUM源

    配置网络yum源 RHEL6.5 [root@xuegod163 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun ...

  8. C# 计算字符串在控制台中的显示长度

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  9. PHP-Mysqli扩展库的预编译

    (1)预编译的好处 假如要执行100条类似的sql语句,每一次执行,在MySQL端都会进行一次编译,效率很低.提高效率的方法就是--减少编译的次数. 先制造一个sql语句的模板,在MySQL端预先编译 ...

  10. 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, ...