正在阅读:C++实现用掌上电脑遥控电视C++实现用掌上电脑遥控电视

2005-09-08 10:07 出处: 作者:朱先中编译 责任编辑:moningfeng

3. 实现过程分析

  这个CIrPulse类暴露了几个函数,它们使得发送IR代码尽可能容易。在声明CIrPulse类时,你应该调用一次FindIrPort(),它返回一个描述IrDA端口的端口号的UINT,这通过搜索注册表得到。这个端口号用于后面的调用来打开IrDA端口进行串行通讯。

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;
}


  得到端口号后,你可以调用Open(UINT)函数,把通过调用FindIrPort()得到的端口号传递过去。这打开该端口并设置串口参数,如果成功返回true。该端口被设置为115200波特,8个数据位,2个停止位和奇偶校验位。关于如何产生载波以及为什么我使用这些设置将在本文后面介绍。

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_TXABORT|PURGE_RXABORT|
 PURGE_TXCLEAR|PURGE_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;
}

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品