CC2530串口通讯的实现
一、串口通讯简介
同步通信:在发送数据信号的时候,会同时送出一根同步时钟信号, 用来同步发送方和接收方的数据采样频率。
异步通信:数据发送方和数据接收方没有同步时钟,只有数据信号线,只不过发送端和接收端会按照协商好的协议(固定频率)来进行数据采样。
USART: 全称Universal Synchronous Asynchronous Receiver and Transmitter(通用同步异步收发器)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。
UART: 与USART裁剪掉了同步的功能,只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,仅用两根信号线(Rx和Tx) 就可以完成通信过程,因此也称为异步串行通信。
串口通讯帧格式:
① 空闲位:当线路上没有数据的时候,电平处于逻辑'1'。
② 起始位:发送一位逻辑'0',数据开始传输
③ 数据位:常见的是8位的数据,数据低位在前。
④ 校验位:校验位通常存在于数据位的下一位,当数据位加上这一位后,如果是奇校验则1的位数是奇数,相反则1的位数为偶数。
⑤ 停止位:是一个字符数据的结束位,通常是1位、1.5位或者2位的高电平。
二、 CC2530串口寄存器介绍
① U0CSR:控制和状态寄存器
Bit7: 设置为1,为UART模式
Bit6: 设置为1,接收器使能
② U0UCR:控制寄存器
Bit6: 设置为0,禁止流控
Bit4: 设置为0,传输数据长度为8位
Bit3: 设置为0,禁用奇偶校验功能
Bit2: 设置为0,1位停止位
③ U0BUF:接收/传送数据缓存寄存器
④ U0GCR、U0BAUD:通用控制核波特率控制寄存器
U0GCR寄存器的低5位和U0BAUD寄存器的8位共同决定通讯的波特率大小,下面给出常用波特率配置表:
⑤ PERCFG:外设控制寄存器
通过该寄存器的Bit0可以决定串口0使用的管脚位置。
⑥ P2DIR:外设优先级控制
P0优先作为UART0,所以设置bite[7:6]为00
三、代码实现
#include <ioCC2530.h>
#include <string.h>typedef unsigned char uchar;
typedef unsigned int uint;#define UART0_RX 1
#define UART0_TX 2
#define SIZE 51char RxBuf;
char UartState;
uchar count;
char RxData[SIZE]; //存储发送字符串//32MHZ晶振ms延时函数
void DelayMS(uint msec)
{ uint i,j;for (i=0; i<msec; i++)for (j=0; j<1070; j++);
}//串口寄存器初始化
void InitUart(void)
{PERCFG = 0x00; //外设控制寄存器 USART 0的IO位置:0为P0口位置1 P0SEL = 0x0c; //P0_2,P0_3用作(外设功能)P2DIR &= ~0xC0;// 1100 0000 将外设设置为串口0优先U0UCR = 0x00; //禁止流控制 8位数据传输 禁止奇偶校验 1位停止位U0CSR |= 0x80; //设置为UART模式U0GCR |= 11; //设置数据LSB和波特率U0BAUD |= 216; //波特率设为115200UTX0IF = 0; //UART0 TX中断标志初始置位0U0CSR |= 0x40; //允许接收 IEN0 |= 0x84; //开总中断允许接收中断
}//串口发送函数
//string:发送的字符串
//len:发送的数据长度
void UartSend_string(char *Data, int len)
{uint i;for(i = 0;i < len;i++) {U0DBUF = *Data++; while(UTX0IF == 0);//等待发送完成UTX0IF = 0; //发送中断标志位置0}}//接收中断处理函数
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{ URX0IF = 0; // 清中断标志 RxBuf = U0DBUF;
}void main(void)
{ CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振while(CLKCONSTA & 0x40); //等待晶振稳定为32MCLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ InitUart(); //调用串口初始化函数 UartState = UART0_RX; //串口0默认处于接收模式memset(RxData, 0, SIZE);while(1){if(UartState == UART0_RX) //接收状态 { if(RxBuf != 0) { if((RxBuf != '#')&&(count < 50))//以'#'为结束符,一次最多接收50个字符 RxData[count++] = RxBuf; else{if(count >= 50) //判断数据合法性,防止溢出{count = 0; //计数清0memset(RxData, 0, SIZE);//清空接收缓冲区}elseUartState = UART0_TX; //进入发送状态 }RxBuf = 0;}}if(UartState == UART0_TX) //发送状态 { U0CSR &= ~0x40; //禁止接收 UartSend_string(RxData, count); //发送已记录的字符串。U0CSR |= 0x40; //允许接收 UartState = UART0_RX; //恢复到接收状态 count = 0; //计数清0memset(RxData, 0, SIZE); //清空接收缓冲区} }
}
代码流程:
① 初始化晶振模式
② 串口寄存器初始化
③ 将串口设置为接收模式,进入while循环
④ 串口接收主机发送的数据,并且数据长度不超过50,并且数据以#结尾将串口设置为发送模式,并把数据发送给主机。
⑤ 如果接收数据异常,则清空接收缓冲区。
CC2530串口通讯的实现相关推荐
- CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)
目录 1. 前期预备知识 1.1 串口通讯电路图 1.2 实验相关寄存器 1.2 常用波特率设置 本章未完待续..... 原来写的文章已经丢失了,只能找到这一小部分,看什么时候有时间再补上. 1. 前 ...
- CC2530基础实验:(8)串口通讯-发送字符串控制LED
目录 前言 一.实验相关电路图 二.实验相关理论与寄存器 1.并行通信与串行通信 2.URAT 3.同步通信与异步通信 4.外设I/O 5.CC2530 的串口通信模块 6.相关寄存器 三.源码分析 ...
- CC2530串口控制LED灯奇怪玩法
CC2530串口控制LED灯奇怪玩法 实验目的:CC2530用串口从上位机发送16进制命令代码来控制LED3.4.5.6并返回相应动作 文章目录 CC2530串口控制LED灯奇怪玩法 一.串口设置 二 ...
- 串口 发送 接收 高位_电工进阶PLC大神,必备PLC串口通讯的基本知识!
戳上方蓝字"技成电工课堂"快速关注!!! 电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗?1,什么是串口通讯? ...
- plc和pc串口通讯接线_让你搞懂PLC串口通讯和通讯接口,这东西估计没几个能说清楚~...
电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗? 1,什么是串口通讯? 串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线 ...
- android 串口开发_详细分析Esp8266上电信息打印的数据,如何做到串口通讯上电不乱码打印...
01 写在前面: 上篇关于如何在内置仅1M的Esp8285做到 OTA 升级的同步到微信公众号,竟然被安信可的某些运维人员看到了,想要转载,我很欣慰,竟然自己的笔记可以被这么大型的公司员工认可! 我是 ...
- c++实现sscom串口助手循环发送_串口通讯你真的会了吗?不妨看看这些经验
点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看编程笔记! 平时使用串口打印出现乱码的绝大部分原因是串口波特率没对.那么我们怎么测量实际的波特率呢?在这之前,顺便一起回顾一下波特率的概念. 什 ...
- VC基于MSCOMM控件串口通讯
在mfc中进行串口通讯最简单的方法莫过于在对话框中使用MSCOMM控件了,MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem). 还可以发送命 ...
- delphi 串口通信发送_STM32第五章串口通讯详解
点击上方"果果小师弟",选择"置顶/星标公众号"干货福利,第一时间送达! 串口通信是串行通信里面的异步方式.串行通信是相对于并行通信来说的.串口是一个事实存在的 ...
- Android蓝牙串口通讯【转】
本文转载自:http://blog.sina.com.cn/s/blog_631e3f2601012ixi.html Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的 ...
最新文章
- 使用inetaddress测试目标可达性_白盒测试工具―Winams介绍
- 人脸关键点 Stasm
- hive链接mysql的shell命令_Hive shell 基本命令
- arma模型谱估计matlab_基于机器学习的心律失常分类(四)——心电信号特征提取[MATLAB]...
- WebMagic写的网络爬虫优秀文章
- 小数分数转换c语言,这是把小数转换成分数的程序,可是输入0.6666无限循环
- jquery.js和jquery-1.4.2.min.js的区别
- mysql opendrowset,java,mysql、jdbc
- 语音信号处理基础(一)
- 【语法】iOS(一)ObjectC的语法
- 鸿蒙系统会有彩蛋吗,华为新系统亮点不断,一个新功能让人欢呼,升级后还有惊喜彩蛋...
- win10添加桌面图标到开始屏幕
- 使用SpringBoot做一个班级管理系统
- SAP那些事-理论篇-7-SAP的优势和劣势
- 笔记本电脑禁用自带键盘
- 2013年12月甘肃省广播电台网络影响力排名
- 小丁在美国的惬意生活 日常学学英语吃吃BBQ-猎豹体育网
- Win32:三菱FX3U/FX5U读写软元件方法和注意事项
- Db2 purescale环境db2start因为缺少TSAMP license报错:SQL1677N
- MATLAB生成exe脱离matlab运行可执行程序
热门文章
- Apache commons-text和Configuration 命令执行CVE-2022-42889/CVE-2022-33980分析
- 伪随机序列MATLAB实现
- 佳能G1800 G2800 G3800提示5B00打印机清零软件用软件ST5302
- 简明python教程 沈洁元_Python简明教程-沈洁元
- html5 canvas+js贪吃蛇网页小游戏代码
- 送给你,PBA商业分析指南(全书下载)
- python运维是什么_什么是python自动化运维?
- MySQL 游标(CURSOR)
- yacc语法学习-part1
- 计算机组成原理白中英第五版之总线系统