完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32串口接收、TF卡存储丢数现象解析与总结
问题: 待接受的串口数据是9600波特率,一行一行的发送,最长一行不超过1024字节。 在利用stm32的串口进行数据接收,设置两个1024大小的buf,轮流接收,轮流写入TF卡, 为什么中间总会出现完整的一行无发记录下来的问题呢。
解析: 我确定是中间的数据丢失,我估计很大原因就是接收和写保护偏差问题。 刚才用串口调试攻击分别以10ms 100ms 1000ms 的速率发送一整行数据(保证有0x0D 0x0A)(一行是20字节), 结果统计的发送字节跟实际保存到文件的字节数如下: 发送间隔时间 实际保存字节数 串口工具发送字节数 1000ms 7620Bytes 7800Bytes 100ms 28240 28680 10ms 26860 32920 发现10ms的时候,里面的文件记录直接就乱了,本来应该是整齐的很多行业数据,因为中间丢包导致数据比较乱, 而且看实际保存字节数跟 串口发送字节数 差别也很明显。 串口是9600波特率的, 存储时用SDIO 往TF卡里存储的。 程序上采用双buf。 不知道问题出在什么地方, 还是本身TF卡存储就到不了接收9600波特率 10m间隔发送的这么一种速率呢。 同行的建议: 在做乒乓操作时,要保护buffer不能被读,和写同时操作。如果如下描述是正确的话,应该不是读写数据速度不匹配造成的。 发送间隔时间 实际保存字节数 串口工具发送字节数 1000ms 7620Bytes 7800Bytes 我建议你程序做些调试信息:1.弄一个包的接收计数器,看包是不是都收到了,如果收包就有丢失,那肯定是会少了?2.如果包都收到了,就看你写过程是不是有判断,丢弃了一些包。假如你做了数据校验,或者写TF卡失败等。 总结: 中间总会出现完整的一行无发记录下来 请确认是否是中间一行,还是第一行或者最后一行。 1. 协议是否是存硬件实现。如果是,则可能是时序出问题。 2. 如果是第一行或者最后一行,则可能是起始条件出问题或者结束条件出问题。 3. 如果中间一行出问题。可能是接收和写保存时序偏差积累造成丢包。 最好将代码仔细看看。 建议用示波器观察波形,计算时间传送速率。 |
|
相关推荐 |
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
1276 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1209 浏览 3 评论
2288 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1372 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1799 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-29 06:37 , Processed in 0.383903 second(s), Total 34, Slave 27 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号