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 + -
显示快捷键?