
最近在搞一个手持操作器的程序,原来是想在stm32f103vb上跑一个ucosII2.92的,但是后来不论怎么搞,在写入SD卡数据时总是出问题,卡死了,原因找了很久,没有搞定。 后来又把ucos去除了,回到裸奔时代! 嘿!还别说,这裸奔就是爽,速度那是刚刚的,不过这里出故事了。 有操作系统的跑得慢,没有的系统的跑得快,中间加的延时间就出问题了! 后来就用定时器定时,用了一个数据准备标志来判断数据是否接收完,或是超时。 其中,在接收中断中,判断数据长度是否超过指定长度,超过了数据准备标志置位。 在定时器中加也加入超时判定,数据发出后,开始计时,时间到时数据准备标志置位。 主程序中,检测到数据准备标志置位后,对数据区进行解析,然后将解析好的数据存到SD卡中。 但是,这下好玩了,DEBUG!过了,没有问题!!! 让程序自动跑吧,嘿嘿,SD写入的数据怎的据和上面的几条一样呢? 后来才发现,当时从ucos中移植回来时,去除了当时解析长度,对整个数据缓冲区进行解析(主要是一次接收的数据特别多) 由于在数据发出到接收完成的时间不是固定的,因为对方的速度有时会慢一点(各种原因啦,主要是得从flash中读取数据再返回过来),在定时器时间内这个慢的数据并不能完全到达,而这个时候,禁止了数据的接收,导致数据区不能完全更新,正进行解析,嘿嘿,就出故事了! 综上所述,之所以出现前后部分数据相同的情况,都是因为缓冲区数据没有完全被更新闹的,如果今后有人遇到这个情况,也不凡清除一下数据接收缓存,或许就好了。总的来说还是自己在设计时没有考虑周全,只清了数据写入的缓存,数据源的缓存没有清。 感谢各位看官,看完俺这出笑话,是否噗嗤一乐? 1ST币,50%,看看谁手气好 |
哇,您这运气太好了,可以买彩票!