单片机之串口数据处理

发布者:素雅之韵最新更新时间:2016-07-14 来源: eefocus关键字:单片机  串口数据处理 手机看文章 扫描二维码
随时随地手机看文章
随着硬件系统的模块化发展,很多电子产品都做出模块并采用串口进行数据通信。例如:GPRS模块、GPS模块、语音模块、热敏微型打印机、串口摄像头等等。在与这些模块进行数据通信都离不开串口,而对于串口的操作,由于串口本身没有标准的通信协议,所以很难做到非常统一的操作过程。一般来说,不同的模块其有着特殊的通信协议,我们只能根据其协议进行数据解码。

      虽然说串口没有标准协议,但是我们却可以把它们的相似部分提取出来,做成模块化的程序,方便代码的移植和理解。下面我们简单谈到串口数据的处理方法。。。。。
 
串口数据处理流程:


[原创文章] 单片机之串口数据处理 - 我心永恒 - ARM嵌入式研发 
一般来说,串口数据的接收都是采用中断方式,中断中只复制把串口发送的数据放入数据缓冲区中。而发送一般都是采用查询方式比较方便。不管是与什么设备通信,这一点完全是一致的。所以,我们完全可以把这部分代码独立起来。

定义数据结构如下:
  1. typedef struct 
  2. {
  3.     u16 WtCnt; // 写指针
  4.     u16 RdCnt;// 读指针
  5.     u16 BufLen;缓冲尺寸
  6.     u8  *RwBuf;// 读写缓冲
  7.  
  8. } DF_RCV;
复制代码
对于这个结构来说非常简单,参数1是用于结束数据计数,参数2为处理数据计数,参数3为缓冲的大小,参数4为缓冲区指针,这里用指针是为了保证这个结构的独立,否则无法满足各种需求。
 
实现函数:

1. 初始化函数

    本函数用于对串口结构体中的各种数据进行初始化。
  1. /**************************************************************************************
  2. * FunctionName   : DFInit()
  3. * Description    : 初始化
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. void DFInit(DF_RCV *pRcv)
  8.     u16 i;
  9.     
  10.     pRcv->WtCnt = 0x0000;
  11.     pRcv->RdCnt = 0x0000;
  12.     
  13.     for (i=0; iBufLen; i++)
  14.     {
  15.         pRcv->RwBuf[i] = 0x00;
  16.     }
  17. }
复制代码
2. 接收一字节数据

    本函数用于把串口中断接收的数据放入数据缓冲区中,并且接收计数器加1.
  1. /**************************************************************************************
  2. * FunctionName   : DFWriteByte()
  3. * Description    : 数据接收(接收中断调用)
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. void DFWriteByte(u8 dat, DF_RCV *pRcv)
  8. {
  9.     pRcv->RwBuf[pRcv->WtCnt] = dat;                                                    // 数据存入
  10.     
  11.     if (++(pRcv->WtCnt) >= pRcv->BufLen)                                            // 缓冲判断
  12.     {
  13.         pRcv->WtCnt = 0;
  14.     }
  15. }
复制代码
3. 读取一字节数据

    本函数用于从接收缓冲区中读取未处理的一字节数据,读计数器加1.
  1. /**************************************************************************************
  2. * FunctionName   : DFReadByte()
  3. * Description    : 从接受缓冲中读取一字节数据
  4. * EntryParameter : None
  5. * ReturnValue    : 返回读取数据
  6. **************************************************************************************/
  7. u8 DFReadByte(DF_RCV *pRcv)
  8. {
  9.     u8 val = 0x00;
  10.     
  11.     val = pRcv->RwBuf[pRcv->RdCnt];                                             // 读取一字节
  12.     if (++(pRcv->RdCnt) >= pRcv->BufLen)
  13.     {
  14.         pRcv->RdCnt = 0;                                                        // 清零
  15.     }
  16.     
  17.     return val;                                                                   // 返回数据
  18. }
复制代码
4. 获取缓冲区中未处理数据的长度

    本函数用于读取串口缓冲区中还未处理的数据的大小。
  1. /**************************************************************************************
  2. * FunctionName   : DFGetLen()
  3. * Description    : 获取缓冲区中未读数据长度
  4. * EntryParameter : None
  5. * ReturnValue    : 返回数据长度
  6. **************************************************************************************/
  7. u16 DFGetLen(DF_RCV *pRcv)
  8. {
  9.     return ((pRcv->WtCnt >= pRcv->RdCnt) ? ((pRcv->WtCnt - pRcv->RdCnt)) : 
  10.            ((pRcv->WtCnt + pRcv->BufLen) - pRcv->RdCnt));
  11. }
复制代码
有了以上几个函数,串口的处理就非常简单了。这几个函数可以应用到任何串口中,也可以应用到任务微处理器上,一致非常简单,应用也非常方便。下面我们说说实际的应用。
 
这部分代码为应用代码

为了保证数据的相对独立和模块化,下面代码将写入应用代码中,和上面的程序不能放在相同的文件中。

