我移至CH376芯片在51单片机的例程用到了我的stm32单片机上,程序是一直串口接收数据然后放到缓冲区并写入优盘,可是每隔一段时间,就会发现存储下来的数据中间丢失若干字节,怎么回事啊?
本身CH376写数据的时候中断状态返回是否正常?如果状态返回正常那么就要考虑你循环通过串口写数据是否会出现丢数据的现象。
我是用双buffer轮流接收串口数据,接收后放到一个大的buffer中去,对这个大的buffer进行U盘写入,我看到ch376评估板说明上说在数据刚刚写入U盘后还有一个延后写Flash的过程,,个别u盘延时3秒。我怀疑是不是在这个写入的时间占用CPU及总线时间过长,导致此时CPU及总线无时间接收串口发来的数据而导致的丢失呢?
s = CH376SecWrite( FileDataBuf, (UINT8)( total / DEF_SECTOR_SIZE ), NULL ); /* 将缓冲区中的字节数转换为扇区数(除以DEF_SECTOR_SIZE),最后的零头数据先不管,以扇区为单位向文件写入数据 */
如果你担心串口那边会丢失数据,你可以想个方法检测下,比如STM32串口的接受可以开DMA,以保证数据不丢失
本身其实有两个问题,一个是数据丢失,一个是运行一段时间会进入一个死循环。硬件仿真发现程序停在了 void mStopIfError(uint8_t iError) 这个里面,应该是执行void mFlushBufferToDisk( uint8_t force ) 里面的s = CH376SecWrite( FileDataBuf, (UINT8)( total / DEF_SECTOR_SIZE ), NULL ); /* 将缓冲区中的字节数转换为扇区数(除以DEF_SECTOR_SIZE),最后的零头数据先不管,以扇区为单位向文件写入数据 */ 时出现错误, 如果是H376写数据的时候中断状态返回不正常那考虑是什么问题呢?我主要代码是: char USART1_DMA_Buf1[buf_size+1]; USART1_DMA_Buf1[buf_size]='\0'; total += sprintf( FileDataBuf + total, "%.512s", USART1_DMA_Buf2 ); mFlushBufferToDisk( 0 ); /* 自动刷新缓冲区,检查缓冲区是否已满,满则写盘 */
已经开了DMA,设置了DMA512字节缓冲,存放到USART1_DMA_Buf1数组中去。
单步运行调试的时候发现mFlushBufferToDisk( 0 );这条语句运行正常,返回值也都正常,程序一直循环写入,几次单步运行都正常,问题就是发生在数据一直写入的时候,不知过多长时间,就会出现错误,转入到 mStopIfError(uint8_t iError)函数中去。
刚才看其他帖子,发现你好像有stm32操作ch376的程序,能不能发一份借鉴一下。我的邮箱是个人信息保护,已隐藏。多谢。
你什么接口与376通讯的?如果你接口没有问题,那么其它例程都是C语言写的移植很方便。 扇区写出错,可能硬件有问题,你可以把你的硬件发至我邮箱 还有你可以先确定是哪边出现问题,比如你这样做下,开个512以上的缓冲区FileDataBuf,调用用这个函数s = CH376SecWrite( FileDataBuf,1)1000次,看文件数据是不是500K,先排除你哪边出问题的
我是用spi通讯的,接口应该没问题,不过方便的话我还是想学习一下。 调用用这个函数s = CH376SecWrite( FileDataBuf,1,NULL)1000次,看文件数据是500K。试了四五次都是500k,这说名扇区写正常,问题应该出要写入的这个FileDataBuf不正常吗?
多次几次,写的次数多点,如果还是没有问题,说明扇区写没有问题,丢数据应该在你串口接收或者把接收的数据放到FileDataBuf中有问题
昨天开始测试到今天已经过了10个小时了,又没问题了,好奇怪啊。 谢谢了。