作者gg1122 (99通未接來電)
看板C_and_CPP
標題[語法] RS232裡面的一些函數(以查過很多資料)
時間Tue Jul 14 23:54:19 2009
目前 在學習RS232 所以就直接拿別人的CODE來看
但有幾行函數 網路上找很多資料 都還是沒辦法了解對方的表達意思
希望各位先進 能幫忙解答 非常感謝妳
主要是meset這行 跟 WaitForSingleObject 這二個
WaitForSingleObject 這不是應該要判斷回傳訊息嗎? 我看read 跟write都沒判斷
我查msdn WaitForSingleObject如果 回傳WAIT_OBJECT_0 在判斷GetOverlappedResult
之後回傳true然後data_counter++ 這是我的想法
可是網路上的code跟我想的都不一樣 但跑出來的結果又是正確的
有人能解說一下這邊的 read&write分別用 WaitForSingleObject 哪幾行說明嗎?
參考網址程式:
http://www.edaboard.com/ftopic51410.html
msdn:
http://msdn.microsoft.com/en-us/library/ms810467.aspx
CSerial::CSerial()
{
memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );//??作用?
memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );//??作用?
}
BOOL CSerial::WriteCommByte( unsigned char ucByte )
{
BOOL bWriteStat;
DWORD dwBytesWritten;
bWriteStat = WriteFile( m_hIDComDev, (LPSTR) &ucByte, 1, &dwBytesWritten,
&m_OverlappedWrite );
if( !bWriteStat && ( GetLastError() == ERROR_IO_PENDING ){
if( WaitForSingleObject( m_OverlappedWrite.hEvent, 1000 ) )//這不是要判斷
dwBytesWritten = 0; //不懂 回傳的訊息
else
{
GetOverlappedResult( m_hIDComDev,&m_OverlappedWrite,&dwBytesWritten,FALSE);
m_OverlappedWrite.Offset += dwBytesWritten;
}
}
return( TRUE );
}
int CSerial::ReadData( void *buffer, int limit)
{
if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );
BOOL bReadStatus;
DWORD dwBytesRead, dwErrorFlags;
COMSTAT ComStat;
ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
if( !ComStat.cbInQue ) return( 0 );
dwBytesRead = (DWORD) ComStat.cbInQue;
if( limit < (int) dwBytesRead ) dwBytesRead = (DWORD) limit;
bReadStatus = ReadFile( m_hIDComDev, buffer, dwBytesRead, &dwBytesRead,
&m_OverlappedRead );
if(!bReadStatus )
{
if( GetLastError() == ERROR_IO_PENDING )
{
WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );//不懂
return( (int) dwBytesRead ); //不懂
}
return( 0 );
}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.216.18.65
→ iamivers0n://縮排一下好嗎 07/14 23:56
※ 編輯: gg1122 來自: 61.216.18.65 (07/15 00:06)
→ james732:函式的用途 直接拿名稱去google就可以知道了 07/14 23:59
→ james732:抱歉你有查了 :P 07/14 23:59
→ WPC001:WaitForSingleObject可以當作檢查事件是否觸發 07/15 00:40
→ WPC001:同時那個2000/1000是Timeout的部分, 時間超過程式也會繼續 07/15 00:40
→ WPC001:最上頭memset的部分就只是先把資料填0進去 07/15 00:41
→ WPC001:不過一般開發serial的lib, timeout都可以讓user自己設定 07/15 00:44
→ WPC001:這上頭的程式固定寫死, 或許也只是一時之間的趕工之作吧 07/15 00:45
→ gg1122:WaitForSingleObject 裡面有幾種message 我看他都沒判斷 07/15 18:15
→ gg1122:就說他TIME_OUT 或者是抓到buffer 資料 07/15 18:15
→ gg1122:讓我很不解if(WaitForSingleObjec)這樣到底有什麼意義? 07/15 18:16
→ gg1122:還是謝謝樓上大大 讓我知道meset 感恩 07/15 18:17
→ WPC001:WaitForSingleObject有傳回值, 但傳回0就表示事件被觸發 07/15 22:04
→ WPC001:timeout或是fail時, 傳回的值都是非0值... 所以... 07/15 22:06
→ gg1122:我看到了 WAIT_OBJECT_0 =0x00000000L = = 07/16 21:34
→ gg1122:感謝大大 我鬼打牆了 我ㄧ直認為哪些訊息 都是有值的 = = 07/16 21:35