[求助]CH376 + 44b0 + uclinux 扇区读取失败

你好啊。 我在使用贵公司的CH376,用的cpu和系统是44b0,uclinux。用的是异步串口,波特率为115200; 现在我遇到的问题是: 1. 我用扇区去读取文件,当我一次读一个扇区的时候,可以成功。但是当我一次读取2个或者以上扇区时,它就会失败,失败返回的错误码是:0x17 。我用试过换其他U盘了,结果还是一样。 我看代码,说这个返回码是缓冲区溢出或者U盘操作错误,请问这是什么意思?缓冲区是指ch376的还是指cpu的? 我可以向什么方向去入手进行修改?

2. 关于读取速度的问题 一开始的时候,我是用字节读取的方式读取的,但是速度很慢,只有0.5K/s. 我的读取数据打函数是这样的: char xReadCH376Data( void) { char data; s32 len; s32 i; for(i=0;i<10;i++) { len = dev_com_read(0, &data, 1); if(len == 1) return data; szsleep(1); } return 0; } 当那个延时szsleep(1)(延时1ms,延时其他的值,速度基本一样)不存在时,每次读串口都会失败,读不到想要的数据,包括中断状态码;而现在增加了,这个是否就是影响到读写的操作速度呢的原因? 我可以怎么去修改?因为这个速度确实太慢啦!

扇区的读取速度: 现在我能成功操作扇区的情况是每次只能读取1个扇区,这是的速度是1K/s。 但是很明显,这个速度也太慢了,我如何去提高我的读取速度呢?

希望能给一些解决的建议,我已经在这些问题纠结了好久,项目有些急,谢谢啊!

szsleep(1);这个函数正确需要的延时为1US,在写命令的时候,延时为2US。如果时间很长当然会很浪费时间。


本身串口读写就很慢,只适合对速度不要求的场合。 dev_com_read(0, &data, 1); 这个函数执行完毕是否表示这个字节已经发送完毕了? for(i=0;i<10;i++)这个循环的作用是什么?


你好。回复2楼的: 1.dev_com_read(0, &data, 1); 这个函数表示用串口0接收一个字节(这个数值为需要的字节数)的数据,接收到的数据存放在data中,这个函数的返回值为0或者接收到的字节数。

2.for(i=0;i<10;i++)这个循环的作用是什么? 这个语句是用来做读取超时用的。

回复1楼的: “szsleep(1);这个函数正确需要的延时为1US,在写命令的时候,延时为2US。如果时间很长当然会很浪费时间。”

现在我在读取的函数中的延时是1ms,这样才能成功;而在写命令中不加任何延时也能成功。 后来调试中,我把上面的读取数据的函数中的延时去掉了,速度有所提高,但只是原来的2倍,用扇区读的话,可以有2K/s速度,但这个远没到较理想的值吧,我问过贵司的技术人员,他提供给我的参考值是:异步串口读取、115200波特率,速度可以有7-8k/s; 如何提高速度呢?现在我底层的函数中已经没有延时的了。

3. 对于我上面的提问1:关于一次读多于1个扇区就出现失败的问题,后来我换用其他U盘进行尝试,发现可以了,而且能一次读十多二十个扇区。但我尝试的三个U盘中,只有一个U盘成功(这些U盘的质量都是有保证的),感觉这个读取的兼容性有些不行啊。 然后我一次读16个扇区和一次读1个扇区,速度是一样的,这个是不是有问题的?

4. 当我用扇区读取时,发现对于稍大的文件,如60K、300K(其实这些都只是小文件),会出现丢数据的问题,而对于20K、10K这些则没有问题;而用字节读取时,则都没有问题;想问问,这个丢数据又是什么问题啊?


for(i=0;i<10;i++) { len = dev_com_read(0, &data, 1); if(len == 1) return data; szsleep(1); }

这个地方修改为: while(1) { len = dev_com_read(0, &data, 1); if(len == 1) return data; } 来实验怎么样? 你反馈的问题可能比较模糊,比如不加sleep会失败,这个失败是超时退出吗?换个角度考虑,如果你不加这个1MS延时就会失败,那有可能是有些串口输出数据的时间较长,有些较短,这样修改都按照较长的时间来做,速度自然就会慢了。所以建议你用死循环的方式来做,这样如果速度可以的话,那基本上说明是我分析的原因。关于超时你可以用其他方式来做,比如定时器等。你这种做法我个人认为欠妥。


示波器上已经看到CH376返回的数据了,但是你的单片机却没有接受到,加延时才可以,这个问题 必须要解决,这个延时对读写速度影响很大。


你好; 4、5楼提出的修改建议都是针对读取速度方面的,我还有的问题是3楼时提到的另外两个问题: 1. 对于我上面的提问1:关于一次读多于1个扇区就出现失败的问题,后来我换用其他U盘进行尝试,发现可以了,而且能一次读十多二十个扇区。但我尝试的三个U盘中,只有一个U盘成功(这些U盘的质量都是有保证的),感觉这个读取的兼容性有些不行啊。 这个问题的原因可能是什么呢?

2.当我用扇区读取时,发现对于稍大的文件,如60K、300K(其实这些都只是小文件),会出现丢数据的问题,而对于20K、10K这些则没有问题;而用字节读取时,则都没有问题;想问问,这个丢数据又是什么问题啊?

请予以解答,谢谢啊!


你先把5楼说的问题解决了,其他的问题可能也就没了。看来你的底层读写自函数就有问题


你好; 4、5楼提出的修改建议都是针对读取速度方面的,我按照4楼的提议修改了读数据函数,进行了测试,用扇区和用字节分别去测试了,发现速度和原来的一样,没有改进: 字节方式:还是1K/s; 扇区读取方式:还是2K/s; 从这些数据看,速度是没有任何提高的,在去除了我上面用到延时后啊。请问,还能在哪些地方改进吗?

我还有的问题是3楼时提到的另外两个问题:

1. 对于我上面的提问1:关于一次读多于1个扇区就出现失败的问题,后来我换用其他U盘进行尝试,发现可以了,而且能一次读十多二十个扇区。但我尝试的三个U盘中,只有一个U盘成功(这些U盘的质量都是有保证的),感觉这个读取的兼容性有些不行啊。

这个问题的原因可能是什么呢?

2.当我用扇区读取时,发现对于稍大的文件,如60K、300K(其实这些都只是小文件),会出现丢数据的问题,而对于20K、10K这些则没有问题;而用字节读取时,则都没有问题;

想问问,这个丢数据又是什么问题啊?

请予以解答,谢谢啊!


你好; 对于7楼的建议,我现在的情况是,底层的延时都没有了。但仍出现我在8楼中提到的3个问题。 请予以解答,谢谢!


应该不是兼容性的问题。兼容性应该不会多读一个扇区就不行的。 可能还是程序上有问题。可能是读U盘流程上有问题,因为你使用的是嵌入式系统,系统相关的部分你考虑一下。 数据丢失这个问题CH376不会存在,肯定是你的系统接收数据丢失了。

速度还和你测试的方法有关系。你现在测试是就单个任务吗?就一直在读U盘?是否还有其他任务?


只有登录才能回复,可以选择微信账号登录