前言:上一节讲UART基本知识介绍完了,并深入剖析了一个串口发送工程,本节将进一步介绍串口收发!
1、初始化
在串口初始化部分,和上一节不同的地方是:
51 U0CSR |= 0x40; //允许接收 52 IEN0 |= 0x84; //开总中断允许接收中断
第51行使能接收数据,上一节介绍的仅仅是发送,所以没有这一句配置:
第51行开总中断和UART0中断:
1 /**************************************************************************** 2 * 文 件 名: main.c 3 * 描 述: 设置串口调试助手波特率:115200bps 8N1 4 * 串口调试助手给CC2530发字符串时,开发板会返回接收到的字符串 5 ****************************************************************************/ 6 #include7 #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: