一般出現(xiàn)死機(jī)的現(xiàn)象是375的讀寫函數(shù)掛起了主線程,造成消息不能響應(yīng),在做大量數(shù)據(jù)傳輸時(shí),下位機(jī)在傳輸多個(gè)整包之后,再傳一個(gè)零頭包.如果多個(gè)整包已經(jīng)可以把數(shù)據(jù)傳完了,那在最后還要再傳一個(gè)零長度的包,這樣就可以通知上位機(jī)通信結(jié)束.請(qǐng)問如何實(shí)現(xiàn),有無例程提供?
例子可以自己寫一個(gè),發(fā)零頭包只是一種解決方法,下面有更詳細(xì)的說明: * 設(shè)計(jì)的計(jì)算機(jī)端應(yīng)用程序在讀寫USB時(shí)有時(shí)會(huì)死機(jī),而計(jì)算機(jī)的其它程序一切正常 1、這種死機(jī)實(shí)際上是計(jì)算機(jī)端程序以為下位機(jī)會(huì)收發(fā)數(shù)據(jù),而實(shí)際下位機(jī)沒有,導(dǎo)致計(jì)算機(jī)一直等待。 一般情況下,在計(jì)算機(jī)與單片機(jī)的應(yīng)用層應(yīng)該有一定的約定:如何傳數(shù)據(jù)、傳多少、什么時(shí)候傳、 雙方如何同步,如果雙方?jīng)]有約定好,那么可能出現(xiàn)甲方以為乙方會(huì)傳而乙方未傳則會(huì)導(dǎo)致甲方一直 等待。最佳的解決方法是,設(shè)計(jì)良好的程序結(jié)構(gòu)和雙方約定,確保不出現(xiàn)上述的“以為”,另外再輔 助以超時(shí)解決方法,超時(shí)解決方法是,甲方收發(fā)數(shù)據(jù),如果乙方正忙,那么甲方只等待一定時(shí)間而非 一直等待。新版的驅(qū)動(dòng)程序都支持超時(shí)CH375SetTimeout,如果設(shè)置超時(shí)為200毫秒,那么超過200毫 秒收不到數(shù)據(jù),甲方也不會(huì)一直等待下去,但是主程序應(yīng)該分析這種情況是什么原因。建議超時(shí)值大 于正常情況下最大傳輸時(shí)間的2倍以上,最小要有數(shù)毫秒,因?yàn)橛?jì)算機(jī)忙時(shí)正常傳輸時(shí)間也會(huì)增大。 2、類似情況還有,應(yīng)用程序調(diào)用API準(zhǔn)備接收80字節(jié),而單片機(jī)只打算上傳64字節(jié),那么在計(jì)算機(jī)收到 64字節(jié)之后,因?yàn)椴蛔闼枰?0字節(jié),所以繼續(xù)等待后面的數(shù)據(jù)。原因是,USB傳輸最大包是64字 節(jié),所以單片機(jī)上傳64字節(jié)不能說明后面沒有數(shù)據(jù)(真正的80字節(jié)傳輸是先傳64再傳16)。解決方法 是,單片機(jī)在64字節(jié)之后再上傳0字節(jié),當(dāng)計(jì)算機(jī)收到0到63字節(jié)時(shí),認(rèn)為后面沒有數(shù)據(jù)(因?yàn)閁SB最 后一個(gè)包的長度才可以少于最大包長度64),從而不管應(yīng)用程序需要多少字節(jié)而提前退出接收。 3、另外還有一種失誤,單片機(jī)程序在收到上傳成功中斷后未解鎖CMD_UNLOCK_USB,導(dǎo)致CH372/CH375拒 絕處理后面的USB傳輸,而計(jì)算機(jī)程序不知道,會(huì)一直等待下去,除非超時(shí)退出。 4、如果要求的傳輸速度不高(小于20K字節(jié)每秒),那么可以參考CH37X調(diào)試工具中的調(diào)試程序,它使用 單個(gè)數(shù)據(jù)包的請(qǐng)求加應(yīng)答方式,每個(gè)回合的USB操作都是計(jì)算機(jī)發(fā)下去一個(gè)命令包(含數(shù)據(jù)),然后 單片機(jī)返回應(yīng)答包(含數(shù)據(jù)),因?yàn)殡p方約定有序,所以理論上絕對(duì)不會(huì)出現(xiàn)死機(jī)情況。 5、默認(rèn)情況下的DLL是同步操作I/O,所以打開設(shè)備的同一句柄handle同一時(shí)候只能用于一個(gè)API,如果 同時(shí)有多個(gè)API使用同一個(gè)句柄則會(huì)導(dǎo)致阻塞。如果應(yīng)用程序的多個(gè)線程都需要調(diào)用DLL的API,那么 必須使每個(gè)調(diào)用者分別使用各自的句柄handle,可以在主線程中OpenDevice后,用GetDeviceName獲 取設(shè)備名稱,然后由各線程調(diào)用CreateFile分別打開USB設(shè)備獲得各自的句柄,再用于API調(diào)用,