历史上的今天
今天是:2025年04月09日(星期三)
2019年04月09日 | ZigBee基础实验(六)--UART(串口收发)
2019-04-09 来源:eefocus
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 32 for (j=0; j<1070; j++); 33 } 34 35 /**************************************************************************** 36 * 名 称: InitUart() 37 * 功 能: 串口初始化函数 38 * 入口参数: 无 39 * 出口参数: 无 40 ****************************************************************************/ 41 void InitUart(void) 42 { 43 PERCFG = 0x00; //外设控制寄存器 USART 0的IO位置:0为P0口位置1 44 P0SEL = 0x0c; //P0_2,P0_3用作串口(外设功能) 45 P2DIR &= ~0xC0; //P0优先作为UART0 46 47 U0CSR |= 0x80; //设置为UART方式 48 U0GCR |= 11; 49 U0BAUD |= 216; //波特率设为115200 50 UTX0IF = 0; //UART0 TX中断标志初始置位0 51 U0CSR |= 0x40; //允许接收 52 IEN0 |= 0x84; //开总中断允许接收中断 53 } 54 55 /**************************************************************************** 56 * 名 称: UartSendString() 57 * 功 能: 串口发送函数 58 * 入口参数: Data:发送缓冲区 len:发送长度 59 * 出口参数: 无 60 ****************************************************************************/ 61 void UartSendString(char *Data, int len) 62 { 63 uint i; 64 65 for(i=0; i 66 { 67 U0DBUF = *Data++; 68 while(UTX0IF == 0); 69 UTX0IF = 0; 70 } 71 } 72 73 /**************************************************************************** 74 * 名 称: UART0_ISR(void) 串口中断处理函数 75 * 描 述: 当串口0产生接收中断,将收到的数据保存在RxBuf中 76 ****************************************************************************/ 77 #pragma vector = URX0_VECTOR 78 __interrupt void UART0_ISR(void) 79 { 80 URX0IF = 0; // 清中断标志 81 RxBuf = U0DBUF; 82 } 83 84 85 /**************************************************************************** 86 * 程序入口函数 87 ****************************************************************************/ 88 void main(void) 89 { 90 CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振 91 while(CLKCONSTA & 0x40); //等待晶振稳定为32M 92 CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ 93 94 InitUart(); //调用串口初始化函数 95 UartState = UART0_RX; //串口0默认处于接收模式 96 memset(RxData, 0, SIZE); 97 98 while(1) 99 { 100 if(UartState == UART0_RX) //接收状态 101 { 102 if(RxBuf != 0) 103 { 104 if((RxBuf != '#')&&(count < 50))//以'#'为结束符,一次最多接收50个字符 105 RxData[count++] = RxBuf; 106 else 107 { 108 if(count >= 50) //判断数据合法性,防止溢出 109 { 110 count = 0; //计数清0 111 memset(RxData, 0, SIZE);//清空接收缓冲区 112 } 113 else 114 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; //计数清0 127 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; //计数清0 127 memset(RxData, 0, SIZE); //清空接收缓冲区 128 } 这里要特别注意,发送的时候要禁止接收,发送完毕要使能接收,着也就是122行和124行代码的意图!
史海拾趣
|
看到有那么多DIY MP3的东东,于是乎在网上发现了这个文章,转来看看,是不是增强了我们DIY的决心了呢? 看过一篇文章说医生将自己的病人介绍到其他医院做手术,说得出的原因是病房装修或者床位不空等,而真实原因则是本院收费严格无利可图,介绍到 ...… 查看全部问答> |
|
1. 学习LM3S8962只要有51单片机基础就可以学习.它使用Keill编译. 下载可以用多种方法下载.并且是接用keil软件下载,并不要安装其它软件,操作方法,快捷.而且还可以用keil在线认真调试, 非常不错的功能. 下 ...… 查看全部问答> |
|
PlaySound()与WaveOutWrite()有什么区别? PlaySound()与WaveOutWrite()有什么区别? PlaySound()是否是WaveOutWrite()的上层函数?也就是事实上PlaySound也是调用了WaveOutWrite()? 那么,到底是用哪个层次的函数来播放声音好呢? 另外,PlaySound()的第一个参数可以使文件的路径名也可 ...… 查看全部问答> |
|
#include #define uchar unsigned char int flag; unsigned int count; sbit l1 = P1^0; sbit l2 = P1^1; sbit l3 = P1^2; sbit s1 = P1^3; //第一个红外开关 sbit s2 = P1^4; ...… 查看全部问答> |
|
死在Calibrating delay loop... 怎么解决?不要嫌分少啊。 我编写了一个针对某块芯片的framebuffer代码 修改了 drives/video 下相应的Config.in fbmem.c Makefile文件 在make menuconfig中也做了相应的修改 我用的是MIPS 编译好的代码在板上跑的时候总是死在Calibra ...… 查看全部问答> |
|
用的IAR软件。2000(fury)的CAN程序拿到5791(tempest)中就有问题了。IO加了GPIOpinConfig函数。发是能发(抓到报文了),但是进不去中断。是IAR软件的设置还是程序中应该注意什么?中断程序中可以设置断点,但进不去,2000可以进去。icf文件改了 ...… 查看全部问答> |
|
TI AM335x ARM微处理器(MPU)是业界性价比最高的Cortex-A8解决方案,该系列MPU的起步价格仅为5美元,能以ARM9 的价格提供ARM Cortex-A8的性能,该解决方案实现了性能、功耗以及外设集成的完美平衡,能够全面满足您对产品的要求。 $(\'swf ...… 查看全部问答> |
|
always @ (posedge txclk or posedge ld_tx_data or negedge reset) if(!reset) begin tx_reg … 查看全部问答> |