1. 数据定义

     首先需要定义一个缓冲区,这个缓冲区的大小根据实际应用定义,其大小一般为数据帧的最大值的2倍。之后需要定义一个DF_RCV数据,在这个数据中需要初始化这个结构图的参数。特别需要注意,缓冲的大小,和缓冲区指针赋值。
  1. u8 AU_Buf[AU_BUF_ZISE] = {0};
  2. DF_RCV AU_Rvc = {0, 0, AU_BUF_ZISE, AU_Buf};
复制代码
2. 编写数据接收函数

    本函数把串口数据放入缓冲区中,此函数必须在串口中断中调用。
  1. /**************************************************************************************
  2. * FunctionName   : AURcvDat()
  3. * Description    : 串口数据接收(串口中断服务调用)
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. void AURcvDat(u8 dat)
  8. {
  9.     DFWriteByte(dat, &AU_Rvc);
  10. }
复制代码
3. 数据处理函数

    本函数判断缓冲区中是否有数据,如果有,逐个读取并处理。
  1. /**************************************************************************************
  2. * FunctionName   : AUTaskCtrl()
  3. * Description    : 通信数据处理
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. void AUTaskCtrl(void)
  8. {
  9.     u8  tmpDat;
  10.     u16 i, len = 0;
  11.     static u8 sendMark = 0;
  12.  
  13.     len = DFGetLen(&AU_Rvc);                                                    // 获取未读数据长度
  14.     for (i=0; i < len; i++) 
  15.     {
  16.         tmpDat = DFReadByte(&AU_Rvc);                                           // 读一字节数据
  17.         AU_PrcRcvDat(tmpDat);
  18.     }
  19. }
  20.  
复制代码
 
 
函数AU_PrcRcvDat(tmpDat)是数据处理函数,首先是数据帧判断,如果是一帧数据,就进行相应操作,并把操作结果返回。了解了这个过程,串口的编程就变得非常简单。而且我们在读程序时,只要看懂一个串口处理过程,其他串口的程序就自然懂了,非常方便吧。
关键字:单片机  串口数据处理 引用地址:单片机之串口数据处理

上一篇:通过日期计算出星期
下一篇:浅谈如果通过程序读取AT24系列芯片型号

推荐阅读最新更新时间:2024-03-16 15:00

带有ARM内核的车规级MCU的高速测量与标定的解决方案
在“新三化”的背景下,车用 MCU 芯片 正在快速升级换代,供应链本地化也催生搭配 ARM 内核的车规级MCU不断落地。相关的MCU 产品 日益丰富,逐渐覆盖雨刷、车窗、车灯等车身控制模块,以及汽车 智能 化所需的智能座舱、 AD AS 控制器 等。 01 趋势 随着软件的复杂度提高,ARM内核MCU的测量标定正从低速场景过渡到高速场景,ECU内部测量 信号 的数量和频率越来越大。当数据吞吐量超过 CAN 总线带宽时,需要新的高速测量 接口 。针对以上需求,Vector为用户提供系统的可扩展的高速测量方案。 02 系统概述 目前主流的ARM内核的车规级MCU是使用Cortex-M系列 处理器 ,用于安全
[汽车电子]
带有ARM内核的车规级<font color='red'>MCU</font>的高速测量与标定的解决方案
IAR宣布支持瑞萨电子所有RA系列微控制器
IAR Systems宣布将全面覆盖瑞萨电子的RA Arm Cortex微控制器。完整的开发工具链IAR Embedded Workbench在易于使用的集成开发环境中提供强大的代码优化功能和全面的调试功能,并提供出色的全球技术支持和培训。 瑞萨电子的RA MCU提供了优化的性能,安全性,连接性,外围IP和灵活软件包(FSP)的组合,可解决下一代嵌入式解决方案。为了支持新家族,瑞萨已经建立了一个全面的合作伙伴生态系统,以提供可与RA MCU一起使用的一系列软件和硬件构建块,从而轻松开发用于以下用途的物联网(IoT)端点和边缘设备:工业和楼宇自动化,计量,医疗保健和家用电器应用。 除了高度优化的构建工具以外,IAR嵌入式工作台的开发
[焦点新闻]
如何使用AVR微控制器ATmega16连接霍尔传感器
霍尔传感器的工作原理是基于1869年Edwin Hall提出的霍尔效应。提出的声明说:“霍尔效应是在电导体上产生电压差(霍尔电压),横向于导体中的电流和垂直于电流的外加磁场。“ 那么,什么可以是最简单的声明形式,以更好的方式理解它?在本本中,将通过实际示例逐步说明。霍尔传感器将与Atmega16微控制器连接,一个LED将用于显示磁铁将被带到霍尔传感器附近时的效果。 什么是霍尔效应? 霍尔效应与磁场中的移动电荷有关。要以实用的方式理解,请将电池连接到导体,如下图(a)所示。电流(i)将开始从导体流过电池的正极到负极。 电子流(e-)将与电流的方向相反,即从电池的负极端子通过导体到电池的正极端子。在我们测量导体之间的电
[单片机]
如何使用AVR<font color='red'>微控制器</font>ATmega16连接霍尔传感器
基于C8051F系列单片机的低功耗设计
引言   在控制终端系统设计中,当系统要求整体功耗偏低时,C8051系列单片机是一个最佳的选择,它们拥有灵活的时钟硬件,使系统能够方便地在高效运作模式与低功耗模式间进行转换,智能的电源管理模式能够在正常工作及待机状态自由切换,从而降低整个系统的能量损耗,当工作频率低于10kHz时,时钟丢失检测器(MCD)能够引发系统产生复位,确保系统工作的安全可靠。 1 C8051F各部分组件的功耗   当一个系统对功耗要求严格时,可以在硬件电路建立前首先粗略计算一下整个系统所需的功耗,由于C8051F系列单片机为数模混合SOC系统,能够实现整个设计的大部分功能,因此整个设计系统的功耗将主要集中在C8015F系列单片机的能量消耗上。   整
[单片机]
复旦微电子推出FM33LE0系列MCU产品家族
2022年5月30日,上海讯——复旦微电子今日推出基于 ARM cortex M0内核的FM33LE0系列MCU产品家族 。该系列是FM33LC0系列的成本友好版本,在保证硬件兼容FM33LC0系列的基础上,复旦微MCU团队对其片上存储资源和外设资源进行了更加精准的规划,并且优化部分功能,使其与客户端的需求契合度更高,从而为客户端的产品研发提供了更多的可能性。 该系列MCU是基于ARM Cortex-M0内核的32位低功耗MCU芯片,最高主频为64MHz,提供最大128KB FLASH程序存储空间,搭配 16KB RAM;片上集成LCD驱动、带温补的RTC、SAR-ADC、AES加密,以及丰富的通用外设接口;支持多种封装
[单片机]
复旦微电子推出FM33LE0系列<font color='red'>MCU</font>产品家族
基于单片机的无人机真空速测量系统设计
真空速是指飞机相对空气运动时所具有的真实速度,它是飞机安全飞行的重要参数。准确的真空速数据信息对于提高飞行的安全性、准确性和经济性起着相当大的作用。飞机相对于空气运动时,可根据运动的相对性将飞机看作不动,而空气是以大小相等,方向相反的流速流过飞机。真空速无法直接测出,只能根据大气静压和动压间接计算出来。本文介绍了一种基于C8051F352单片机的无人机真空速测量系统的设计,该系统测量结果的相对误差小于4%,能够满足无人机飞行控制系统的精度要求。 1 测量原理 无人机的真空速通常跟大气静压和动压有关,对于飞行高度不超过11 000 m,飞行马赫数不大于1的情况,真空速可由公式(1)计算: 式中,PH为对应高度的大
[单片机]
基于<font color='red'>单片机</font>的无人机真空速测量系统设计
基于单片机旋转时钟的设计
1 前言 目前,时钟的种类是越来越多样,功能是越来越丰富了,但大多时钟还是传统上的时钟,即固定的表盘与指针,其形式与功能都比较单一,故难以吸引人。而一款旋转时钟不仅在创意上摆脱了传统时钟的设计而且也能迎合人们猎奇的心理,并且功能也可以多样化,不仅可以显示时间、日期,甚至连文字都能够显示。文章基于单片机设计了一款跟传统机械时钟一样具有秒针、分针、时针和表盘刻度的旋转时钟,并且具有准确显示即时时间和校准时间功能,且均可由红外遥控器方便完成。 2 总体设计思想及方案 文章拟采用16个发光二极管的亮灭来模拟时钟表盘,其旋转用一个直流电机转动来实现;时钟的1s源信号用DS1302时钟芯片产生;为了保证时钟盘面显示的稳定采用红外对管来实现;
[单片机]
基于<font color='red'>单片机</font>旋转时钟的设计
基于80C51单片机和CH375芯片实现打印机驱动系统的设计
引言 本课题来源于北京普析通用公司的一个项目。由于公司现有单机版光谱仪器产品(如1810、T6等)采用的是并行口打印技术,而随着USB打印机技术的逐渐普及,并行口打印机越来越不好买到,而且有些用户的打印机只是USB接口而非并行口,因此现有仪器产品对打印机的支持变得不能适应用户需要。为了实现能将公司的并行口仪器直接和USB打印机相连进行打印,决定设计开发一款LPT-USB打印机的驱动器,负责并口仪器和USB打印机的连接。 本文利用单片机和USB总线接口芯片实现LPT-USB打印机的驱动器设计。利用该设计将能够实现并行打印口数据可以在USB打印机上的直接打印工作,克服了有些并口仪器必须连接并口打印机才能打印的弊端,极大地方便了用户
[单片机]
基于80C51<font color='red'>单片机</font>和CH375芯片实现打印机驱动系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved