最近在做一个设备,使用stm32f103和mmc卡做的一个8G的U盘(其实是32G,因为usb是通信慢,为了格式化快点只用了8G),同时还添加了fatfs文件系统可以实时记录串口输入的数据。 U盘和fatfs文件系统不会同时工作,源代码没有在这台电脑上,基本流程是这样的,我将fatfs的写文件函数放在了 while(USB枚举成功否?) { if(串口1缓存有数据) { file1buf[cnt1++]; 打开文件1,标记,不再重新打开 如果数据量大,则满512 写文件1 如果数据量小,或者文件结尾,计时器满1秒,写一次文件1 刷新文件1 } if(串口2缓存有数据) { file2buf[cnt2++]; 打开文件2,标记,不再重新打开 如果数据量大,则满512 写文件1 如果数据量小,或者文件结尾,计时器满1秒,写一次文件1 刷新文件2 } } if 文件1打开 关闭文件1 if文件2打开 关闭文件2 这样写发现同时打开三个文件程序直接跑飞,打开两个文件进行写会出现一些错误,程序很容易跑飞,初步判断是资源不够,缓存用的太多了,虽然程序编译没错,但是运行时就会出错,如果采用一个文件的方法,轮询的打开,记录,关闭,则会因为浪费时间而丢失数据。只打开一个文件记录一个串口的数据则不会丢数据,也不会出现异常。我直接使用的f_write函数而没有用f_puts函数,对f_puts函数的字符串如何组帧不太清楚,不知道有没有\0什么的,看程序感觉应该是用f_puts比较好一点,好像程序内部会有一个缓冲。 if(串口1缓存有数据) {file1buf[cnt1++]; 打开文件1 写文件1 关闭文件1 } if(串口2缓存有数据) {file2buf[cnt2++]; 打开文件2 写文件2 关闭2 } 各位大侠,可曾有usb和fatfs同时使用过,一起交流一下,目前一路数据的记录已经没有问题,记录完可以在电脑上看见记录的数据,但是同时记录两路数据还存在困难,还望各位大神指点一二。 还有大神们可有改写好usb双缓冲的,我调试来着,结果有错误老是搞得我的电脑死机必须重启,所以先放下了,留着以后再弄。我看见有人将usb最大数据包长度改成了65536,而一般都是设置成64,我想问一下,如果我改成512是不是就可以直接按块读写mmc卡,而不需要去转换了? 问题比较多,也比较杂,还请见谅! |
回复:stm32f103+usb+fatfs联调问题
RE:stm32f103+usb+fatfs联调问题
RE:stm32f103+usb+fatfs联调问题
RE:stm32f103+usb+fatfs联调问题
提一个建议方案:
1、开10块接收缓存,用链表连接起来,在串口接收到数据的时候,将数据存储到缓存里。(缓存的数目按照需求定义)。
2、定义一个20ms的定时器,定时的将缓存链表的数据写入文件系统中。具体定时器的周期按照 一块缓存写入sd卡的时间来设定,最好每次最多能写几块缓存。
3、串口的优先级比定时器优先级要高,保证接受不丢数据。写入有缓存来保障。
RE:stm32f103+usb+fatfs联调问题
RE:stm32f103+usb+fatfs联调问题
1,文件锁有被开起没;
2,长文件名被选中没;
3,中文字库集被支持没;
4,最大文件支持是多少。
回复:stm32f103+usb+fatfs联调问题
兄弟,你这么做是不是效率有点低,还有点不稳定,很容易丢数据。
提一个建议方案:
1、开10块接收缓存,用链表连接起来,在串口接收到数据的时候,将数据存储到缓存里。(缓存的数目按照需求定义)。
2、定义一个20ms的定时器,定时的将缓存链表的数据写入文件系统中。具体定时器的周期按照 一块缓存写入sd卡的时间来设定,最好每次最多能写几块缓存。
3、串口的优先级比定时器优先级要高,保证接受不丢数据。写入有缓存来保障。
-------------------------------------------------------------------------------------------------------------------------------------------------------
效率是有点低,我同时打开两个文件,同时记录数据,每10秒刷新保存一次数据,当数据量大的时候就会出现丢数。只保存一个文件的时候不会丢数,我测试的是230400bps在全速率的时候的情况。
我原来也想过用定时器的方法保存数据,后来感觉使用while循环里面轮询,只要数据在2秒内满一个buf就直接写入文件(大数据量),如果两秒内不满,则查看当前使用的是哪个buf,有多少数据,然后就写数据,保存数据。我想这样可以在大数据量的时候尽量多的使用多块读写模式,我采用乒乓结构的buf是1KB的,即每路串口2k的缓存。(如果缓存开的太大了会导致USB枚举出错,设备会跑飞),我感觉应该是fatfs文件系统在同时操作两个文件的时候会耗费很多时间和资源,所以导致数据丢失。如果我试着加大缓存,丢数的情况会减轻,但会带来不稳定的隐患。
串口优先级我再好好看看,我设置PVD中断时发现,如果PVD中断设置成最高的,最先抢占最先响应模式,及时没有发生掉电也会影响到USB的通信。不知道串口的中断会不会带来什么其他的后果
回复:stm32f103+usb+fatfs联调问题
本来就算是usb1.0,是支持usb2.0的低速和全速,后面207支持高速也要外接上高速的phy
说的对,stm32f103不支持usb2.0的高速,只能支持全速,但是全速的大容量存储器也太慢了,读只有230KB/s,写最大只有80KB/s。这样使用的时候U盘会反应很慢的,电脑读取U盘的目录的时候要等上很久,打开一个大文件也要等好久。听说使用USB双缓冲可以提高速度,但是我还没有搞明白是怎么弄
回复:stm32f103+usb+fatfs联调问题
我在做项目也有同时使用SD,USB存储但是没有出现楼主所说的问题。
1,文件锁有被开起没;
2,长文件名被选中没;
3,中文字库集被支持没;
4,最大文件支持是多少。
文件操作正常,能读能写。USB也能正常通信,电脑能识别U盘,就是读写速度很慢,我用的是8G的U盘,不知道你用的是多大的,我直接使用fatfs记录数据,两路同时记录的时候就会出现丢数的现象。我感觉应该使用407才能够满足速度的要求吧,现在不知道怎么回事,探索中