**

以STM32正点原子的串口接收中断 服务程序为例:

**

    void USART1_IRQHandler(void)                 //串口1中断服务程序{u8 Res;#ifdef OS_TICKS_PER_SEC      //如果时钟节拍数定义了,说明要使用ucosII了.OSIntEnter();    #endifif(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res =USART_ReceiveData(USART1);//(USART1->DR);    //读取接收到的数据if((USART_RX_STA&0x8000)==0)//接收未完成{if(USART_RX_STA&0x4000)//接收到了0x0d{if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始else USART_RX_STA|=0x8000;  //接收完成了 }else //还没收到0X0D{   if(Res==0x0d)USART_RX_STA|=0x4000;else{USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;USART_RX_STA++;if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收   }      }}          }
#ifdef OS_TICKS_PER_SEC     //如果时钟节拍数定义了,说明要使用ucosII了.OSIntExit();
#endif
}

其中 0D 0A这是自行定义的一种数据帧结束标志,不定义这个不没法判断你这一帧数据什么时候结束了, 0D 0A是什么东西咧,它就是我们的回车键的ASCII码, 0D回车,0A换行 像在windows超级终端里一条数据输入完按回车正好来了个0D 0A,表示数据发完了

0x0D(asc码是13) 指的是“回车” \r是把光标置于本行行首

0x0A(asc码是10) 指的是“换行” \n是把光标置于下一行的同一列

0x0D + 0x0A 回车换行 \r\n把光标置于下一行行首

\n是换行,英文是linefeed,ASCII码是0xA。

\r是回车,英文是carriage return ,ASCII码是0xD。

USART_RX_STA是16位的数据,原子定义了最高位15是接收完成标志位,USART_RX_STA[15]=1时表示接收完成。所以0x8000好理解吧,就是最高位为1其他都为0,跟USART_RX_STA相与,低15位都被置0了只留下最高位即接收完成标志位,所以就可以通过USART_RX_STA&0x8000这样的方式来判断是否接收完成。
USART_RX_STA与0X3FFF进行与运算是用来确定接收到的数据长度的,USART_RX_STA的每个bit的含义教程里面有详细的讲解。

下面转自一个解读:
解读:
怎么写接收函数?

只要收到一个字节 stm32会产生中断

进入中断编写

//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
u16 USART_RX_STA=0; //接收状态标记

第一步判断标志位是否正的接收到

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

第二步 接收下数据

Res =USART_ReceiveData(USART1); //读取接收到的数据

第三步判断标志位USART_RX_STA 上次是否接收完成(上次接收完成了会把标志位置1)

if((USART_RX_STA&0x8000)==0)//接收未完成

其中USART_RX_STA 是自己定义的16位变量用于标志接收完成或者接收到0x0d 类似于自己定义了一个寄存器

第四步 判断标志位USART_RX_STA 上次是否接收到了0xod

if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始 如果上次接收到了/r(0x0d)这次应该是/n (0x0a)

else USART_RX_STA|=0x8000; //接收完成了

否则上次没有接收到0x0d

if(Res==0x0d)USART_RX_STA|=0x4000; //判断本次是否接收到了0x0d
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; //把接收到的数据存入buf缓存区
USART_RX_STA++; //记录接收的数据字节数量

if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收 接收的数据不能无限制的大

}

总结
这样的编程方式其实利用了状态机思想,增强稳定性,减少错误

本次实验有两个状态bit15接收状态,bit14接收到/r状态

编程时应该观察两个状态,注意到临界态 切换状态

首先判断当前接收处于什么状态,而不是盲目的接收

1、首先观察bit15状态 如果处于接收态应该注意 观察下一个状态bit14 在满足条件时切换bit15

2、观察bit14状态 如果处于接收到了/r态 再应该判断接收值是否满足 切换bit15态的条件

如果处于没有接收到\r态,应该判断接收值是否满足切换bit14的条件

if(USART_RX_STA&0x4000)//上次接收到了0x0d /r

else USART_RX_STA|=0x8000; 改变接收状态bit15

if(Res==0x0d) 接收到了/r

USART_RX_STA|=0x4000; 切换状态bit14

https://blog.csdn.net/shenlong1356/article/details/79940280
版权声明:本文为博主原创文章,转载请附上博文链接!

