作者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
1F:→ iamivers0n://缩排一下好吗 07/14 23:56
※ 编辑: gg1122 来自: 61.216.18.65 (07/15 00:06)
2F:→ james732:函式的用途 直接拿名称去google就可以知道了 07/14 23:59
3F:→ james732:抱歉你有查了 :P 07/14 23:59
4F:→ WPC001:WaitForSingleObject可以当作检查事件是否触发 07/15 00:40
5F:→ WPC001:同时那个2000/1000是Timeout的部分, 时间超过程式也会继续 07/15 00:40
6F:→ WPC001:最上头memset的部分就只是先把资料填0进去 07/15 00:41
7F:→ WPC001:不过一般开发serial的lib, timeout都可以让user自己设定 07/15 00:44
8F:→ WPC001:这上头的程式固定写死, 或许也只是一时之间的赶工之作吧 07/15 00:45
9F:→ gg1122:WaitForSingleObject 里面有几种message 我看他都没判断 07/15 18:15
10F:→ gg1122:就说他TIME_OUT 或者是抓到buffer 资料 07/15 18:15
11F:→ gg1122:让我很不解if(WaitForSingleObjec)这样到底有什麽意义? 07/15 18:16
12F:→ gg1122:还是谢谢楼上大大 让我知道meset 感恩 07/15 18:17
13F:→ WPC001:WaitForSingleObject有传回值, 但传回0就表示事件被触发 07/15 22:04
14F:→ WPC001:timeout或是fail时, 传回的值都是非0值... 所以... 07/15 22:06
15F:→ gg1122:我看到了 WAIT_OBJECT_0 =0x00000000L = = 07/16 21:34
16F:→ gg1122:感谢大大 我鬼打墙了 我ㄧ直认为哪些讯息 都是有值的 = = 07/16 21:35