第11章 CC2530串口通讯-接收字符串
2017-12-31 00:09
337 查看
1 理论分析
当 1 写入 UxCSR.RE 位时,在 UART 上数据接收就开始了。然后 UART 会在输入引脚 RXDx 中寻找有效起始位,并且设置 UxCSR.ACTIVE 位为 1。当检测出有效起始位时,收到的字节就传入到接收寄存器,UxCSR.RX_BYTE 位设置为 1。该操作完成时,产生接收中断。同时 UxCSR.ACTIVE 变为低电平。通过寄存器 UxBUF 提供收到的数据字节。当 UxBUF 读出时,UxCSR.RX_BYTE位由硬件清 0。
注意:
当应用程序读 UxDBUF,很重要的一点是不清除 UxCSR.RX_BYTE。清除UxCSR.RX_BYTE 暗示 UART,使得它以为 UART RX 移位寄存器为空,即使它可能保存有未决数据 (一般是由于背对背传输)。所以 UART 声明 (TTL 为低电平) RT/RTS线,这会允许数据流进入 UART,导致潜在的溢出。因此 UxCSR.RX_BYTE 标志紧密结合了自动 RT/RTS 功能,因此只能被 SoC UART 本身控制。否则应用程序一般可以经历以下事件:RT/RTS 线保持声明(TTL 为低电平)的状态,即使一个背对背传输清楚地表明应该间歇性地停止数据流。
2 实验详解
2.1 实验目的
1)、了解 CC2530 串口的功能;2)、掌握 CC2530 通过串口接收电脑发送过来的数据。
2.2实验设备
硬件:PC 机一台,ZB2530(底板、核心板、仿真器、USB 线)一套;软件:2000/XP/win7 系统,IAR 8.20 集成开发环境。
2.3实验相关电路图
图 1 FT232
图2 USB
2.4实验分析
由于要接收数据,所以在上节实验 Uart 配置的基础上,加上允许 Uart 接收数据就可以了。为了不占用 CPU 资源,我们采用 Uart 中断方式,所以打开接收中断和总中断。其中一些寄存器在上一讲已经列出,不清楚的请查看上一讲;这一讲使用中断方式实现串口发送数据,在下面会具体分析。
“允许 Uart 接收数据”是配置 U0CSR。而管理中断开关的寄存器配置是 IEN0。
表 1中断使能
表2USART0控制和状态
具体相关寄存器的配置如下:
CLKCONCMD &= ~0x40; // 设置系统时钟源为 32MHZ 晶振 while(CLKCONSTA & 0x40); // 等待晶振稳定 CLKCONCMD &= ~0x47; // 设置系统主时钟频率为 32MHZ PERCFG = 0x00; //位置 1 P0 口 P0SEL = 0x0c; //P0_2,P0_3 用作串口,第二功能 P2DIR &= ~0XC0; //P0 优先作为 UART0 ,优先级 U0CSR |= 0x80; //UART 方式 U0GCR |= 11; //U0GCR 与 U0BAUD 配合 U0BAUD |= 216; // 波特率设为 115200 UTX0IF = 0; //UART0 TX 中断标志清 0 U0CSR |= 0X40; //允许接收 URX0IE=1; //接收中断 EA=1; //开总中断
2.5参考代码(主要代码)
main.c/**Includes*********************************************************************/ #include <ioCC2530.h> #include "Uart.h" /**宏定义***********************************************************************/ //定义数据类型 #define uint unsigned int #define uchar unsigned char #define LED1 P1_0 //P1_0连接LED1 #define LED2 P1_1 //P1_1连接LED2 #define LED3 P0_4 //P1_4连接LED3 /**函数声明*********************************************************************/ void Send_ReceicedData(void); void Initial_IO(void); void Delayms(uint xms); /**全局变量*********************************************************************/ //定义待发送的数据 char Txdata0[]={"龙创科技欢迎您\n"}; //存放"龙创科技欢迎您" char Txdata1[]={"This is a Uart test.\n"}; char Txdata2[]={"The data CC2530 has received is: \n"}; char Txdata3[]={"\r\n"}; char Rxdata = '\0'; /** * @brief 主函数 * @param None * @retval None */ void main(void) { SetSysClock(); //设置系统时钟为32MHz InitUART(); //调用初始化函数 Initial_IO(); //调用初始化函数 UartSend_String(Txdata0,sizeof("龙创科技欢迎您\n")); Delayms(500); UartSend_String(Txdata1,sizeof("This is a Uart test.\n")); while(1) { Send_ReceicedData(); } } /** * @brief USART接收中断 * @param None * @retval None */ #pragma vector = URX0_VECTOR __interrupt void UART0_ISR(void) { Rxdata = U0DBUF; //接收数据并存于Rxdata URX0IF = 0; // 清中断标志 } /** * @brief 将接收到的数据发回给电脑 * @param None * @retval None */ void Send_ReceicedData(void) { if ( Rxdata != '\0' ) { UartSend_String(Txdata2,sizeof("The data CC2530 has received is: ")); //提示接收到数据 Send_char(Rxdata); UartSend_String(Txdata3,sizeof("\n")); if (Rxdata=='1') { LED1=0; Delayms(500); LED1=1; } if (Rxdata=='2') { LED2=0; Delayms(500); LED2=1; } if (Rxdata=='3') { LED3=0; Delayms(500); LED3=1; } Rxdata='\0'; } } /** * @brief IO初始化函数 * @param None * @retval None */ void Initial_IO(void) { P1DIR |= 0xff; //P1为输出 P0DIR |= 0xff; } /** * @brief 普通延时函数 * @param xms 延时长度 * @retval None */ void Delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=587;j>0;j--); }
Uart.c
#include "Uart.h" #define uint unsigned int #define uchar unsigned char /************************************************** //CC2530串口初始化配置 ***************************************************/ void InitUART(void) { PERCFG = 0x00; //位置1 P0口 P0SEL = 0x0c; //P0_2,P0_3 用作串口,第二功能 P2DIR &= ~0XC0; //P0 优先作为UART0 ,优先级 U0CSR |= 0x80; //UART 方式 U0GCR |= 11; //U0GCR与U0BAUD配合 U0BAUD |= 216; //波特率设为115200 UTX0IF = 0; //UART0 TX 中断标志清0 U0CSR |= 0X40; //允许接收 URX0IE=1; //接收中断 EA=1; //开总中断, } /************************************************** 函 数 名 : Send_char 功能描述 :电脑向串口发送字节 输入参数 : c---所要发送的数据 ***************************************************/ void Send_char(uchar c) { U0DBUF = c; while(UTX0IF == 0); //发送完成标志位 UTX0IF = 0; } /************************************************** 函 数 名 : UartSend_String 功能描述 :电脑向串口发送字符串 输入参数 : *Data---字符串首地址 len---字符串长度 ***************************************************/ void UartSend_String(char *Data,int len) { int j; for(j=0;j<len;j++) { //U0DBUF = *Data++; //while(UTX0IF == 0); //UTX0IF = 0; Send_char(*Data++); } } /************************************************** 函 数 名 : SetSysClock 功能描述 : 设置系统时钟为32MHz ***************************************************/ void SetSysClock(void) { CLKCONCMD &= ~0x40; //选择系统时钟源为外部32MHz crystal oscillator while(CLKCONSTA & 0x40); //等待晶振稳定为32MHz CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ }
注意: char Txdata2[]={“The data CC2530 has received is: \n”};必须加”\n”否则不能输出收到的数据。这是因为Txdata2为一个字符串如果没有结束标志,是不会输出的,需要加结束标志。想更深入了解可以参看相关C语言知识。
2.6实验现象
编译下载程序到开发板上,打开串口调试助手,配置相关参数(注意是按字符格式发送哦)。图3串口配置
用户在串口调试助手上以字符格式发送 1、2 或者 3 时,可分别看到 LED1、LED2 或者 LED3 闪烁一下,而且串口调试助手还好将接收到的数据打印出来。
图4串口信息
本章参考代码
点击进入相关文章推荐
- CC2530串口通信中如何接收上位机的一串字符串
- CC2530串口通信中如何接收上位机的一串字符串
- 51单片机串口通讯接收一串字符串
- SpringMVC 接收页面Post提交的json字符串并解析
- RS485通信字符串数据接收处理的问题
- Struts2 action接收json格式字符串并转化为Map
- Delphi 分隔GSMModem接收到的短信字符串
- SpringMVC @RequestBody接收Json对象字符串
- Spring MVC 页面传单个字符串后台接收不到
- SpringMVC @RequestBody接收Json对象字符串--http://www.cnblogs.com/quanyongan/archive/2013/04/16/3024741.html
- 字符串流stringstream无法正确接收字符串,而是接收了字符串的地址 -- 永远不要直接用类的成员
- SpringMVC @RequestBody接收json字符串,自动将日期字符串转换为java.util.Date
- QT 串口接收数据库16进制字符串
- java基础-从键盘接收一个字符串,对字符串中的字母进行大小写互转
- C++ string 字符串的拼接、拆分 常用于传输字符串命令包(先拼接好后 传送 接收到对其解包)
- springmvc 前台传日期(字符串) 后台用date接收封装失败(请求400)
- SpringMVC @RequestBody接收Json对象字符串
- SpringMVC @RequestBody接收Json对象字符串
- [ios] 函数与字符串的相互转化,@selecte函数转化为字符串传递,字符串转化为@select接收 【转】
- Arduino串口接收字符串