[求助]读U盘大小不确定

我用disk_size命令返回的U盘大小总是不确定;

代码如下: SendCom(DISK_SIZE); if(WaitInterrupt()==USB_INT_SUCCESS)///查询中断 { SendCom(READ_USB_DATA); ReadDat(pbuf_receive_data,8);///pbuf_receive_data有512字节大小,绝对够用 //////sector_num定义为unsigned long sector_num=(*(unsigned long*)&(pbuf_receive_data[4]))/512; sector_num=sector_num*((*(unsigned long*)pbuf_receive_data[0])/2046);

/接下来输出U盘size=****Mb } 我的U盘爱国者128智慧棒,每次显示的大小总不确定,有时候后3位事对的。 前面的disk_init、disk_ready命令都对了。大家帮忙分析一下。。

(1)SendCom(READ_USB_DATA);后面紧接着读取的数据是后续数据长度,通常是8,然后再读取8个数据 (2)手动计算一下,看看结果是否与容量是否一致


大侠,确实是要先读个数。我改过来了, 还有sector_num=sector_num*((*(unsigned&nbsplong*)pbuf_receive_data[0])/2046); 这一句最后应该除以2048;

不过读出来的数据是这样的: 00 03 E7 00(前四个数据,十六进制的) 00 02 00 00(后四个数据,十六进制的) 我用winhex查看物理盘,得到:125Mb,256000扇区,每扇区512字节;

很明显, 读出来的后四个字节要这么读:00 03 E7 00(十进制为 255744,不变位置) 读出来的后四个字节要这么读:00 00 02 00(十进制为 512,要颠倒位置)

数据手册说的是两个都是高字节再前啊!错了吗??


没有错,就是高字节在前,你把函数原型发出来看看, SendCom(READ_USB_DATA); ReadDat(pbuf_receive_data,8);


我的函数: SendCom(DISK_SIZE); if(WaitInterrupt()==USB_INT_SUCCESS) { SendCom(READ_USB_DATA); ReadDat(&temp,1); ReadDat(pbuf_receive_data,temp); for(i=0;i<8;i++) { a=pbuf_receive_data[i]/100;////取百位 b=pbuf_receive_data[i]/10%10;////取十位 c=pbuf_receive_data[i]%10;////取个位 write_8x16char(3,0,i);////在12864液晶屏的第3行,第0位置写i write_8x16char(3,2,a);///在12864液晶屏的第3行,第2位置写百位 write_8x16char(3,3,b);///在12864液晶屏的第3行,第3位置写十位 write_8x16char(3,4,c);///在12864液晶屏的第3行,第4位置写个位 delay(65530);delay(65530);delay(65530);;////延时查看 delay(65530);delay(65530);delay(65530); } 其中:temp,a,b,c,i都是unsigned char型变量, unsigned char xdata pbuf_receive_data[512]; write_8x16char(3,0,i);是我自己的函数,试验表明没有问题;

读出来的是 0 000 ///十六进制00 1 003 ///十六进制03 2 231 ///十六进制E7 3 000 ///十六进制00 4 000 ///十六进制00 5 002 ///十六进制02 6 000 ///十六进制00 7 000 ///十六进制00

哎!怎么回事啊?红桃六大哥费心看看;谢谢;


ding


ReadDat( )这个函数可以不可以看下怎么写的


////////////////////375读数据函数/////////////////////////////////// void ReadDat(byte *pbuf,byte num) { byte i; for(i=0;i { A0=0;W=1;R=0; *pbuf=CH375_D0_D7; if(i pbuf++; W=1;R=1; } } 用的是模拟串口,其他的都正确,就这出错。不应该啊,我知道扇区是512,所以现在直接用的512,没用后四位,但是不知道原因,很不爽。


首先读取的数据长度是否正确?你可以做一个测试,用同样的方法往你的BUFFER中写数据,然后用你的显示器看看 你读出的数据是否和你写入的数据一致.


读出的长度是8,正确,现在我怀疑是后四个在02之前丢了一个数据,最后一个是重复的。 比如我读扇区(我的扇区大小直接用的512,没有用读出来的值),一个扇区8次读,9次中断。在读32扇区(boot扇区)时,每64字节都丢1或者2个字节,奇怪的是:比如说应该是1 2 3 4 5,他把2丢了,但读出来是1 3 4 5 5,也就是说最后重复读5了。并且重复多次发现丢的总是相同的字节。我用的11.0592Mhz的晶振。实在不明白怎么回事,用模拟并口的原因吗?。


你到底是模拟串口还是模拟并口?怎么看你程序是模拟并口啊,你读取的程序你这样写看可以不可以: void ReadDat(byte *pbuf,byte num) { byte i; W=1; for(i=0;i { A0=0; R=0; *pbuf=CH375_D0_D7; R=1; pbuf++; } } 你看下你的并口上面似乎有干扰,你把RD线上面加个10K的上拉电阻去测试下看可以不可以.


不好意思我用的是模拟并口。现在原因差不多明了了。谢谢各位的热心帮助。 我发现丢的数据都是:FF F7 DF 7F 77 FB FE等数据。 我用的模拟并口,D0-D7和其他的控制线是用双排针引出来的,也就是说 D0-D7 的数据几乎大部分是1的时候影响了控制线 R(离的太进了,原因应该是这样)。下一步就是怎么抗干扰了。等结果出来了再告诉大家。 再次感谢大家的热心帮助。


感谢CCTV,感谢党,感谢人民,感谢广大父老乡亲。 当然最主要的是感谢沁恒的服务人员,感谢红桃六,感谢hcn,感谢SCM,感谢_study_。

我的数据读正确了,不丢字节了。读的山区大小也对了(扇区:00 00 02 00,02前面丢了一个00) 扇区老是丢FF F7 DF 7F 77 FB FE等数据也不丢了。

把经验说给大家,别再犯这样的错误。 我用的是模拟并口,发现读数据老是丢字节,后来发现丢的是FF F7 DF 7F 77 FB FE等,这些数据的特点就是大部分是1(八位2进制),我觉得是读写控制线受到了干扰(我的引脚是双排针,离的特别进),现在换成并口了,非模拟的。呵呵,行了。

现在觉得是收干扰了,我也没示波器,只有一个万用表,哎!大家注意吧!!


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