完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
巡检机器人执行任务中出现bug,往复执行历史命令,排查了好几天,最后检查上位机串口没有发送数据,单片机debug也确认串口没有接收到新数据。最后的最后才debug32的串口数据缓存循环队列,发现代码中Lenght变量出现了问题。
typedef struct { uint16_t Head;//头指针 uint16_t Tail;//尾指针 uint16_t Lenght;//长度 uint8_t Ring_Buff[200];//缓冲大小 }RingBuff_t; extern RingBuff_t ringBuff; void RingBuff_Init();缓冲区初始化 uint8_t Write_RingBuff(uint8_t data);//入队 uint8_t Read_RingBuff(uint8_t *rData);//出队 void RingBuff_Init(void) { ringBuff.Head=0; ringBuff.Tail=0; ringBuff.Lenght=0; } uint8_t Write_RingBuff(uint8_t data) { if(ringBuff.Lenght>=200) { return 1; } ringBuff.Ring_Buff[ringBuff.Tail]=data; ringBuff.Tail=(ringBuff.Tail+1)%200; ringBuff.Lenght++; return 0; } uint8_t Read_RingBuff(uint8_t *rData) { //if(ringBuff.Head==ringBuff.Tail && ringBuff.Lenght==0)//我自己的问题代码在这!!!! if(ringBuff.Lenght==0) { return 1; } *rData=ringBuff.Ring_Buff[ringBuff.Head]; ringBuff.Head=(ringBuff.Head+1)%200; ringBuff.Lenght--; return 0; } 原因分析: 我们采用的队列空判断条件用了两个,之前可能是为了保险,但最后出现了问题!首先刚进该if语句,判断第一个条件,假设队列不为空,则 ringBuff.Head==ringBuff.Tail 为false,刚好此时定时器中断来了,解析了数据,Lenght此时已经变为0,所以代码进入了下面这部分,Lenght-- 后变为很大的一个值,此时便出现了问题。 uint8_t Read_RingBuff(uint8_t *rData) { //问题代码!!!下面这个判断语句 if(ringBuff.Head==ringBuff.Tail && ringBuff.Lenght==0) { return 1; } *rData=ringBuff.Ring_Buff[ringBuff.Head]; ringBuff.Head=(ringBuff.Head+1)%200; ringBuff.Lenght--; return 0; } |
|
|
|
只有小组成员才能发言,加入小组>>
3311 浏览 9 评论
2994 浏览 16 评论
3493 浏览 1 评论
9058 浏览 16 评论
4087 浏览 18 评论
1176浏览 3评论
604浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
598浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2334浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1895浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 21:58 , Processed in 1.229420 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号