UINT CIrPulse::FindIrPort()
{
// 查询注册表中的IR端口号
HKEY hKey = NULL;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("Comm//IrDA"),0, 0, &hKey) == ERROR_SUCCESS)
{
DWord dwType = 0;
DWORD dwData = 0;
DWORD dwSize = sizeof(dwData);
if (RegQueryValueEx(hKey, _T("Port"), NULL, &dwType, (LPBYTE) &dwData, &dwSize) == ERROR_SUCCESS)
{
if (dwType == REG_DWORD && dwSize == sizeof(dwData))
{
RegCloseKey(hKey);
return (UINT) dwData;
}
}
RegCloseKey(hKey);
}
return 0;
}
BOOL CIrPulse::Open(UINT uiport)
{
ASSERT(uiPort > 0 && uiPort <= 255);
Close();
//打开IRDA端口
CString strPort;
strPort.Format(_T("COM%d:"), uiPort);
m_irPort = CreateFile((LPCTSTR) strPort, GENERIC_READ GENERIC_WRITE,0, NULL, OPEN_EXISTING, 0, NULL);
if (m_irPort == INVALID_HANDLE_VALUE)
{
return FALSE;
}
//设置输入和输出缓冲区的大小
VERIFY(SetupComm(m_irPort, 2048, 2048));
//清除读和写缓冲区
VERIFY(PurgeComm(m_irPort,PURGE_TXABORTPURGE_RXABORT
PURGE_TXCLEARPURGE_RXCLEAR));
//重新初始化所有的IRDA端口设置
DCB dcb;
dcb.DCBlength = sizeof(DCB);
VERIFY(GetCommState(m_irPort, &dcb));
dcb.BaudRate = CBR_115200;
dcb.fBinary = TRUE;
dcb.fParity = TRUE;
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity = FALSE;
dcb.fTXContinueOnXoff = FALSE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
dcb.fErrorChar = FALSE;
dcb.fNull = FALSE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fAbortOnError = FALSE;
dcb.ByteSize = 8;
dcb.Parity = EVENPARITY;
dcb.StopBits = TWOSTOPBITS;
VERIFY(SetCommState(m_irPort, &dcb));
//为所有的读和写操作设置超时值
COMMTIMEOUTS timeouts;
VERIFY(GetCommTimeouts(m_irPort, &timeouts));
timeouts.ReadIntervalTimeout = MAXDWORD;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 0;
timeouts.WriteTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 0;
VERIFY(SetCommTimeouts(m_irPort, &timeouts));
DWORD dwEvent=EV_TXEMPTY;
SetCommMask(m_irPort,dwEvent);
return TRUE;
}
BOOL CIrPulse::SendCode(DWORD lValue)
{
DWORD dwCount;
int i=0;
ASSERT(iDataLength>0);
//清除传送缓冲区
VERIFY(PurgeComm(m_irPort,PURGE_TXABORT PURGE_RXABORT PURGE_TXCLEAR PURGE_RXCLEAR));
//每次按键设置代码6次
for(int x=0;x<6;x++) {
MakeStream(lValue); //发送代码
dwCount=GetTickCount();
while(GetTickCount()<dwCount+26) //延迟26ms
i++;
}
return true;
}
BOOL CIrPulse::MakeStream(DWORD lValue) {
DWORD dwStreamLength;
//创建开始脉冲
dwStreamLength=iHPulse/charWidth;
ASSERT(Write((const char *)bPulseStream.GetData(),
dwStreamLength)==dwStreamLength);
// ************************************
// ***** 在下一个脉冲到来前延迟一段时间
// ************************************
//循环操作代码中的位来发送脉冲
for(int i=0;i<iDataLength;i++) {
if(lValue & 1) {
//创建一个脉冲1
dwStreamLength=i1Pulse/charWidth;
ASSERT(Write((const char *)bPulseStream.GetData(),
dwStreamLength)==dwStreamLength);
// *********************************
// ***在下一个脉冲到来前延迟一段时间
// *********************************
}
else {
//创建一个脉冲 0
dwStreamLength=i0Pulse/charWidth;
ASSERT(Write((const char *)bPulseStream.GetData(),
dwStreamLength)==dwStreamLength);
// ********************************
// **在下一个脉冲到来前延迟一段时间
// ********************************
}
lValue >>= 1;
}
return TRUE;
}
新闻热点
疑难解答