ircomm.cpp

来自「evc开发的基于WINCE3。0的手持打印机的驱动软件」· C++ 代码 · 共 184 行

CPP
184
字号
/*************************************************************************
WINCE 上使用IrCOMM和原始Ir的函数库
**************************************************************************/
#include "stdAfx.h"
#include "Ircomm.h"

#define MAXRXBUFFER 4096

static HANDLE hPort = INVALID_HANDLE_VALUE;
static int bStopThread, bCommEnabled;
static TCHAR szPort[6], sztmp[64];

/*************************************************************************
static int FindIrCommPort(void)
从系统注册表中读出IrCOMM的端口名,并将其写入全局变量szPort
返回:	0 成功读取IrComm端口号
	1 读取IrCOMM端口号失败
不同型号的POCKET PC可能得到IrCOMM端口号的方法不同,但都可以从注册表中找到
本函数在神达338上调试通过
**************************************************************************/
static int FindIrCommPort(void)
{
  DWORD dwSize, dwData, dwType;
  HKEY hKey;

  *szPort = 0;

//
  if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("Drivers\\BuiltIn\\IrCOMM"),0,0,&hKey) == ERROR_SUCCESS)
  {
    dwSize = sizeof(dwData);

    if(RegQueryValueEx(hKey,TEXT("Index"),0,&dwType,(BYTE*)&dwData,&dwSize) == ERROR_SUCCESS)
      if(dwData < 10)
        wsprintf(szPort,TEXT("COM%d:"),dwData);

    RegCloseKey(hKey);
    return 0;
  }
  return 1;
}

/*************************************************************************
static int FindIrPort(void)
将原始Ir端口名写入全局变量szPort
不同型号的POCKET PC原始Ir端口可能不同,但都可以从注册表中找到,也可以咨询POCKET PC设备供应商
本函数在神达338上调试通过
**************************************************************************/
static int FindIrPort(void)
{
  wsprintf(szPort,TEXT("COM4:"));
  return 0;
}

/*************************************************************************
void WriteComm(unsigned char *ch, DWORD len)
向由全局变量hPort端口句柄定义的端口写入字符串
**************************************************************************/
void WriteComm(unsigned char *ch, DWORD len)
{
  DWORD n;
  WriteFile(hPort,(char *)ch,len,&n,0);
}

/*************************************************************************
BOOL OpenComm(int IrFlag,int Baudrate)
打开红外端口。
参数:	int IrFlag:	0 打开IrCOMM
			1 打开原始Ir
	int Baudrate	波特率
返回:	TRUE 成功
	FALSE 失败
**************************************************************************/
BOOL OpenComm(int IrFlag,int Baudrate)
{
  DCB PortDCB;
  COMMTIMEOUTS CommTimeouts;
  DWORD baud;
  

//判断红外端口是否已经打开
  if(bCommEnabled)
  {   MessageBox(NULL,TEXT(" IrComm port is already opened! "),TEXT("WARNNING"),MB_OK);
  return 0;}

//int IrFlag:	0 打开IrCOMM
//		1 打开原始Ir

if(IrFlag==0)//IrComm
  if(FindIrCommPort())
    return 0;
if(IrFlag==1)//RAW-IR(原始IR)
  if(FindIrPort())
    return 0;

//设置波特率参数
switch(Baudrate)
	{
case 9600:
	baud=CBR_9600;
	break;
case 19200:
	baud=CBR_19200;
	break;
case 38400:
	baud=CBR_38400;
	break;
case 57600:
	baud=CBR_57600;
	break;
case 115200:
	baud=CBR_115200;
	break;
default:
        break;
	}

//打开红外端口,
  hPort = CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

//打开失败
  if(hPort == INVALID_HANDLE_VALUE) 
  {
    MessageBox(NULL,TEXT("Can not open Ir port"),TEXT("Erorr"),MB_OK);
    return 0;
  }


//设置端口参数
  PortDCB.DCBlength = sizeof(DCB);
  GetCommState(hPort, &PortDCB);
  PortDCB.BaudRate = baud;
  PortDCB.fBinary = TRUE;
  PortDCB.fParity = TRUE;

  PortDCB.fOutxCtsFlow = FALSE;    // ignore possible hangups
  PortDCB.fOutxDsrFlow = FALSE;    // don't wait on the DSR line
  PortDCB.fDtrControl = DTR_CONTROL_DISABLE;
  PortDCB.fDsrSensitivity = FALSE;
  PortDCB.fTXContinueOnXoff = FALSE;
  PortDCB.fOutX = FALSE;           // no XON/XOFF control 
  PortDCB.fInX = FALSE;
  PortDCB.fErrorChar = FALSE;
  PortDCB.fNull = FALSE;
  PortDCB.fRtsControl = RTS_CONTROL_DISABLE;
  PortDCB.fAbortOnError = FALSE;
  PortDCB.ByteSize = 8; 
  PortDCB.Parity = NOPARITY;
  PortDCB.StopBits = ONESTOPBIT; 
  SetCommState(hPort, &PortDCB); 

//端口数据接收/发送超时设置
  GetCommTimeouts(hPort, &CommTimeouts);
  CommTimeouts.ReadIntervalTimeout = 1000;
  CommTimeouts.ReadTotalTimeoutMultiplier = 0;
  CommTimeouts.ReadTotalTimeoutConstant = 3000;
  CommTimeouts.WriteTotalTimeoutMultiplier = 0;
  CommTimeouts.WriteTotalTimeoutConstant = 3000;
  SetCommTimeouts(hPort, &CommTimeouts);

//将端口设为红外模式:注意,因为POCKET PC的硬件资源较少,
//所以红外实际上使用的是RS232C的串口硬件,在打开串口之后,
//缺省打开的串口可能是RS232口,所以需使用此函数EscapeCommFunction以启动红外
  EscapeCommFunction(hPort, SETIR);

//设置端口打开标志
bCommEnabled = TRUE;
  return 1;
}

/*************************************************************************
void CloseComm(void)
关闭红外端口。
**************************************************************************/
void CloseComm(void)
{
  if(bCommEnabled)
  {
    bStopThread = TRUE;
    CloseHandle(hPort);
    Sleep(1000);
    bCommEnabled = FALSE;
  }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?