CH573USB模擬串口,從上位機(jī)發(fā)送64字節(jié)長度的數(shù)據(jù)給CH573,然后CH573重新發(fā)送64字節(jié)長度的數(shù)據(jù)給上位機(jī),這一串64字節(jié)長度的數(shù)據(jù)最后好像并沒有去發(fā)送上位機(jī),會存儲在緩沖區(qū),等待下一次再發(fā)送給上位非64字節(jié)長度的數(shù)據(jù)后,一起發(fā)送給上位機(jī)。這種問題該如何解決?
網(wǎng)上搜索了一下,應(yīng)該無法發(fā)送給上位機(jī)64整數(shù)倍的數(shù)據(jù),64整數(shù)倍的數(shù)據(jù),沒有滿足通訊結(jié)束的條件,所以就不會從緩沖區(qū)發(fā)到上位機(jī)。那么該如何解決呢?我用的CH573的USB模擬串口
可以試一下在傳輸完第一次64字節(jié)之后,上傳一個0長度的IN包給電腦
USB上傳都是主機(jī)主動獲取的,從機(jī)只負(fù)責(zé)準(zhǔn)備數(shù)據(jù)等主機(jī)取走,你說的沒有取走的問題,要看下是不是主機(jī)取的慢了或者主機(jī)滿足什么條件后才向設(shè)備發(fā)送IN包
謝謝兩位老師~我這邊的問題就是當(dāng)CH573從上位機(jī)接收到的數(shù)據(jù)長度為64時,將這64長度的數(shù)據(jù)拷貝到EP2的發(fā)送緩沖區(qū)(最大64字節(jié))中。然后開始DevEP2_IN_Deal(),即MASK_UEP_T_RES ACK后,這時候USB會把EP2的發(fā)送緩沖寄存器中的數(shù)據(jù)發(fā)送fifo中,根據(jù)USB的協(xié)議,發(fā)送到fifo中的數(shù)據(jù)包長度需要在0~63字節(jié)內(nèi),才會認(rèn)為數(shù)據(jù)發(fā)送結(jié)束,然后才會把fifo中的數(shù)據(jù)發(fā)送給上位機(jī)。
TECH5:可以試一下在傳輸完第一次64字節(jié)之后,上傳一個0長度的IN包給電腦
RE:按照TECH5的建議,上位機(jī)可以接收到,但是有新的問題就是,當(dāng)上位機(jī)發(fā)送給CH573的數(shù)據(jù)大于64字節(jié),比如96字節(jié)時,CH573第一次USB傳輸中斷out里面EP2的接收緩沖區(qū)的數(shù)據(jù)為64長度的字節(jié),這個時候也要發(fā)送到fifo中,但這個時候不希望“在傳輸完第一次64字節(jié)之后,上傳一個0長度的IN包給電腦”,因?yàn)榈诙?span style="color:rgb(51,51,51);">CH573USB傳輸中斷out里面的接收緩沖區(qū)的數(shù)據(jù)長度為32,滿足USB通信協(xié)議通訊結(jié)束的條件,如果提前上傳一個0長度的IN包,不就提前結(jié)束了通信么?
☆怎么樣可以從一開始就能獲得到從上位機(jī)下傳到CH573的總的數(shù)據(jù)長度?
或者如何將超過64字節(jié)的數(shù)據(jù)通過多次USB中斷拆開,不發(fā)送給上位機(jī),存儲起來?
除非定義軟件協(xié)議,告知主機(jī)要發(fā)送長度,否則就是沒有總長度信息的,一般USB傳輸盡量都按照滿包滿包,非滿包,認(rèn)為是結(jié)束。
你的這個問題,最好加軟件協(xié)議,自定義數(shù)據(jù)格式信息。
有沒有例程可以參考一下,處理大于64字節(jié)的USB傳輸處理的
從機(jī)處理沒差別,就是有數(shù)據(jù)就往緩沖區(qū)里面放,設(shè)置ACK,等主機(jī)取走,繼續(xù)填入下一包。
TECH13:從機(jī)處理沒差別,就是有數(shù)據(jù)就往緩沖區(qū)里面放,設(shè)置ACK,等主機(jī)取走,繼續(xù)填入下一包
那上位機(jī)下傳到從機(jī)的數(shù)據(jù)為64整數(shù)倍字節(jié)長度的時候,怎么判斷為最后一包數(shù)據(jù)包。如果非64整數(shù)倍包,可以根據(jù)包的數(shù)據(jù)長度小于64,判斷可以最后一包。但是如果是64整數(shù)倍字節(jié)長度的時候,就沒辦法判斷。本人就是在這里遇到的問題,不知道如何解決了。沒有一個例程處理這種情況的么?應(yīng)該都會遇到吧,正好64整數(shù)倍的時候,怎么判斷當(dāng)前的64整數(shù)倍的包為最后一包
如果不加自定義長度協(xié)議,是區(qū)分不了的。
您好,針對您遇到的問題可參考以下做法:
在單片機(jī)程序中設(shè)定一個USB數(shù)據(jù)上傳等待時間,比如設(shè)定一個2ms的定時器。當(dāng)上傳給USB主機(jī)的數(shù)據(jù)包長度等于端點(diǎn)大?。ū纠秊?4byte),則啟動該定時器。
1、若2ms定時時間到仍沒有其他數(shù)據(jù)需要上傳,則發(fā)送一包0長度USB包告知主機(jī)此次傳輸提前結(jié)束。
2、若2ms定時時間未到又有新數(shù)據(jù)要上傳,則繼續(xù)上傳新的USB包而無需上傳0長度包。
原因說明:
當(dāng)USB主機(jī)請求的讀長度為設(shè)備端點(diǎn)大小的整數(shù)倍時,此時主機(jī)讀請求結(jié)束的判斷條件為:
1、此次讀取的USB包長度小于端點(diǎn)大?。炊贪?,包括0長度);
2、累計(jì)讀取的USB包總長度達(dá)到主機(jī)請求的長度;
好的 謝謝TECH39?