关闭
搜索
搜索
本版
帖子
用户
热搜:
程序员
简洁模式
高级模式
用户组: 游客
消息
提醒
新听众
我关注的
帖子
道具
勋章
任务
设置
退出
请
登录
后使用快捷导航
没有帐号?
立即注册
设为首页
收藏本站
开启辅助访问
切换到窄版
登录
or
立即注册
快捷导航
搜索
首页
论坛
BBS
MCU单片机技术
程序员交流
单片机串口接收不定长数据的通用方法
[复制链接]
作者:
蝶儿哼哼
版块:
›
MCU单片机技术
›
stm
发布时间:
2020-10-11 09:11:43
2023
0
返回列表
蝶儿哼哼
当前离线
中级会员
中级会员, 积分 285, 距离下一级还需 215 积分
中级会员
中级会员, 积分 285, 距离下一级还需 215 积分
积分
285
发消息
楼主
电梯直达
蝶儿哼哼
发表于 2020-10-11 09:11:43
|
只看该作者
|
倒序浏览
|
阅读模式
我之前写过一篇文章关于STM32单片机接收不定长数据的方法,这篇文章可以在瑞生网(http://Mrs.Pub)搜索关键字“不定长”看到,不过...这个只是针对某些STM32单片机的方法,比如F1系列的就可以使用,然而...我在后续使用其它STM32系列的单片机时,发现这个方法不能用,比如L0系列的,我用IDLE判断,总是还没有接收完一帧数据,就会发生IDLE中断,于是...我只能用下面的通用方法来解决了,这个通用的方法,其实原理和使用IDLE的原理一样:接收完一个字节以后,如果超过了一定的时间,就认为是接收完一帧数据了。首先...我们要知道,串口是接收一个字节,就会发生一次中断,如果一帧数据包含10个字节,就会发生10次中断。在接收一个字节以后,会紧跟着接收下一个字节,如果时间超了一定值,就代表一帧数据已经发完了。下面,我分别用STM32和51单片机的代码来演示一下这个通用代码的实现。
1、STM32(以STM32L0系列为例)
voidLPUART1_IRQHandler(void)// 低功耗串口1中断服务函数{if(__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_RXNE))// 如果接收到一个字节{Res_Buf[Res_Count++]=hlpuart1.Instance->RDR;// 把数据保存到接收数组Res_Sign=1;// 表示已经接收到数据Res_Times=0;// 延时计数器清0}}
2、51单片机(以STC8系列为例)
voidUART1_Isr interrupt 4// 串口中断服务函数{if(RI)// 如果接收到一个字节{RI =0;// 中断标志位清0Res_Buf[Res_Count++]=SBUF;// 把数据保存到接收数组}}
3、在主函数中使用
if(Res_Sign==1)// 如果串口接收到数据{//延时等待接收完一帧数据do{Res_Times++;// 延时计数器+1HAL_Delay(1);// 延时1ms}while(Res_Times
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有帐号?
立即注册
收藏
0
相关帖子
•
深入理解高性能网络开发路上的绊脚石-同步阻塞网络IO
•
群晖系统ssh服务开启和存储空间情况查询方法
•
Linux网络分析必备技能:tcpdump实战详解
•
STM32的DMA简介
•
用Bash读写文件|Linux中国
•
企业对C语言/C++程序员的技能要求有哪些?
•
TCP连接中TIME_WAIT状态的作用及优化
•
独立主机网站转移操作方式
•
SpringBoot搭建ELK,这才是正确看日志的方式!
•
《Linux内核编码风格》官方手册最新中译本
回复
使用道具
举报
返回列表
高级模式
B
Color
Image
Link
Quote
Code
表情
@朋友
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
快速回复
返回顶部
返回列表