ch372b上傳512字節(jié),上位機(jī)讀錯(cuò)或讀不到問(wèn)題

本人的下位機(jī),在上傳數(shù)據(jù)時(shí)的程序段如下: //有一個(gè)定義好的數(shù)組里面全是測(cè)試數(shù)據(jù),從0到255的?,F(xiàn)在分八次上傳,共512字節(jié)。 unsigned eep_array_1,eep_array_2,u; // Test_array_total[512] CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ eep_array_1=0; u=0; for (eep_array_1=0;eep_array_1<8;eep_array_1++) { CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端點(diǎn)2的發(fā)送緩沖區(qū)寫(xiě)入數(shù)據(jù)塊 CH375_WR_DAT_PORT(64); for ( u = 0; u < 64; u ++ ) CH375_WR_DAT_PORT(Test_array_totaleep_array_1*64+u]); }

上位機(jī)程序段如下: 讀八次,每次讀64個(gè)字節(jié),讀后的數(shù)據(jù)放入數(shù)組 Eeprom_Array里面。 For i = 0 To 7 If (CH375ReadData(0, mRead_Eeprom_Buf, 64)) Then For k = 0 To 63 Eeprom_Array(i * 64 + k) = mRead_Eeprom_Buf.eeprom_mBuf(k) Next k End If Next i

流程錯(cuò)誤. 先傳64個(gè)字節(jié),等待中斷,64字節(jié)傳完后,等待產(chǎn)生中斷,進(jìn)入中斷函數(shù),獲取中斷狀態(tài),中斷狀態(tài)為USB_INT_EP2_IN.然后釋放緩沖區(qū),然后才可以繼續(xù)上傳下64個(gè)字節(jié),然后等待中斷.......,依次傳輸完畢512個(gè)字節(jié).


紅桃六:你好,謝謝你的指點(diǎn)。 本人現(xiàn)在只試驗(yàn)上傳64個(gè)字節(jié)包的程序,出現(xiàn)的一個(gè)問(wèn)題: 好像第一次在上位機(jī)上點(diǎn)上傳數(shù)據(jù),讀到的數(shù)據(jù)全是正確的。是從0到63的數(shù)值, 但是我再點(diǎn)讀取數(shù)據(jù),讀到的數(shù)據(jù)前三個(gè)總是錯(cuò)的,好像是個(gè)隨機(jī)數(shù)一樣,沒(méi)有規(guī)律,后面的61個(gè)數(shù)據(jù)是正常的。

本人的下位機(jī),在上傳數(shù)據(jù)時(shí)的程序段如下: //有一個(gè)定義好的數(shù)組里面全是測(cè)試數(shù)據(jù),從0到63的?,F(xiàn)在要上傳給上位機(jī)VB 程序中 // Test_array_total[512] CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端點(diǎn)2的發(fā)送緩沖區(qū)寫(xiě)入數(shù)據(jù)塊 CH375_WR_DAT_PORT(64); for ( u = 0; u < 64; u ++ ) CH375_WR_DAT_PORT([u]); \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 上位機(jī)程序段如下: 讀一次,每次讀64個(gè)字節(jié),讀后的數(shù)據(jù)放入數(shù)組 Eeprom_Array里面。 If (CH375ReadData(0, mRead_Eeprom_Buf, 64)) Then For k = 0 To 63 Eeprom_Array(k) = mRead_Eeprom_Buf.eeprom_mBuf(k) Next k End If


CH375ReadData(0, mRead_Eeprom_Buf, 64)要改成 Dim mLen As Long mLen = 64 CH375ReadData(0, mRead_Eeprom_Buf, mLen ) If mLength <> 0 Then ... End If 并且要判斷mLen 是否為0,如果為0的話就是沒(méi)讀到數(shù)據(jù).


zyw 你好: 我按你上面的方法試了,還是老問(wèn)題,第一次讀到的數(shù)全正確。 第二次,再讀數(shù)據(jù)。前三個(gè)就好像變成隨機(jī)數(shù)了。


下載CH372DBG.ZIP,可以進(jìn)行單次讀寫(xiě),調(diào)試你的下位機(jī)


不知道你第2包數(shù)據(jù)是怎么傳的.按照這個(gè)方式你先下傳64個(gè)字節(jié),然后取反后上傳,或者直接上傳上去: pBuf=mBuf; //數(shù)據(jù)未處理 CH375_WR_CMD_PORT(CMD_RD_USB_DATA); //發(fā)出讀數(shù)據(jù)命令 length=CH375_RD_DAT_PORT(); //首先讀出的是長(zhǎng)度 for(len=0;len!=length;len++,pBuf++)*pBuf=CH375_RD_DAT_PORT(); //將數(shù)據(jù)讀入到緩沖區(qū) pBuf=mBuf; // 演示回傳 CH375_WR_CMD_PORT(CMD_WR_USB_DATA7); //發(fā)出寫(xiě)上傳端點(diǎn)命令 CH375_WR_DAT_PORT(length); for(len=0;len!=length;len++,pBuf++)CH375_WR_DAT_PORT(*pBuf); //將數(shù)據(jù)寫(xiě)入上傳端點(diǎn)


CH375ReadData必須要按上面的方式寫(xiě),不然會(huì)造成內(nèi)存出錯(cuò)的! 你讀出來(lái)是隨即數(shù),那有沒(méi)有判斷mLen呢?如果mLen為零的話,那mRead_Eeprom_Buf里的數(shù)據(jù)就是無(wú)效的!


