用ch372的內(nèi)置模式,批量端點2的傳輸?,F(xiàn)在一次傳輸單片機(jī)上傳小于64個字節(jié)成功了。 但是對于一次傳輸大于64字節(jié)不知怎么辦了。下載的例程好像沒有大于64字節(jié)的。看文檔也是概念的東西。那位大俠能夠給個例程,要考慮數(shù)據(jù)傳輸?shù)姆€(wěn)定性,程序不要死了?;蛘哒f說怎么寫也可,多謝?。?/p>
版主,高人幫幫我阿。工期很緊了??!老板快成催命鬼了。
我們的芯片提供了最大64個字節(jié)的緩沖區(qū),也就是一次最多只能上傳64個字節(jié)。如果數(shù)據(jù)大于64字節(jié)的話,你可以循環(huán)分多次進(jìn)行上傳。在上一次上傳,產(chǎn)生端點2上傳成功中斷之后,先解鎖緩沖區(qū),再上傳下一次要上傳的數(shù)據(jù)(也就是將數(shù)據(jù)寫入緩沖區(qū),等待PC機(jī)來?。?。
"在上一次上傳,產(chǎn)生端點2上傳成功中斷之后,先解鎖緩沖區(qū),再上傳下一次要上傳的數(shù)據(jù)(也就是將數(shù)據(jù)寫入緩沖區(qū),等待PC機(jī)來?。?---現(xiàn)在的問題是我的應(yīng)用是 A、給單片機(jī)發(fā)送命令 B、單片機(jī)給應(yīng)用返回數(shù)據(jù)。而調(diào)用 CH375ReadData去讀數(shù)據(jù)的時候(CH375SetTimeoutEx設(shè)定了1500ms的超時),當(dāng)數(shù)據(jù)小于等于64字節(jié)的時候,CH375ReadData會在1500ms內(nèi)等待單片機(jī)返回數(shù)據(jù)。當(dāng)數(shù)據(jù)大于64字節(jié)的時候,CH375ReadData往往只讀取了前面的64字節(jié)就返回了,后面的數(shù)據(jù)丟了。不知道怎樣讓CH375ReadData在1500ms等單片機(jī)發(fā)發(fā)完??
1.ch375settimeout設(shè)置了1500的超時; 2.ch375readdata()讀取了大于64字節(jié)的數(shù)據(jù)。 3.單片機(jī)上傳了小于64的數(shù)據(jù),PC機(jī)ch375readdata會提前返回,后面的數(shù)據(jù)需要再次調(diào)用函數(shù)去讀。 4.如果單片機(jī)上傳了沒超過讀長度但之前都是收到的整數(shù)包數(shù)據(jù),PC機(jī)會在超時內(nèi)等待,一旦超時時間到,讀函數(shù)會退出,放棄后面數(shù)據(jù)的讀操作。 5.如果PC沒讀到數(shù)據(jù),PC機(jī)會在超時內(nèi)等待,一旦超時時間到,讀函數(shù)會退出,放棄后面數(shù)據(jù)的讀操作。 6.在讀函數(shù)返回后,一要判斷函數(shù)返回的結(jié)果,如果是false說明操作失??;如果是true,但長度小于你所要求的 長度,那可能是上面3,4,5造成的提前返回。 綜上所述,在上傳數(shù)據(jù)時,在數(shù)據(jù)沒傳完應(yīng)避免上傳小于64字節(jié)的數(shù)據(jù),或者是上傳的數(shù)據(jù)沒有PC所要求的那么多,可以上傳一個小于64字節(jié)的或者是0長度的包來提前結(jié)束當(dāng)前的讀操作。
謝謝4樓教誨。我想我是看懂了你說的意思。但是現(xiàn)在收到了前64個數(shù)據(jù)(發(fā)送一百個數(shù)據(jù)),然后感覺是超時退出的。調(diào)了半天還是不通,把程序貼出來,請指正。 單片機(jī)程序: * CH375中斷服務(wù)程序 */ void mCh375Interrupt( ) interrupt 6 { unsigned char InterruptStatus; unsigned char length; CH375_CMD_PORT = CMD_GET_STATUS; /* 獲取中斷狀態(tài)并取消中斷請求 */ Delay2us( ); /* 如果時鐘頻率低于16MHz則無需該指令延時 */ InterruptStatus = CH375_DAT_PORT; /* 獲取中斷狀態(tài) */ if ( InterruptStatus == USB_INT_EP2_OUT ) { /* 批量端點下傳成功 */ CH375_CMD_PORT = CMD_RD_USB_DATA; /* 從當(dāng)前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ Delay2us( ); /* 如果時鐘頻率低于16MHz則無需該指令延時 */ length = CH375_DAT_PORT; /* 首先讀取后續(xù)數(shù)據(jù)長度 */ if ( length == 0 ) /* 如果長度為0說明計算機(jī)將要開始下傳數(shù)據(jù) */ { wLength=0; /* 將指針初始化以便接收 */ } else /* 長度不為0則說明是下傳文件數(shù)據(jù),接收到緩沖區(qū)中,再由主程序處理串口發(fā)送 */ { if(length != 64)//最后一個數(shù)據(jù)包 { RecvCommand = 1; } do { m_bpRBuffer[wLength] = CH375_DAT_PORT; wLength++; } while ( --length); if(RecvCommand == 1) { length = 0; for (i = 0; i < (wLength-1); i++) { length ^= m_bpRBuffer[i]; } if(length == m_bpRBuffer[i]) RecsSuccess = 1; else{ wLength = 0; } } } }else if ( InterruptStatus == USB_INT_EP2_IN ) { /* 批量數(shù)據(jù)發(fā)送成功,狀態(tài)包已發(fā)送 */ if(Send_OVER == 0) { CH375_CMD_PORT = CMD_WR_USB_DATA7; LED_RED(); Send_OVER = 1; } else CH375_CMD_PORT = CMD_UNLOCK_USB; /* 釋放當(dāng)前USB緩沖區(qū),收到上傳成功中斷后,必須解鎖USB緩沖區(qū),以便繼續(xù)收發(fā) */ } else CH375_CMD_PORT = CMD_UNLOCK_USB; /* 釋放當(dāng)前USB緩沖區(qū)
BYTE SendResponse(BYTE _bStatus, WORD _wLength) { BYTE bRecvData; BYTE bRet; WORD wSendAddr; WORD i;
wSendAddr = XRamSBuffer; *((BYTE xdata *)wSendAddr) = _bStatus; *((BYTE xdata *)(wSendAddr + 1)) = (BYTE)_wLength; *((BYTE xdata *)(wSendAddr + 2)) = (BYTE)(_wLength >> 8); _wLength += HEADER;
bRecvData = 0; for (i = 0; i < _wLength; i++) { bRecvData ^= *((BYTE xdata *)wSendAddr); wSendAddr++; } *((BYTE xdata *)wSendAddr) = bRecvData; _wLength++; wSendAddr = XRamSBuffer;
i = 0; Send_OVER = 1; CH375_CMD_PORT = CMD_WR_USB_DATA7; /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ while (_wLength> 0) { if(_wLength >= 64) { Send_OVER = 0; CH375_DAT_PORT = 64 ; /* 首先寫入后續(xù)數(shù)據(jù)長度 */ bRet = 64; while(bRet) { CH375_DAT_PORT = *((BYTE xdata *)(wSendAddr + i)); /* 寫入數(shù)據(jù)到CH375 */ i++; bRet--; } _wLength = _wLength-64; } else { if(Send_OVER == 1){//等待中斷完成 LED_OFF(); CH375_DAT_PORT = _wLength; while(_wLength>0) { CH375_DAT_PORT = *((BYTE xdata *)(wSendAddr + i)); /* 寫入數(shù)據(jù)到CH375 */ i++; _wLength --; } } } } return MCS_SUCCESS; } void main() { SendResponse(0, 100); } PC端就是收數(shù)據(jù)。當(dāng)數(shù)據(jù)小于64個字節(jié)的時候是成功的。
另外羅嗦一句,要是有個全面例程就好了,或者有個詳細(xì)的文檔,我覺得會少走很多彎路的。 現(xiàn)在動態(tài)庫我只是看。h文件那些注釋,連蒙帶猜去調(diào)用。單片機(jī)的也是看那些網(wǎng)上下載的例程。 痛苦的摸索中。。。。。。。