历史上的今天
返回首页

历史上的今天

今天是: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行代码的意图!


推荐阅读

史海拾趣

Faraday Electronics Inc公司的发展小趣事

随着技术的不断进步,Faraday Electronics Inc意识到单一的产品线已无法满足市场的多样化需求。于是,公司开始积极拓展市场布局,将产品线拓展至智能家居、汽车电子等领域。通过不断的技术创新和市场拓展,公司逐渐在多个领域取得了领先地位,成为了电子行业的佼佼者。

Eurofarad公司的发展小趣事

Eurofarad始终将技术创新作为公司发展的核心动力。随着科技的不断进步,Eurofarad不断投入研发资源,推动电子元件技术的创新。公司成功研发出了一系列具有创新性的产品,如陶瓷电容器、塑料薄膜电容器、云母电容器等。这些产品不仅具有更高的性能和更长的使用寿命,而且更符合市场的需求,为Eurofarad赢得了更多的市场份额。

Custom Connector Corporation公司的发展小趣事

随着电子行业的不断发展,CCC始终将技术创新作为公司发展的核心驱动力。公司投入大量研发资金,引进先进技术和设备,不断提升产品的性能和品质。同时,CCC还积极与高校、科研机构合作,共同研发具有自主知识产权的新产品。这些创新成果不仅为CCC赢得了市场的认可,也推动了整个电子连接器行业的技术进步。

AMI Semiconductor公司的发展小趣事

在追求经济效益的同时,CCC也注重环境保护和可持续发展。公司积极采用环保材料和生产工艺,减少对环境的影响。同时,CCC还积极参与环保公益活动,推动环保理念在员工和社会中的普及。这种环保理念不仅提升了CCC的企业形象也为其在竞争激烈的市场中赢得了更多优势。

请注意,以上故事仅为概述,具体内容和细节可能需要根据实际情况进行补充和完善。同时,由于篇幅限制,每个故事的字数可能无法完全达到500字的要求。

EVERLIGHT公司的发展小趣事

在电子产品领域,品质是企业生存和发展的关键。EVERLIGHT一直将品质管理放在首位,建立了严格的质量控制体系。公司从原材料采购到生产过程,再到产品出厂,都进行严格的品质检测和监控,确保每一颗LED都符合高标准的质量要求。这种对品质的坚持让EVERLIGHT在市场上赢得了良好的口碑,也为企业赢得了更多客户的信任。

大毅科技公司的发展小趣事

为了进一步提升产品质量和竞争力,大毅科技积极申请并获得了多项国际品质认证,如ISO9001、ISO14001、TS16949等。这些认证不仅证明了大毅科技在品质管理方面的卓越能力,还为公司打开了通往国际市场的大门。随着认证的不断增多,大毅科技的产品开始出口到全球各地,与索尼、雅马哈等知名企业建立了长期合作关系。

问答坊 | AI 解惑

纽曼MP3维修记,是不是坚定了我们DIY的决心?(转)

看到有那么多DIY MP3的东东,于是乎在网上发现了这个文章,转来看看,是不是增强了我们DIY的决心了呢? 看过一篇文章说医生将自己的病人介绍到其他医院做手术,说得出的原因是病房装修或者床位不空等,而真实原因则是本院收费严格无利可图,介绍到 ...…

查看全部问答>

LM3S8962学习心得

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

查看全部问答>

usb转多个串口的讨论

                                 使用STM32的USB转3个串口,能否实现,如果能实现,需要在ST提供的下位机程序中修改哪些地方?上位机驱动是否需要作 ...…

查看全部问答>

关于M3不同系列CAN的设置问题

用的IAR软件。2000(fury)的CAN程序拿到5791(tempest)中就有问题了。IO加了GPIOpinConfig函数。发是能发(抓到报文了),但是进不去中断。是IAR软件的设置还是程序中应该注意什么?中断程序中可以设置断点,但进不去,2000可以进去。icf文件改了 ...…

查看全部问答>

【TI视频】TI AM335x ARM微处理器概述

TI AM335x ARM微处理器(MPU)是业界性价比最高的Cortex-A8解决方案,该系列MPU的起步价格仅为5美元,能以ARM9 的价格提供ARM Cortex-A8的性能,该解决方案实现了性能、功耗以及外设集成的完美平衡,能够全面满足您对产品的要求。   $(\'swf ...…

查看全部问答>

一个串口发送的verilog程序,运行结果很奇怪

always @ (posedge txclk or posedge ld_tx_data or negedge reset) if(!reset) begin         tx_reg      …

查看全部问答>