[求助]讀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字節(jié)大小,絕對夠用 //////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命令都對了。大家?guī)兔Ψ治鲆幌??!?/p>

(1)SendCom(READ_USB_DATA);后面緊接著讀取的數(shù)據(jù)是后續(xù)數(shù)據(jù)長度,通常是8,然后再讀取8個數(shù)據(jù) (2)手動計算一下,看看結(jié)果是否與容量是否一致


大俠,確實(shí)是要先讀個數(shù)。我改過來了, 還有sector_num=sector_num*((*(unsigned&nbsplong*)pbuf_receive_data[0])/2046); 這一句最后應(yīng)該除以2048;

不過讀出來的數(shù)據(jù)是這樣的: 00 03 E7 00(前四個數(shù)據(jù),十六進(jìn)制的) 00 02 00 00(后四個數(shù)據(jù),十六進(jìn)制的) 我用winhex查看物理盤,得到:125Mb,256000扇區(qū),每扇區(qū)512字節(jié);

很明顯, 讀出來的后四個字節(jié)要這么讀:00 03 E7 00(十進(jìn)制為 255744,不變位置) 讀出來的后四個字節(jié)要這么讀:00 00 02 00(十進(jìn)制為 512,要顛倒位置)

數(shù)據(jù)手冊說的是兩個都是高字節(jié)再前啊!錯了嗎??


沒有錯,就是高字節(jié)在前,你把函數(shù)原型發(fā)出來看看, SendCom(READ_USB_DATA); ReadDat(pbuf_receive_data,8);


我的函數(shù): 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);是我自己的函數(shù),試驗表明沒有問題;

讀出來的是 0 000 ///十六進(jìn)制00 1 003 ///十六進(jìn)制03 2 231 ///十六進(jìn)制E7 3 000 ///十六進(jìn)制00 4 000 ///十六進(jìn)制00 5 002 ///十六進(jìn)制02 6 000 ///十六進(jìn)制00 7 000 ///十六進(jìn)制00

哎!怎么回事啊?紅桃六大哥費(fèi)心看看;謝謝;


ding


ReadDat( )這個函數(shù)可以不可以看下怎么寫的


////////////////////375讀數(shù)據(jù)函數(shù)/////////////////////////////////// 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; } } 用的是模擬串口,其他的都正確,就這出錯。不應(yīng)該啊,我知道扇區(qū)是512,所以現(xiàn)在直接用的512,沒用后四位,但是不知道原因,很不爽。


首先讀取的數(shù)據(jù)長度是否正確?你可以做一個測試,用同樣的方法往你的BUFFER中寫數(shù)據(jù),然后用你的顯示器看看 你讀出的數(shù)據(jù)是否和你寫入的數(shù)據(jù)一致.


讀出的長度是8,正確,現(xiàn)在我懷疑是后四個在02之前丟了一個數(shù)據(jù),最后一個是重復(fù)的。 比如我讀扇區(qū)(我的扇區(qū)大小直接用的512,沒有用讀出來的值),一個扇區(qū)8次讀,9次中斷。在讀32扇區(qū)(boot扇區(qū))時,每64字節(jié)都丟1或者2個字節(jié),奇怪的是:比如說應(yīng)該是1 2 3 4 5,他把2丟了,但讀出來是1 3 4 5 5,也就是說最后重復(fù)讀5了。并且重復(fù)多次發(fā)現(xiàn)丟的總是相同的字節(jié)。我用的11.0592Mhz的晶振。實(shí)在不明白怎么回事,用模擬并口的原因嗎?。


你到底是模擬串口還是模擬并口?怎么看你程序是模擬并口啊,你讀取的程序你這樣寫看可以不可以: 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的上拉電阻去測試下看可以不可以.


不好意思我用的是模擬并口?,F(xiàn)在原因差不多明了了。謝謝各位的熱心幫助。 我發(fā)現(xiàn)丟的數(shù)據(jù)都是:FF F7 DF 7F 77 FB FE等數(shù)據(jù)。 我用的模擬并口,D0-D7和其他的控制線是用雙排針引出來的,也就是說 D0-D7 的數(shù)據(jù)幾乎大部分是1的時候影響了控制線 R(離的太進(jìn)了,原因應(yīng)該是這樣)。下一步就是怎么抗干擾了。等結(jié)果出來了再告訴大家。 再次感謝大家的熱心幫助。


感謝CCTV,感謝黨,感謝人民,感謝廣大父老鄉(xiāng)親。 當(dāng)然最主要的是感謝沁恒的服務(wù)人員,感謝紅桃六,感謝hcn,感謝SCM,感謝_study_。

我的數(shù)據(jù)讀正確了,不丟字節(jié)了。讀的山區(qū)大小也對了(扇區(qū):00 00 02 00,02前面丟了一個00) 扇區(qū)老是丟FF F7 DF 7F 77 FB FE等數(shù)據(jù)也不丟了。

把經(jīng)驗說給大家,別再犯這樣的錯誤。 我用的是模擬并口,發(fā)現(xiàn)讀數(shù)據(jù)老是丟字節(jié),后來發(fā)現(xiàn)丟的是FF F7 DF 7F 77 FB FE等,這些數(shù)據(jù)的特點(diǎn)就是大部分是1(八位2進(jìn)制),我覺得是讀寫控制線受到了干擾(我的引腳是雙排針,離的特別進(jìn)),現(xiàn)在換成并口了,非模擬的。呵呵,行了。

現(xiàn)在覺得是收干擾了,我也沒示波器,只有一個萬用表,哎!大家注意吧!!


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频