关于STM32串口中 0x0a,0x0d的学习
**
以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的学习相关推荐
- STM32串口中 USART_GetITStatus 与 USART_GetFlagStatus的区别
一.ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)在判断相应位是否置1(读SR寄存器)前会先判断相应位的中断是 ...
- 基于STM32的0.96OLED基本显示学习,及 上下或左右的滑动显示长字符(使用硬件刷屏模式),OLED显示变量值操作详细解析
基于STM32的0.96OLED基本显示学习,及 上下或左右的滑动显示长字符(使用硬件刷屏模式),OLED显示变量值操作详细解析 简 介 一.项目说明 二.学习入门 1)开始了解例程 三.实战过程 ...
- STM32串口中断接收标记USART_RX_STA 学习
对于串口中断函数USART_RX_STA接收标记位解析,费话不多说了,直接上代码. #define USART1_REC_LEN 200 u8 USART1_RX_BUF[USART1_REC_LEN ...
- STM32单片机 关于超声波模块的学习(1)
分享一篇我刚刚弄完的一个超声波模块的学习 超声波模块的介绍: 1.单片机的一个IO口发送高电平的信号给Trig,信号时间要大于10us 2.然后模块的内部会发送方波 3.然后Echo会给单片机的IO口 ...
- 学习 stm32 FATFS 系统文件函数使用和学习查看说明以及常用函数例程
学习 stm32 FATFS 文件的日常操作,本次通过SDIO模式进行存储卡的设备连接,进行数据的读取操作.之前介绍过一起SD卡的读取操作, stm32 SD(SDSC)卡的学习与SPI 模式应用(卡 ...
- 给STM32新人的建议——如何开始学习STM32
很多人从51或者Arduino学习完,准备开始接触其他单片机的时候,都会听说STM32的大名.STM32是一款32位的单片机,目前来说应用市场很广泛.不过初次接触可能会有很多的不理解,下面说说我自己的 ...
- STM32寄存器地址名称映射(学习笔记之四)
单片机的程序编制主要是操作寄存器,而STM32功能更多,对应的寄存器也多,为了更好的管理和使用好寄存器,需要将这些寄存器进行管理和分配.以GPIOA为例:因为 GPIO 都是挂在 APB2 总线之上, ...
- STM32 串行FLASH文件系统FatFs
目录 一.Windows系统为例 二.文件系统的结构与特性 为什么要应用文件分配表? 三.FatFs文件系统 1- FatFs 文件系统源码介绍 2- FatFs在程序中的关系网 四.配置FatFs移 ...
- 安卓串口中InputStream数据接收不完整
串口读数组本身就很可能需要读几次才能读完,建议是写一个拼接数据的方法,每次记录读取的数据和数据的长度 一开始的写法如下 会出现串口读取断开情况 protected class LReadThread ...
最新文章
- java线程顺序输出_多线程按顺序输出ABC
- Scala 执行流程分析
- win10光驱位连接计算机,windows10不能识别光驱位硬盘
- linux用户恢复正常,Linux系统用户口令安全恢复方法
- php把buffer转化为图片_信息流广告 | 信息流广告怎么做?如何提高转化?
- 焦距物距像距图解 示意图_自制小孔成像装置 鞋盒DIY简单小孔成像制作图解
- DB破解(暗黑破坏神辅助)使用方法
- 机器学习笔记:训练集、验证集与测试集
- 怎么把c盘的软件移到d盘?
- Windows文件同步
- VTuber拍摄幕后:操作员、动捕设备、软件支撑
- 思科路由器配置命令详解及实例
- Android 自动换行添加控件
- CentOS7 防火墙开放端口配置
- KubeSphere——KubeSphere集群构建实战
- GAN GAN Inversion
- 在线URLEncode/URLDecode网址
- Python入门基础(下)之魔方方法
- AJAX应用的演示和源码
- 【赛纳斯】EC Raman电化学拉曼光谱检测系统推动科研新突破