关于STM32串口中 0x0a,0x0d的学习相关推荐

  1. STM32串口中 USART_GetITStatus 与 USART_GetFlagStatus的区别

    一.ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)在判断相应位是否置1(读SR寄存器)前会先判断相应位的中断是 ...

  2. 基于STM32的0.96OLED基本显示学习,及 上下或左右的滑动显示长字符(使用硬件刷屏模式),OLED显示变量值操作详细解析

    基于STM32的0.96OLED基本显示学习,及 上下或左右的滑动显示长字符(使用硬件刷屏模式),OLED显示变量值操作详细解析 简   介 一.项目说明 二.学习入门 1)开始了解例程 三.实战过程 ...

  3. STM32串口中断接收标记USART_RX_STA 学习

    对于串口中断函数USART_RX_STA接收标记位解析,费话不多说了,直接上代码. #define USART1_REC_LEN 200 u8 USART1_RX_BUF[USART1_REC_LEN ...

  4. STM32单片机 关于超声波模块的学习(1)

    分享一篇我刚刚弄完的一个超声波模块的学习 超声波模块的介绍: 1.单片机的一个IO口发送高电平的信号给Trig,信号时间要大于10us 2.然后模块的内部会发送方波 3.然后Echo会给单片机的IO口 ...

  5. 学习 stm32 FATFS 系统文件函数使用和学习查看说明以及常用函数例程

    学习 stm32 FATFS 文件的日常操作,本次通过SDIO模式进行存储卡的设备连接,进行数据的读取操作.之前介绍过一起SD卡的读取操作, stm32 SD(SDSC)卡的学习与SPI 模式应用(卡 ...

  6. 给STM32新人的建议——如何开始学习STM32

    很多人从51或者Arduino学习完,准备开始接触其他单片机的时候,都会听说STM32的大名.STM32是一款32位的单片机,目前来说应用市场很广泛.不过初次接触可能会有很多的不理解,下面说说我自己的 ...

  7. STM32寄存器地址名称映射(学习笔记之四)

    单片机的程序编制主要是操作寄存器,而STM32功能更多,对应的寄存器也多,为了更好的管理和使用好寄存器,需要将这些寄存器进行管理和分配.以GPIOA为例:因为 GPIO 都是挂在 APB2 总线之上, ...

  8. STM32 串行FLASH文件系统FatFs

    目录 一.Windows系统为例 二.文件系统的结构与特性 为什么要应用文件分配表? 三.FatFs文件系统 1- FatFs 文件系统源码介绍 2- FatFs在程序中的关系网 四.配置FatFs移 ...

  9. 安卓串口中InputStream数据接收不完整

    串口读数组本身就很可能需要读几次才能读完,建议是写一个拼接数据的方法,每次记录读取的数据和数据的长度 一开始的写法如下 会出现串口读取断开情况 protected class LReadThread ...

最新文章

  1. java线程顺序输出_多线程按顺序输出ABC
  2. Scala 执行流程分析
  3. win10光驱位连接计算机,windows10不能识别光驱位硬盘
  4. linux用户恢复正常,Linux系统用户口令安全恢复方法
  5. php把buffer转化为图片_信息流广告 | 信息流广告怎么做?如何提高转化?
  6. 焦距物距像距图解 示意图_自制小孔成像装置 鞋盒DIY简单小孔成像制作图解
  7. DB破解(暗黑破坏神辅助)使用方法
  8. 机器学习笔记:训练集、验证集与测试集
  9. 怎么把c盘的软件移到d盘?
  10. Windows文件同步
  11. VTuber拍摄幕后:操作员、动捕设备、软件支撑
  12. 思科路由器配置命令详解及实例
  13. Android 自动换行添加控件
  14. CentOS7 防火墙开放端口配置
  15. KubeSphere——KubeSphere集群构建实战
  16. GAN GAN Inversion
  17. 在线URLEncode/URLDecode网址
  18. Python入门基础(下)之魔方方法
  19. AJAX应用的演示和源码
  20. 【赛纳斯】EC Raman电化学拉曼光谱检测系统推动科研新突破

热门文章

  1. javaWeb(七)ajax远程调用
  2. QT 中Socket客户端与服务器异常断开后重连
  3. Electron+Vue的开发经验
  4. python爬虫-获取腾讯视频的弹幕
  5. Golang读写锁读锁重复获取的问题
  6. docker启动ssh、xrdp命令
  7. Stata学习笔记|导入数据
  8. 服务器不正常断电关机导致sqlserver被标记为“可疑”
  9. 贵阳c语言学习,贵阳市c语言编程
  10. 细谈八种架构设计模式及其优缺点概述