2009年10月15日 星期四

關於 IOCTL_SERIAL_GET_COMMSTATUS

今天在trace serial port driver,使用sscom去連結COM port的時候,
sscom在對COM寫入的時候會發出IRP_MJ_WRITE,
接著driver去記錄WRITE資料的長度,
sscom不知道做了什麼事,
driver會收到 IOCTL_SERIAL_GET_COMMSTATUS,
再將WRITE資料的長度傳回來,

我利用CSerial去做overlapped的時候,可以產生與sscom一樣的Irp,
唯獨 IOCTL_SERIAL_GET_COMMSTATUS不知道是用了什麼WIN32 API,
後來總算查到了,是使用 ClearCommError

在CSerial當中,加入一段code,就可以使用
//app:
DWORD dwBytesRead = 0;
int count = serial.GetLength ();
if (count >0)
lLastError = serial.Read(szBuffer,count,&dwBytesRead);

//CSerial
int CSerial::GetLength (void)
{
DWORD dwErrors = 0;
COMSTAT ComStat;
if (!::ClearCommError(m_hFile,&dwErrors,&ComStat))
{
m_lLastError = ::GetLastError();
return -1;
}

return (int)ComStat.cbInQue ;
}

沒有留言 :