【全球报资讯】嵌入式|串口接收数据的几种处理方式!
说起通信,首先想到的肯定是串口,日常中232和485的使用比比皆是,数据的发送、接收是串口通信最基础的内容。这篇文章主要讨论串口接收数据的断帧操作。
空闲中断断帧
一些mcu(如:stm32f103)在出厂时就已经在串口中封装好了一种中断——空闲帧中断,用户可以通过获取该中断标志位来判断数据是否接收完成,终端标志在中断服务函数中获取,使用起来相对简单。
STM32串口空闲中断接收不定长数据(DMA方式)
(相关资料图)
voidUART4_IRQHandler(void){uint8_tdata=0;data=data;if(USART_GetITStatus(LoraUSARTx,USART_IT_RXNE)==SET){USART_ClearITPendingBit(LoraUSARTx,USART_IT_RXNE);if(Lora_RecvData.Rx_over==0)Lora_RecvData.RxBuf[Lora_RecvData.Rx_count++]=LoraUSARTx->DR;}if(USART_GetITStatus(LoraUSARTx,USART_IT_IDLE)==SET){data=LoraUSARTx->SR;data=LoraUSARTx->DR;Lora_RecvData.Rx_over=1;//接收完成}}
例程中,当接收完成标志Lora_RecvData.Rx_over为1时,就可以获取uart4接收到的一帧数据,该数据存放在Lora_RecvData.RxBuf中。
超时断帧
空闲帧中断的使用固然方便,但是并不是每个mcu都有这种中断存在(只有个别高端mcu才有),那么这个时候就可以考虑使用超时断帧了。
Modbus协议中规定一帧数据的结束标志为3.5个字符时长,那么同样的可以把这种断帧方式类比到串口的接收上,这种方法需要搭配定时器使用,其作用原理就是:串口进一次接收中断,就打开定时器超时中断,同时装载值清零(具体的装载值可以自行定义),只要触发了定时器的超时中断,说明在用户规定的时间间隔内串口接收中断里没有新的数据进来,可以认为数据接收完成。
uint16_tTime3_CntValue=0;//计数器初值/********************************************************************************TIM3中断服务函数******************************************************************************/voidTim3_IRQHandler(void){if(TRUE==Tim3_GetIntFlag(Tim3UevIrq)){Tim3_M0_Stop();//关闭定时器3Uart0_Rec_Count=0;//接收计数清零Uart0_Rec_Flag=1;//接收完成标志Tim3_ClearIntFlag(Tim3UevIrq);//清除定时器中断}}voidTime3_Init(uint16_tFrame_Spacing){uint16_tu16ArrValue;//自动重载值uint32_tu32PclkValue;//PCLK频率stc_tim3_mode0_cfg_tstcTim3BaseCfg;//结构体初始化清零DDL_ZERO_STRUCT(stcTim3BaseCfg);Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3,TRUE);//BaseTimer外设时钟使能stcTim3BaseCfg.enWorkMode=Tim3WorkMode0;//定时器模式stcTim3BaseCfg.enCT=Tim3Timer;//定时器功能,计数时钟为内部PCLKstcTim3BaseCfg.enPRS=Tim3PCLKDiv1;//不分频stcTim3BaseCfg.enCntMode=Tim316bitArrMode;//自动重载16位计数器/定时器stcTim3BaseCfg.bEnTog=FALSE;stcTim3BaseCfg.bEnGate=FALSE;stcTim3BaseCfg.enGateP=Tim3GatePositive;Tim3_Mode0_Init(&stcTim3BaseCfg);//TIM3的模式0功能初始化u32PclkValue=Sysctrl_GetPClkFreq();//获取Pclk的值//u16ArrValue=65535-(u32PclkValue/1000);//1ms测试u16ArrValue=65536-(uint16_t)((float)(Frame_Spacing*10)/RS485_BAUDRATE*u32PclkValue);//根据帧间隔计算超时时间Time3_CntValue=u16ArrValue;//计数初值Tim3_M0_ARRSet(u16ArrValue);//设置重载值Tim3_M0_Cnt16Set(u16ArrValue);//设置计数初值Tim3_ClearIntFlag(Tim3UevIrq);//清中断标志Tim3_Mode0_EnableIrq();//使能TIM3中断(模式0时只有一个中断)EnableNvic(TIM3_IRQn,IrqLevel3,TRUE);//TIM3开中断}/**************************此处省略串口初始化部分************************///串口0中断服务函数voidUart0_IRQHandler(void){uint8_trec_data=0;if(Uart_GetStatus(M0P_UART0,UartRC)){Uart_ClrStatus(M0P_UART0,UartRC);rec_data=Uart_ReceiveData(M0P_UART0);if(Uart0_Rec_Count
例程所用的是华大的hc32l130系列mcu,其它类型的mcu也可以参考这种写法。其中超时时间的计算尤其要注意数据类型的问题,u16ArrValue = 65536 - (uint16_t)((float)(Frame_Spacing * 10)/RS485_BAUDRATE * u32PclkValue);其中Frame_Spacing为用户设置的字符个数,uart模式为一个“1+8+1”共10bits。
状态机断帧
状态机,状态机,又是状态机,没办法!谁让它使用起来方便呢?其实这种方法我用的也不多,但是状态机的思想还是要有的,很多逻辑用状态机梳理起来会更加的清晰。
相对于超时断帧,状态机断帧的方法节约了一个定时器资源,一般的mcu外设资源是足够的,但是做一些资源冗余也未尝不是一件好事,万一呢?对吧。
嵌入式软件架构设计-状态机
//状态机断帧voidUART_IRQHandler(void)//作为485的接收中断{uint8_tcount=0;unsignedcharlRecDat=0;if(/*触发接收中断标志*/){//清中断状态位rec_timeout=5;if((count==0))//接收数据头,长度可以自定义{RUart0485_DataC[count++]=/*串口接收到的数据*/;gRecStartFlag=1;return;}if(gRecStartFlag==1){RUart0485_DataC[count++]=/*串口接收到的数据*/;if(count>MAXLEN)//一帧数据接收完成{count=0;gRecStartFlag=0;if(RUart0485_DataC[MAXLEN]==CRC16(RUart0485_DataC,MAXLEN)){memcpy(&gRecFinshData,RUart0485_DataC,13);gRcvFlag=1;//接收完成标志位}}}return;}return;}
这种做法适合用在一直有数据接收的场合,每次接收完一帧有效数据后就把数据放到缓冲区中去解析,同时还不影响下一帧数据的接收。整个接收状态分为两个状态——接收数据头和接收数据块,如果一帧数据存在多个部分的话还可以在此基础上再增加几种状态,这样不仅可以提高数据接收的实时性,还能够随时看到数据接收到哪一部分,还是比较实用的。
"状态机+FIFO"断帧
记得刚毕业面试的时候,面试官还问过我一个问题:如果串口有大量数据要接收,同时又没有空闲帧中断你会怎么做?
没错,就是FIFO(当时并没有回答上来,因为没用过),说白了就是开辟一个缓冲区,每次接收到的数据都放到这个缓冲区里,同时记录数据在缓冲区中的位置,当数据到达要求的长度的时候再把数据取出来,然后放到状态机中去解析。当然FIFO的使用场合有很多,很多数据处理都可以用FIFO去做,有兴趣的可以多去了解一下。
/********************串口初始化省略,华大mcuhc32l130******************/voidUart1_IRQHandler(void){uint8_tdata;if(Uart_GetStatus(M0P_UART1,UartRC))//UART0数据接收{Uart_ClrStatus(M0P_UART1,UartRC);//清中断状态位data=Uart_ReceiveData(M0P_UART1);//接收数据字节comFIFO(&data,1);}}/******************************FIFO*******************************/volatileuint8_tfifodata[FIFOLEN],fifoempty,fifofull;volatileuint8_tuart_datatemp=0;uint8_tcomFIFO(uint8_t*data,uint8_tcmd){staticuint8_trpos=0;//当前写的位置position0--99staticuint8_twpos=0;//当前读的位置if(cmd==0)//写数据{if(fifoempty!=0)//1表示有数据不为空,0表示空{*data=fifodata[rpos];fifofull=0;rpos++;if(rpos==FIFOLEN)rpos=0;if(rpos==wpos)fifoempty=0;return0x01;}elsereturn0x00;}elseif(cmd==1)//读数据{if(fifofull==0){fifodata[wpos]=*data;fifoempty=1;wpos++;if(wpos==FIFOLEN)wpos=0;if(wpos==rpos)fifofull=1;return0x01;}elsereturn0x00;}return0x02;}/********************************状态机处理*******************************/voidLoopFor485ReadCom(void){uint8_tdata;while(comFIFO(&data,0)==0x01){if(rEadFlag==SAVE_HEADER_STATUS)//读取头{if(data==Header_H){buffread[0]=data;continue;}if(data==Header_L){buffread[1]=data;if(buffread[0]==Header_H){rEadFlag=SAVE_DATA_STATUS;}}else{memset(buffread,0,Length_Data);}}elseif(rEadFlag==SAVE_DATA_STATUS)//读取数据{buffread[i485+2]=data;i485++;if(i485==(Length_Data-2))//数据帧除去头{unsignedshortcrc16=CRC16_MODBUS(buffread,Length_Data-2);if((buffread[Length_Data-2]==(crc16>>8))&&(buffread[Length_Data-1]==(crc16&0xff))){rEadFlag=SAVE_OVER_STATUS;memcpy(&cmddata,buffread,Length_Data);//拷贝Length_Struct个字节,完整的结构体}else{rEadFlag=SAVE_HEADER_STATUS;}memset(buffread,0,Length_Data);i485=0;break;}}}}
好了,就这些吧,如果有没有注意到的地方,欢迎各位看官给出宝贵意见,相互学习,共同进步!
本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
猜你喜欢:
分享一种日志滚动覆盖的方法
bug解决不了?使用日志法
关于嵌入式系统日志打印的一点建议
分享一份嵌入式软件工具清单!
易懂 | 手把手教你编写你的第一个上位机
实用 | 10分钟教你搭建一个嵌入式web服务器
嵌入式常用通信传输协议动图,收藏!
适用于嵌入式的差分升级通用库!
分享一种灵活性很高的协议格式(附代码例子)
分享几个实用的代码片段(第二弹)
在公众号聊天界面回复1024,可获取嵌入式资源;回复m,可查看文章汇总
标签:
- 黄山提升政府采购透明度 助力实体经济持续健康稳定发展
- 1-2月黄山新签“双招双引”项目103个 总投资额139.7亿元
- 池州海关共签发RCEP原产地证书22份 签证金额92.7万美元
- 宿州泗县深入推进文旅融合发展 擦亮城市品牌
- 河北工业生产平稳开局 固定资产投资较快增长
- 昆明西山区深入实施人才强区战略 建立健全招商招才引资并轨新模式
- 2月唐山新建商品住宅销售价格与上月持平 同比下降0.8%
- 去年河北电子信息产业实现主营业务收入2367.7亿元 同比增长22.4%
- 绥化望奎以工业化思维为引领 推动肉类加工制造产业腾飞
- 绥化市监局推出多项举措 大力促进有机产品产业发展
- 半路出家无心插柳 杭州西湖区“菌菇宝宝”变废为宝
- 温州鹿城区藤桥主打藤桥熏鸡 近两年销售额年均增长20%以上
- 1-2月安徽限额以上消费品零售额1030.4亿元 同比增长10.4%
- 2021年合肥市茶园面积13.6万亩 产值176350万元
- 淡季不忘引流 京郊民宿市场将很快迎来回暖
- 郴州安仁文旅项目集中开工 总投资1000万元
- 江苏服务业继续保持发展强劲势头 为高质量发展提供有力支撑
- 黄山休宁经开区摸排基础设施项目17个 计划总投资29709万元
- 前两个月宣城出口31亿元 增长34.4%
- 滁州凤阳2021年共接待游客225万人次 旅游综合收入20.25亿元
- 1-2月宿州市民间投资同比增长19.2% 居全省第3位
- 宿州严格审核把关 抢抓发行地方政府专项债券政策机遇
- 1-2月亳州市进出口总值5.5亿元 同比下降17.4%
- 合肥:弘扬茶文化 初步形成一条生态发展之路
- 合肥:建成“数字中国”领先城市 推进城市数字化转型
- 甘肃再续“艾黎情”:探职业教育德技并修
- 【城市守望者】致敬抗“疫”一线的“拆弹专家”
- 浙江绍兴越城区核酸检测结果公布 除1例阳性外其余均为阴性
- 内地首例奥密克戎变异株感染者身体状况如何?来自哪里?专家解读→
- 对变异病毒已有准备!关于中国新冠药物,钟南山发声→
- 江苏睢宁小网格大担当 织就乡村振兴“幸福网”
- 改造老旧小区 共享幸福生活
- 天津静海:群众在哪里,文明实践就延伸到哪里
- 齐齐哈尔:初步判断疫情感染来源为接触新冠病毒污染环境和物品
- 重庆大竹林派出所副所长因对群众态度简单粗暴被停职
- 黑龙江讷河病例感染源初步判断为新冠病毒污染的环境和物品
- 致敬2021
- 浙江瑞安民警捐献造血干细胞:14年前的心愿终将如愿
- “考研房”涨价离谱 律师:借机宰客有违市场伦理
- 广州白云机场:14天内有东莞旅居史的旅客须凭48小时核酸阴性证明乘机
- 浙江绍兴本轮疫情已报告确诊病例145例 无症状感染者1例
- 福建龙岩一男子和前妻斗气 扛着126斤硬币到法院“还钱”
- 重庆这座立交酷似“悟空” 走红 设计师揭秘(图)
- 青海警方破获特大电诈案 涉案流水高达1.7亿
- 云南新增境外输入确诊病例3例
- 黑龙江讷河市5名核酸阳性人员流调溯源:接触被新冠病毒污染的环境和物品
- 男子爱上女主播 假扮女主播闺蜜教其他男粉丝刷单
- 广西三市警方联手破获毒品案 全链条摧毁跨境贩毒团伙
- 广东东莞发现2例无症状感染者,部分镇今起全员筛查
- 从百二秦关到闻道凯旋 一个殉职医生最后的朋友圈
- 浙江发补充说明:三地铁路出行政策随风险等级同步调整
- 内蒙古新增本土确诊病例5例 均在呼伦贝尔满洲里市
- 陕西新增本土确诊病例1例 系隔离酒店工作人员
- 31省份新增新冠肺炎确诊病例76例 其中本土51例
- 浙江新增新冠肺炎确诊病例45例 其中本土44例
- 技能就是财富 技工也是人才
- 黑龙江新增本土确诊病例1例、本土无症状感染者4例
- 冷空气“调休”!我国大部陆续迎回暖 中东部雨雪稀少
- 华北黄淮等地大气扩散条件转差 冷空气将影响中东部
- 别误读了野猪或将不再是“三有”动物
- 您的ETC已到期?当心这个诈骗短信!
- 对回家的“宝贝”少一些关注,也是一种帮助
- 升温!北京今日阳光在线 最高气温将升至8℃
- 那年今日 | 一张漫画涨知识之12月14日
- 40岁男子一觉醒来突然听不见了 原因是……
- 本年度星空压轴大赏上演 双子座流星雨观赏地图来了
- 广东东莞大朗镇报告2例新冠肺炎无症状感染者
- 商丘4885份被盗出生证去哪了?10年“悬案”引关注
- 浙江海宁警方通报国家公祭日女子穿和服逛街
- 厨艺不精调料凑?懒人调料:年轻人的“下厨神器”
- “您的ETC已到期?”警方提醒:当心这个诈骗短信
- “网红”局长的热度 自述:走红后我就没有周末了
- 寻回被拐10年的儿子后又送走 儿子:害我没家了
- 小城里的三张面孔和警号301137
- 倡导“就地过年”,需因地制宜科学防疫
- 别用“入乡随俗”为星巴克找借口
- 北京地铁14号线年底全线贯通运营
- 天津市从入境人员中检出奥密克戎变异株
- “外滩活地图”黄俊:一个不想出圈的段子手交警
- 寻找一双儿女的25年
- 无锡市场监管部门责成星巴克涉事门店停业整改
- 海岛警事:为了一座岛和2900平方公里的海
- 北京民警宏福苑抗疫26天:“今夜我和雪花一起出发”
- 星巴克的“金标准”缘何败给了“潜规则”
- 患者被低价药“惊呆”的场面应该更多些
- 影视剧“超前点评”不止是“低级错误”
- “南昌鹦鹉案”下发不起诉决定书 网店上架费氏牡丹鹦鹉被拒
- 河南商丘4885份出生医学证明被盗始末追踪
- 绍兴市病例62-109活动轨迹公布
- 12月7日以来,杭州累计报告新冠肺炎确诊病例19例
- 浙江绍兴新增确诊病例37例 上虞区占36例
- 河南高院对张成功案作出死刑判决
- 四川一滑雪场停电游客被困索道 官方回应
- 浙江绍兴越城区新增1例新冠肺炎确诊病例 当地对防控区域划分进行调整
- 中国内地首次检出新冠病毒奥密克戎变异株
- 知网除了涉及著作权纠纷,是否涉嫌违反《反垄断法》?
- 浙江绍兴越城区新增1例新冠肺炎确诊病例
- 四川眉山千箱柑橘送往呼和浩特市抗疫一线
- 两名青年男女探险三亚落笔洞遗址被困沼泽 消防成功救援
- 中国地理学大会在福州发布《中国地理学界碳中和科技行动福州宣言》
广告
广告
- 【全球报资讯】嵌入式|串口接收数据的几种处理方式!
- 每日视点!雄安新区六周年丨图览雄安
- 全球播报:赛尔号精灵圣殿干嘛的_赛尔号精灵圣殿
- 世界讯息:黄山山顶酒店大堂挤满过夜游客 酒店回应并不是一房难求
- 每日看点!上海车展重磅自主新能源车型预告:腾势N7、海鸥、仰望U8
- 世界今亮点!护理技术学校排名(护理专业学校排名)
- 新资讯:风吹校园,春耕成诗!杨浦少年化身“小小诗人”
- 当前看点!华福证券给予招商轮船买入评级 超级油轮船队结构优势凸显 顺周期弹性首选 目标价格为9.71元
- 全球新动态:春日动起来 !下肢身体拉伸锻炼
- 世界即时看!货拉拉造车的“夺命三连问”
- 天天快资讯:东吴证券:给予德方纳米买入评级,目标价位323.1元
- 环球观点:证券板块震荡拉升 东方财富涨近7%
- 焦点热议:重点产业、住宅建设、文化设施 静安区举行第二季度重大项目集中开工仪式
- 即时:否认涉赌债纠纷,一起来盘一盘张继科的商业版图
- 【当前热闻】走过四季,“百村万帐”如何山花“烂漫”?
- 世界看热讯:让“城中村”涅槃重生,上海今年将计划启动10个改造项目
- 天天热资讯!【关注孤独症家庭】“星星”领路人“杨妈妈”,陪伴他们回归社会
- 天天观焦点:炒股会亏钱吗
- 全球今日报丨武汉:中学生步行登龟山祭扫向警予
- 最新资讯:浓眉38分17板湖人123:111胜森林狼,湖人一片坦途森林狼未来灰暗