VC程式描述:
MFC有個開始按鈕執行void CP::OnBnClickedBtnStart(),在此函式中
1,打開并初始化USB設備
2,建立接收執行緒m_pXferThread=AfxBeginThread(BulkXferRead, &m_oXferParam);
在BulkXferRead函式中回圈接收資料:
問題描述:
(每200us發送一個包,每個包大小為512個位元組,PCLK為100MHz,GPIF總線寬度為32位)
1,發送的包如下(注意第一個位元組遞增):
0 0 1 2 3 4 5 6 7 。。。。。。254
1 0 1 2 3 4 5 6 7 。。。。。。254
2 0 1 2 3 4 5 6 7 。。。。。。254
3 0 1 2 3 4 5 6 7 。。。。。。254
。。
255 0 1 2 3 4 5 6 7 。。。。。。254
原始的關鍵程式如下,即每接收到一個包就將整個包寫入檔案:
pContext=pBulkEpIn->BeginDataXfer(pBulkBuf, nBulkLen, &oWrOvLap);
if(pBulkEpIn->FinishDataXfer(pBulkBuf, nBulkLen, &oWrOvLap, pContext))//成功讀取資料
{
fout.Open
for(i=0;i<nBulkLen;i++)
{
f.Format(gs,pBulkBuf[i]);
fout.Write(f,f.GetLength());
}
fout.Close();
}
2,打開檔案發現,收到的資料如下:
0 0 1 2 3 4 5 6 7 。。。。。。254
80 0 1 2 3 4 5 6 7 。。。。。。254
200 0 1 2 3 4 5 6 7 。。。。。。254
60 0 1 2 3 4 5 6 7 。。。。。。254
。。
20 0 1 2 3 4 5 6 7 。。。。。。254
可以看到丟了很多包!
現在我將程式改變一下,即每次接收到一個包之后,把第一個位元組寫入快取,當接收到512個包后,只將每個包的第一個位元組存入檔案:
pContext=pBulkEpIn->BeginDataXfer(pBulkBuf, nBulkLen, &oWrOvLap);
if(pBulkEpIn->FinishDataXfer(pBulkBuf, nBulkLen, &oWrOvLap, pContext))//成功讀取資料
{
TpBulkBuf[Tpsize] = pBulkBuf[0];
Tpsize++;
if(Tpsize>=512)
{
fout.Open
for(i=0;i<Tpsize;i++)
{
f.Format(gs,TpBulkBuf[i]);
fout.Write(f,f.GetLength());
}
fout.Close();
}
}
此時打開檔案,發現資料如下:
1 2 3 4 5 6 8 9 10 11 12 。。。。200 202
資料偶有丟失,但基本正確
我想問的是VC執行效率問題,中間并沒有什么延時單元,也沒有別的什么處理程式,
在原始程式中還是丟失了這么多的包,是在寫入檔案的程序中沒有來得及接收新包的問題嗎,
我200us發送一個包,在這200us內不足以完成接收并寫入檔案的作業嗎???
我該怎么處理呢???
uj5u.com熱心網友回復:
200us?這個要求有點高喲!WINDOWS不是實時系統,很難保證實時性。如果只是寫檔案有耽擱,有一個東東叫記憶體映射,可以了解一下。
uj5u.com熱心網友回復:
非阻塞性的 BeginDataXfer WaitForXfer FinishDataXferuj5u.com熱心網友回復:
用的就是這個啊, WaitForXfer我沒寫出來而已uj5u.com熱心網友回復:
我大致看了一下,記憶體映射一般是處理大檔案用的,這個合適嗎,我這個檔案不是很大,主要是速度吧,200us一個包,一個包512位元組,我只是用這個包做些處理,處理完沒必要全部存起來,所以整個檔案不會太大
uj5u.com熱心網友回復:
頻繁的關閉打開檔案,假如系統反應過慢,下一回新的資料寫入會覆寫上一次未保存完的資料,可以把寫入資料函式獨立,先保存資料,到一定的數量以后一次性寫入資料uj5u.com熱心網友回復:
VC里持續讀,FPGA那邊檢測讀完后開始再一次發送,FPGA波形抓到的波形如下:如圖所示,上面的每個脈沖間隔是200us,20個左右的脈沖,VC才能把上次發送的資料讀完,
這樣的話FPGA每20*200us左右的時間才能再一次發送新包,這個不能滿足我的要求,
我想讓VC在這200us內就把一個包的資料接收完,這樣才不影響下一個包的發送,我該怎么辦???
uj5u.com熱心網友回復:
下面的波形代表VC接收完資料了!uj5u.com熱心網友回復:
200us, WINDOWS 系統中,時鐘頻率,達不到這個水平。遇到這種情況,我們一般是通過硬體,完成資料的高速采集,然后再讀取資料。硬體的時鐘頻率,根據實際情況(資料采集要求,環境干擾等等)自己調配。我們遇到的高速采集,都階段性的多次采集,再資料分析,持續的高速采集,目前沒有遇到過,沒有什么好的建議。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/43705.html
標籤:基礎類
上一篇:Vc++大神們幫幫忙!!!
下一篇:VC6.0
