博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ZigBee] 8、ZigBee之UART剖析·二(串口收发)
阅读量:4956 次
发布时间:2019-06-12

本文共 3031 字,大约阅读时间需要 10 分钟。

 

前言:上一节讲UART基本知识介绍完了,并深入剖析了一个串口发送工程,本节将进一步介绍串口收发!

 

1、初始化

在串口初始化部分,和上一节不同的地方是:

51     U0CSR |= 0x40;           //允许接收  52     IEN0 |= 0x84;            //开总中断允许接收中断

第51行使能接收数据,上一节介绍的仅仅是发送,所以没有这一句配置:

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

1 /****************************************************************************  2 * 文 件 名: main.c  3 * 描    述: 设置串口调试助手波特率:115200bps 8N1  4 *           串口调试助手给CC2530发字符串时,开发板会返回接收到的字符串  5 ****************************************************************************/  6 #include 
7 #include
8 9 typedef unsigned char uchar; 10 typedef unsigned int uint; 11 12 #define UART0_RX 1 13 #define UART0_TX 2 14 #define SIZE 51 15 16 char RxBuf; 17 char UartState; 18 uchar count; 19 char RxData[SIZE]; //存储发送字符串 20 21 /**************************************************************************** 22 * 名 称: DelayMS() 23 * 功 能: 以毫秒为单位延时 24 * 入口参数: msec 延时参数,值越大,延时越久 25 * 出口参数: 无 26 ****************************************************************************/ 27 void DelayMS(uint msec) 28 { 29 uint i,j; 30 31 for (i=0; i
= 50) //判断数据合法性,防止溢出109 {110 count = 0; //计数清0111 memset(RxData, 0, SIZE);//清空接收缓冲区112 }113 else114 UartState = UART0_TX; //进入发送状态 115 }116 RxBuf = 0;117 }118 }119 120 if(UartState == UART0_TX) //发送状态 121 { 122 U0CSR &= ~0x40; //禁止接收 123 UartSendString(RxData, count); //发送已记录的字符串。124 U0CSR |= 0x40; //允许接收 125 UartState = UART0_RX; //恢复到接收状态 126 count = 0; //计数清0127 memset(RxData, 0, SIZE); //清空接收缓冲区128 } 129 }130 }

 

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;                         //计数清0127             memset(RxData, 0, SIZE);           //清空接收缓冲区128         }

这里要特别注意,发送的时候要禁止接收,发送完毕要使能接收,着也就是122行和124行代码的意图!

 

 

Zigbee系列文章:

 

 

PS:如果您觉得还不错,点个赞,让更多人受益~

@beautifulzzzz 2016-07-16 continue~  

e-mail:beautifulzzzz@qq.com 
sina:

 

转载于:https://www.cnblogs.com/zjutlitao/p/5676675.html

你可能感兴趣的文章
Javascript 有用参考函数
查看>>
点群的判别(三)
查看>>
GNSS 使用DFT算法 能量损耗仿真
查看>>
【转】Simulink模型架构指导
查看>>
MYSQL数据库的导出的几种方法
查看>>
SQL Server-5种常见的约束
查看>>
硬件之美
查看>>
[转载]java开发中的23种设计模式
查看>>
表格的拖拽功能
查看>>
函数的形参和实参
查看>>
文字过长 用 ... 表示 CSS实现单行、多行文本溢出显示省略号
查看>>
1Caesar加密
查看>>
【TP SRM 703 div2 500】 GCDGraph
查看>>
MapReduce 重要组件——Recordreader组件 [转]
查看>>
webdriver api
查看>>
apache 实现图标缓存客户端
查看>>
MediaWiki左侧导航栏通过特殊页面就可以设置。
查看>>
揭秘:黑客必备的Kali Linux是什么,有哪些弊端?
查看>>
linux系统的远程控制方法——学神IT教育
查看>>
springboot+mybatis报错Invalid bound statement (not found)
查看>>