各位老師,我按照你們上面的方法去試了一下,但還是沒(méi)有達(dá)到我想要的目的,示例程序我也看了它上傳是是些無(wú)意義的數(shù)字,也看不出來(lái)是對(duì)是錯(cuò)。 能不能幫我寫(xiě)一下,上位機(jī)和下位的,上傳與下載段的程序。 目的就是,51單片機(jī)中有一個(gè)512字節(jié)的固定數(shù)組,里面有事先定義好的512個(gè)數(shù)據(jù),比如:從0到255再到0。 現(xiàn)在用上位機(jī)VB程序,把這512個(gè)字節(jié)全讀到上位機(jī)中,定義好的一個(gè)數(shù)組里。 萬(wàn)分感謝,現(xiàn)在用372就這個(gè)數(shù)據(jù)不能一次傳上來(lái)卡住了。


我們已經(jīng)提供了參考程序,你把的測(cè)試結(jié)果貼出來(lái)看看.上次讓演示回傳實(shí)驗(yàn)有沒(méi)有做?按照我們的建議來(lái)做實(shí)驗(yàn),能很快的判斷問(wèn)題所在


紅桃六:你好: 剛剛按你那個(gè)方法試了,傳的數(shù)據(jù)是正確的,我用的測(cè)試代碼如下: 這是傳64個(gè)字節(jié)沒(méi)問(wèn)題,那要傳512個(gè)字節(jié)怎樣在下面的基礎(chǔ)上再加代碼來(lái)實(shí)現(xiàn)呢。

///上位機(jī)VB代碼如下:////////////////// test_data.test_data(0) = 246 '定義了一個(gè)首數(shù)字,做為下位機(jī)的約定命令。其它的單元數(shù)值是從1到63 If (CH375WriteData(0, test_data, 64)) Then '發(fā)送成功 If (CH375ReadData(0, mRead_Eeprom_Buf, 64)) Then'如果讀成功,在列表中顯示剛讀到的數(shù)。 For n = 0 To 63 List2.AddItem (mRead_Eeprom_Buf.eeprom_mBuf(n))'顯示的是246,1,2一直到63。是正確值。 Next n End If End If

////下位機(jī)如下代碼://////////////////////////////////// switch ( InterruptStatus ) { /* 分析中斷狀態(tài)處理 */ case USB_INT_EP2_OUT: { /* 批量端點(diǎn)下傳成功 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊*/ length = CH375_RD_DAT_PORT( ); /* 首先讀取后續(xù)數(shù)據(jù)長(zhǎng)度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); /* 接收數(shù)據(jù)包 */ switch(buffer[0])//根據(jù)第一個(gè)字節(jié)的內(nèi)容,做相應(yīng)的處理。 {case 246: //上位機(jī)傳的第一個(gè)是246的話,就做如下動(dòng)作。 CH375_WR_CMD_PORT(CMD_WR_USB_DATA7); //發(fā)出寫(xiě)上傳端點(diǎn)命令 CH375_WR_DAT_PORT(length); for(len=0;len!=length;len++)CH375_WR_DAT_PORT(buffer[len]); //將剛才讀到的數(shù)據(jù)上傳給上位機(jī)。 break; } } }


懷疑你下位機(jī)代碼有點(diǎn)問(wèn)題,發(fā)E_mail:lht@wch.cn,把程序發(fā)過(guò)來(lái)看看.


CH375ReadData(0, mRead_Eeprom_Buf, 64)要改成

Dim mLen As Long mLen = 64 //每次調(diào)用前都要賦值 CH375ReadData(0, mRead_Eeprom_Buf, mLen )//第3個(gè)參數(shù)必須是個(gè)變量!否則可能會(huì)出現(xiàn)內(nèi)存訪問(wèn)錯(cuò)誤! If mLen <> 0 Then For n = 0 To mLen List2.AddItem (mRead_Eeprom_Buf.eeprom_mBuf(n))'顯示的是246,1,2一直到63。是正確值。 Next n End If 并且要判斷mLen 是否為0,如果為0的話就是沒(méi)讀到數(shù)據(jù). CH375WriteData第3個(gè)參數(shù)也必須是個(gè)變量! 必須的!


紅桃六 你好: 剛才我又整理了一下,下位機(jī)的程序,發(fā)現(xiàn)了一個(gè)問(wèn)題,我在第二次發(fā)數(shù)據(jù)包時(shí),沒(méi)有加上CH375_WR_CMD_PORT(CMD_WR_USB_DATA7);這個(gè)命令。是個(gè)低級(jí)錯(cuò)誤。 很感謝你們公司能及時(shí)的指點(diǎn)我們這些初級(jí)使用者,給我們指點(diǎn)謎經(jīng),有針對(duì)性的去查找問(wèn)題。 如有問(wèn)題再來(lái)打擾。

感謝ZYW指點(diǎn),我會(huì)按你的方法,將上位機(jī)的那個(gè)隱患去掉的。


不知什么原因,現(xiàn)在讀的數(shù)據(jù)又不對(duì)了。我已發(fā)郵件給你了。謝謝幫忙看一下。


下位機(jī)代碼有問(wèn)題.缺少了一個(gè)break;修改后上傳文件:


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

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