用貴公司的CH375來(lái)做數(shù)據(jù)采集系統(tǒng),用的freescale16位單片機(jī),總線頻率為24MHz。以脈沖信號(hào)作為采樣信號(hào)的觸發(fā)信號(hào),每個(gè)脈沖產(chǎn)生3個(gè)字節(jié)的數(shù)據(jù),累計(jì)采樣21點(diǎn),則向CH375寫(xiě)一次數(shù)據(jù),上位機(jī)用VB編寫(xiě),使用一個(gè)線程來(lái)不斷的執(zhí)行ReadData函數(shù)來(lái)讀取數(shù)據(jù)。 問(wèn)題1:在脈沖信號(hào)頻率低于4KHz時(shí),沒(méi)有丟失數(shù)據(jù)包的現(xiàn)象,當(dāng)脈沖信號(hào)的頻率高于一定頻率后,出現(xiàn)丟失數(shù)據(jù)包的現(xiàn)象,這樣存在幾個(gè)問(wèn)題,上位機(jī)CPU資源占得很多,而且讀取數(shù)據(jù)沒(méi)有同步性;有沒(méi)有好一點(diǎn)的辦法解決數(shù)據(jù)同步的問(wèn)題和數(shù)據(jù)丟失的問(wèn)題? 問(wèn)題2:上位機(jī)讀取USB數(shù)據(jù)時(shí),檢測(cè)USB數(shù)據(jù)線的波形,發(fā)現(xiàn)不管上位機(jī)隔多長(zhǎng)時(shí)間讀一次數(shù)據(jù),USB數(shù)據(jù)線上每隔1ms出現(xiàn)一次波形,請(qǐng)問(wèn)CH375和上位機(jī)之間是如果完成通信的? 現(xiàn)在主要問(wèn)題是,上位機(jī)讀取數(shù)據(jù)不同步,而導(dǎo)致數(shù)據(jù)丟失的問(wèn)題!
上位機(jī)上面你可以一次讀取4096個(gè)字節(jié),這樣上位機(jī)的速度算是最快的了,如果還出現(xiàn)丟數(shù)據(jù)的現(xiàn)象,建議你首先優(yōu)化你下位機(jī)的程序,包括采樣數(shù)據(jù)發(fā)送到計(jì)算機(jī),如果還是不行的話,建議你換成CH374芯片,這個(gè)芯片在單片機(jī)速度很快的時(shí)候和計(jì)算機(jī)通信的速度也會(huì)比較快,同時(shí)這個(gè)單片機(jī)還有雙緩沖模式,速度更加的快.應(yīng)該滿足你的速度要求
上位機(jī)中設(shè)置緩沖上傳,在讀線程中用DoEvents,由于緩沖上傳要求數(shù)據(jù)傳輸時(shí),最好按包的整數(shù)倍傳輸,你的采樣數(shù)據(jù)是63個(gè)字節(jié),多出來(lái)的一個(gè)字節(jié)可以用做包的序列號(hào)(0~255,超過(guò)255則從頭開(kāi)始).用一個(gè)線程來(lái)不斷的執(zhí)行DoEvents和ReadData函數(shù)來(lái)讀取數(shù)據(jù),DoEvents是在沒(méi)數(shù)據(jù)上傳時(shí)把系統(tǒng)執(zhí)行權(quán)限交出去,ReadData的第三個(gè)參數(shù)要設(shè)置成包的整數(shù)倍,設(shè)置緩沖上傳時(shí)ReadData將不掛起線程,有關(guān)緩沖上傳的用法可以參考CH372EVT\PUB\BULK\WIN\SPEED372.C
對(duì)于CH375與PC之間如何通信不是非常清楚,因此對(duì)于上位機(jī)每次讀取字節(jié)數(shù)的大小是這樣理解的:如果脈沖信號(hào)為4KHz,那么形成一個(gè)數(shù)據(jù)包(21個(gè)脈沖+包的序列號(hào))的間隔時(shí)間為5.250ms的,形成數(shù)據(jù)包后寫(xiě)一次CH375;而上位機(jī)是采用一個(gè)線程專門執(zhí)行ReadData,如果一次讀取4096個(gè)字節(jié),返回的有效字節(jié)仍然是64個(gè),其他的都是0。 問(wèn)題1:是不是上位機(jī)每執(zhí)行一次ReadData操作都會(huì)產(chǎn)生一次低電平(CH375第一引腳)? 問(wèn)題2:上位機(jī)每一次讀取字節(jié)數(shù)的多少根據(jù)什么來(lái)確定? 問(wèn)題3:下位機(jī)每傳輸一個(gè)包64個(gè)字節(jié)所需要的時(shí)間大概是150uS左右,感覺(jué)時(shí)間有點(diǎn)長(zhǎng),在最佳情況下,傳輸64個(gè)字節(jié)應(yīng)該需 要多長(zhǎng)時(shí)間? 問(wèn)題4:下位機(jī)在傳一個(gè)數(shù)據(jù)包的過(guò)程中,被中斷程序打斷,中斷完后再傳輸沒(méi)有傳完的數(shù)據(jù),這樣的中斷會(huì)不會(huì)影響數(shù)據(jù)傳輸?shù)恼_性?
1,不是每次讀函數(shù)都會(huì)產(chǎn)生低電平,你可以這樣理解,我們的上位機(jī)讀取數(shù)據(jù)的時(shí)候是有一個(gè)超時(shí)的時(shí)間,當(dāng)超過(guò)這個(gè)時(shí)間的話,就認(rèn)為讀取一次數(shù)據(jù)完成,當(dāng)數(shù)據(jù)滿4096的話,函數(shù)就返回。并不是每次讀取完數(shù)據(jù)就產(chǎn)生一次低電平,而是計(jì)算機(jī)底層把數(shù)據(jù)讀取進(jìn)來(lái),放到緩沖區(qū)里面去,按照你的4096的話,應(yīng)該產(chǎn)生4096/64=64次中斷。 2,ReadFile(hFile,&BufFile[0],ReadLen,&ReadLen,NULL);里面有要求讀取多少個(gè)字節(jié)的參數(shù) 3,這個(gè)和你下位機(jī)的程序有關(guān)系,按照理論來(lái)計(jì)算的話,64字節(jié)的時(shí)間應(yīng)該在100US左右。 4,這個(gè)是不會(huì)影響數(shù)據(jù)傳輸?shù)恼_性的
如果一次讀取4096個(gè)字節(jié),返回的有效字節(jié)仍然是64個(gè),其他的都是0:這有可能是你設(shè)置緩沖上傳,如果設(shè)置緩沖上傳的話,ReadData會(huì)立刻返回的,就不會(huì)等待剩余的數(shù)據(jù),如果沒(méi)有數(shù)據(jù)的話,返回的有效字節(jié)有可能是0
在什么情況下才能產(chǎn)生低電平,因?yàn)槲沂潜O(jiān)測(cè)到低電平后,再判斷我的數(shù)據(jù)是否準(zhǔn)備好,如果好了,就寫(xiě)一次,如果數(shù)據(jù)準(zhǔn)備好了,而沒(méi)有產(chǎn)生低電平的話,以前的數(shù)據(jù)就會(huì)被覆蓋而造成數(shù)據(jù)包的丟失。有沒(méi)有辦法控制低電平如何觸發(fā)? zyw提到的緩沖上傳,這個(gè)沒(méi)有太注意,因?yàn)閰⒖糃H372EVT寫(xiě)的程序,里面的一些細(xì)節(jié)設(shè)置沒(méi)有太注意~ 按你說(shuō)的,我用的是緩沖上傳,讀一次數(shù)據(jù)就立即返回?cái)?shù)據(jù)!
實(shí)際是你把數(shù)據(jù)寫(xiě)到372里面去,當(dāng)計(jì)算機(jī)把數(shù)據(jù)取走之后,這個(gè)時(shí)候372就會(huì)產(chǎn)生低電平
你的程序中有沒(méi)有調(diào)用CH375SetBufUpload(0,TRUE),這個(gè)函數(shù)是設(shè)置緩沖上傳
沒(méi)有用到CH375SetBufUpload(0,TRUE)這個(gè)函數(shù),我每次讀取的字節(jié)修改為1024之后,在頻率為10KHz時(shí),用線程循環(huán)讀取的方式不斷讀取數(shù)據(jù),如果只保存數(shù)據(jù)包序列號(hào),發(fā)現(xiàn)沒(méi)有數(shù)據(jù)包丟失的情況,如果把這1024個(gè)數(shù)據(jù)保存下來(lái)(保存為TXT文件)時(shí),發(fā)現(xiàn)數(shù)據(jù)丟失嚴(yán)重,是不是這樣保存方式導(dǎo)致每一次讀取數(shù)據(jù)的間隔時(shí)間過(guò)長(zhǎng)而導(dǎo)致數(shù)據(jù)包丟失的情況?有沒(méi)有解決的辦法? 非常感謝兩位的解答和指點(diǎn),謝謝??!
用緩沖上傳的方法試試,緩沖上傳的基本思想是驅(qū)動(dòng)層會(huì)自動(dòng)把數(shù)據(jù)接受并緩沖下來(lái),這些數(shù)據(jù)是按數(shù)據(jù)包來(lái)組織的,是一個(gè)鏈表結(jié)構(gòu),接受到數(shù)據(jù)包的時(shí)候會(huì)把數(shù)據(jù)包放到鏈表的結(jié)尾處,CH375ReadData讀取數(shù)據(jù)的時(shí)候會(huì)從鏈表的頭開(kāi)始取數(shù)據(jù),因?yàn)殒湵硎前磾?shù)據(jù)包來(lái)組織數(shù)據(jù)的,所以CH375ReadData的第三個(gè)參數(shù)最好按包的整數(shù)倍來(lái)讀取.這樣的話可以增加線程操作的并發(fā)性,驅(qū)動(dòng)層會(huì)自動(dòng)把數(shù)據(jù)給緩沖,CH375ReadData會(huì)把數(shù)據(jù)立刻取走(不會(huì)等待,如果沒(méi)數(shù)據(jù)的話,第三個(gè)參數(shù)為0),這樣就會(huì)為你的寫(xiě)文件提供一些操作時(shí)間
用緩沖上傳的方式試了試,數(shù)據(jù)包丟失非常嚴(yán)重,我把上位機(jī)的程序貼出來(lái),你幫我看看,我用的方法是否正確? 創(chuàng)建一個(gè)線程: ThreadControl2.CreateNewThread AddressOf ShowAnimation, mThreadPriority, mEnabled 線程的執(zhí)行函數(shù): Public Function ShowAnimation() Dim strFileName As String '文件名 Dim lngHandle As Long '句柄 Dim strWrite As Long '要寫(xiě)入的文本內(nèi)容 Do 'CH375SetBufUpload 0, True If (CH375ReadData(mIndex, Re, DataLength)) Then ' 通過(guò)CH375接收應(yīng)答數(shù)據(jù),成功 For i = 0 To 511 Step 1 ReTemp(0) = Re.ReBuffer(2 * i + 0) ReTemp(1) = Re.ReBuffer(2 * i + 1) strFileName = "c:\w1.txt" lngHandle = FreeFile() '取得句柄 '準(zhǔn)備要寫(xiě)入的內(nèi)容 strWrite = 256 * ReTemp(0) + ReTemp(1) 'For后面的參數(shù)表示以何種方式打開(kāi)文件,Input是讀取,Output是覆蓋寫(xiě)入,Append是追加寫(xiě)入 'Open strFileName For Output As lngHandle '打開(kāi)文件 Open strFileName For Append As lngHandle Print #lngHandle, strWrite '寫(xiě)入文本 Close lngHandle '關(guān)閉文件 Next i Form1.Text1.Text = Form1.Text1.Text & " " & Re.ReBuffer(63) & " " & Re.ReBuffer(127) & " " & Re.ReBuffer(191) & " " & Re.ReBuffer(255) & " " & Re.ReBuffer(319) _ & " " & Re.ReBuffer(383) & " " & Re.ReBuffer(447) & " " & Re.ReBuffer(511) & " " & Re.ReBuffer(575) & " " & Re.ReBuffer(639) & " " & Re.ReBuffer(703) _ & " " & Re.ReBuffer(767) & " " & Re.ReBuffer(831) & " " & Re.ReBuffer(895) & " " & Re.ReBuffer(959) & " " & Re.ReBuffer(1023) flag = 1 Disp = Disp + 1 If Disp > 50 Then Disp = 0 Form1.Text1.Text = "" Form1.TxtDisp.Text = "" End If End If Loop End Function
謝謝!急~
CH375SetBufUpload 0,TRUE在什么時(shí)候啟用?form_load時(shí)加載還是在線程里面加載比較合適?調(diào)用CH375SetBufUpload 0,TRUE這個(gè)函數(shù)后,再調(diào)用ReadData時(shí),讀取的有效數(shù)據(jù)的長(zhǎng)度是不是不斷變化的?
CH375SetBufUpload 在打開(kāi)設(shè)備后調(diào)用,CH375SetBufUpload 0,TRUE這個(gè)函數(shù)后,再調(diào)用ReadData時(shí),讀取的有效數(shù)據(jù)的長(zhǎng)度是不斷變化的,DataLength大多時(shí)候可能都為零,所以DataLength在CH375ReadData調(diào)用之后要判斷一下讀取的真正長(zhǎng)度,可以參考CH372EVT\PUB\BULK\WIN\SPEED372.C的例子
在用緩沖上傳過(guò)程中還是遇到了對(duì)數(shù)據(jù)的操作時(shí)間不夠的問(wèn)題? 對(duì)于單片機(jī)寫(xiě)數(shù)據(jù)這方面,能不能這樣來(lái)操作?一開(kāi)始就是每個(gè)脈沖采樣三個(gè)字節(jié)的數(shù)據(jù),累計(jì)到了64個(gè)字節(jié)后寫(xiě)一次CH375,現(xiàn)在能不能改成,每個(gè)脈沖采樣后馬上把這三個(gè)字節(jié)寫(xiě)到CH375里面去,這樣就避免了一次寫(xiě)數(shù)據(jù)的時(shí)間過(guò)長(zhǎng)的問(wèn)題,不知道這樣是否可行? 我想改用374來(lái)提高傳輸速度,不知道貴公司能夠寄幾塊樣片?
非常感謝這么快速的回復(fù)~
這樣改不能提高速度.同樣你寫(xiě)的次數(shù)頻繁了,(一次)寫(xiě)3個(gè)字節(jié)和寫(xiě)64個(gè)字節(jié)相差的時(shí)間不會(huì)長(zhǎng)的.您可以使用CH374來(lái)提升速度.申請(qǐng)方法可以給我們銷售電話02552638399/88/77