
//////////////////////////////////////////////////////////////////////////
//讀報告執行緒
//由于使用的是異步呼叫,因而在呼叫ReadFile
//函式時提供一個Overlapped的結構,該結構中含有一個事件的
//句柄。平時該事件是處于無信號狀態的,因而等待事件的函式
//就會被掛起,從而該執行緒被阻塞。當資料正確回傳后,事件被
//觸發,執行緒恢復運行。并檢查回傳的資料量以及報告ID是否正
//確,從而設定界面上各開關的狀態。由于該函式并不是
//CMYUSBDlg類(就是該工程中主視窗類)中的成員函式,
//所以無法直接呼叫CMYUSBDlg類中的成員函式。
//在創建該執行緒時,通過pParam引數傳遞了一個this指標,將引數pParam
//強制轉化為CMYUSBDlg類的指標即可訪問CMYUSBDlg類
//中的成員函式。
DWORD IsReadReportThread(LPVOID pParam)
{
CMYUSBDlg *pUsbDlg;
DWORD dwLength;
UINT i;
CString strTmp;
unsigned char ucReadReportBuffer[64]={0};
//memset(ucReadReportBuffer, 0, 64);
//將引數pParam取出,并轉換為CMYUSBDlg型指標,
//以供下面呼叫其成員函式。
pUsbDlg=(CMYUSBDlg *)pParam;
//該執行緒是一個死回圈,直到程式退出時,它才退出
while (1)
{
//設定事件為無效狀態
ResetEvent(lpReadOverlapped.hEvent);
//如果設備已經找到
if (bMyDevFound)
{
if (hReadHandle!=INVALID_HANDLE_VALUE)//如果讀句柄無效
{
#ifdef MY_DEBUG
//pUsbDlg->GainToInfOutPut("IsReadReportThread執行緒:有效的讀報告句柄");
#endif
//則呼叫ReadFile函式請求9位元組的報告資料
ReadFile(
hReadHandle,
ucReadReportBuffer,
64,
NULL,
&lpReadOverlapped
);
}
else
#ifdef MY_DEBUG
pUsbDlg->GainToInfOutPut("IsReadReportThread執行緒:無效的讀報告句柄");
#endif
//等待事件觸發
WaitForSingleObject(lpReadOverlapped.hEvent,INFINITE);
//如果等待程序中設備被拔出,也會導致事件觸發,但此時bMyDevFound
//被設定為假,因此在這里判斷bMyDevFound為假的話就進入下一輪回圈。
if(bMyDevFound==FALSE)
{
continue;
}
//如果設備沒有被拔下,則是ReadFile函式正常操作完成。
//通過GetOverlappedResult函式來獲取實際讀取到的位元組數。
GetOverlappedResult
(
hReadHandle,
&lpReadOverlapped,
&dwLength,
TRUE
);
//如果位元組數不為0,則將讀到的資料顯示到資訊框中
if (dwLength!=0)
{
//pUsbDlg->GainToInfOutPut("讀取 資料"+pUsbDlg->itos(dwLength)+"位元組");
strTmp="";
for (i=1;i<2;i++ )
{
//因為itos默認為4位,所以要取右邊2位
strTmp+=pUsbDlg->itos(ucReadReportBuffer[i],16).Right(2)+" ";
}
pUsbDlg->GainToInfOutPut(strTmp,FALSE);
}
uj5u.com熱心網友回復:
字串最后要有0結尾如果你的資料是“1234”,緩沖區必須是5個,即0x31,0x32,0x33,0x34,0x00
uj5u.com熱心網友回復:
把記憶體先全部清零uj5u.com熱心網友回復:
怎么做啊,試了好多次都不行uj5u.com熱心網友回復:
ReadFile 有可能直接成功, 另外設定斷點單步除錯運行看看
BOOL bRdOK = ReadFile(hReadHandle, ucReadReportBuffer, 64, &dwLength, &lpReadOverlapped);
if( (!bRdOk) && GetLastError() == ERROR_IO_PENDING)
{
bRdOK = GetOverlappedResult(hReadHandle, &lpReadOverlapped, &dwLength, TRUE);
}
if(bRdOK)
{
strTemp.Format(_T("Read %u Bytes:"), dwLength);
for(DWORD i=0; i<dwLength; i++)
{
CString s; s.Format(_T("%02X "), (UTIN)ucReadReportBuffer[i]);
strTemp += s;
}
if(pUsbDlg) pUsbDlg->GainToInfOutPut(strTmp,FALSE);
}
uj5u.com熱心網友回復:
能 保證 一個漢字不被 分割 為 2次 讀取 中 ?uj5u.com熱心網友回復:
燙不是真的燙,一般都記憶體緩沖區不夠,比如陣列越界等毛病引起轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/27001.html
標籤:基礎類
