📄 comport.cpp
字号:
// ComPort.cpp: implementation of the CComPort class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "vt100.h"
#include "ComPort.h"
#include "cfgfile.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define WM_DATAARRIVAL (WM_USER+1)
#define WM_COMMERROR (WM_USER+2)
//超时
#define TIMEOUT 10
//串口设备类型
extern int iComDev; // 0:透明方式 1:密码键盘 2:磁条读写器 3:打印机
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CComPort::CComPort()
{
m_hCommHnd=NULL;
m_dwOffset=0;
}
CComPort::~CComPort()
{
}
int CComPort::InitCom(char *pszPortName)
{
DCB dcb;
BOOL blSetOk;
int iBaudRate,iByteSize,iParity,iStopBit;
CCfgFile csCfgFile;
COMMTIMEOUTS CommTimeouts;
int iPortNum;
if (m_pOwnerWnd==NULL){
return 1;
}
//获取串口设备类型
iPortNum=pszPortName[3]-49;
iComDev=csCfgFile.GetCfgItemInt(COM1DEV+iPortNum);
//透明方式
if(iComDev==0){
if(m_blIsRcvThreadActive||m_blIsSndThreadActive)
return 0;
//set device type
m_iDevType=1;
}
//Get parameter from config file
iBaudRate=csCfgFile.GetCfgItemInt(BAUDRATE);
iByteSize=csCfgFile.GetCfgItemInt(BYTESIZE);
iParity=csCfgFile.GetCfgItemInt(PARITY);
iStopBit=csCfgFile.GetCfgItemInt(STOPBIT);
//initial Comm Port
#ifdef UNICODE
TCHAR wcPortName[10];
mbstowcs(wcPortName,pszPortName,sizeof(wcPortName));
m_hCommHnd=CreateFile(wcPortName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,NULL,NULL);
#else
m_hCommHnd=CreateFile(pszPortName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,NULL,NULL);
#endif
if(m_hCommHnd==INVALID_HANDLE_VALUE)
return 2;
blSetOk = GetCommState(m_hCommHnd,&dcb);
if(!blSetOk) {
CloseHandle(m_hCommHnd);
return 3;
}
/* dcb.BaudRate = iBaudRate;
dcb.ByteSize = iByteSize;
dcb.Parity = iParity;
dcb.StopBits = iStopBit;
dcb.fDtrControl = DTR_CONTROL_ENABLE;
*/
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.StopBits = 0;
dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fInX=0;
dcb.fOutX=0;
if(iComDev==3){
dcb.Parity = EVENPARITY;
dcb.fNull=FALSE;
dcb.fRtsControl=RTS_CONTROL_HANDSHAKE;
}
else{
dcb.Parity = NOPARITY;
dcb.fNull=TRUE;
dcb.fRtsControl=RTS_CONTROL_DISABLE;
}
blSetOk=SetCommState(m_hCommHnd,&dcb);
if(!blSetOk) {
CloseHandle(m_hCommHnd);
return 4;
}
//time out
GetCommTimeouts(m_hCommHnd,&CommTimeouts);
memset(&CommTimeouts,0,sizeof(CommTimeouts));
if(iComDev==0){
CommTimeouts.ReadIntervalTimeout=MAXDWORD;
}
else{
CommTimeouts.ReadTotalTimeoutMultiplier= TIMEOUT;
CommTimeouts.ReadTotalTimeoutConstant =TIMEOUT;
CommTimeouts.ReadIntervalTimeout=TIMEOUT;
}
SetCommTimeouts(m_hCommHnd,&CommTimeouts);
//透明方式
if(iComDev==0){
//create stop evnet
/* m_hStopEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
//create send request event
m_hSendDataEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
*/
m_blIsRcvThreadActive=FALSE;
m_blIsSndThreadActive=FALSE;
//create Rcv thread
DWORD dwRcvId;
if((m_pRcvThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)RcvThread,this,0,&dwRcvId))==NULL){
return 5;
}
//create Snd thread
/* DWORD dwSndId;
if(CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)SndThread,this,0,&dwSndId)==NULL){
return 6;
}
*/
//wait until started
while(!m_blIsRcvThreadActive){
Sleep(10);
}
/* while(!m_blIsSndThreadActive){
Sleep(10);
}
*/
}
return 0;
}
int CComPort::InitCom(char *pszPortName,int iBaudRate,int iParity,int iByteSize,int iStopBit)
{
DCB dcb;
BOOL blSetOk;
CCfgFile csCfgFile;
COMMTIMEOUTS CommTimeouts;
int iPortNum;
if (m_pOwnerWnd==NULL){
return 1;
}
//获取串口设备类型
iPortNum=pszPortName[3]-49;
iComDev=csCfgFile.GetCfgItemInt(COM1DEV+iPortNum);
//透明方式
if(iComDev==0){
if(m_blIsRcvThreadActive||m_blIsSndThreadActive)
return 0;
//set device type
m_iDevType=1;
}
//initial Comm Port
#ifdef UNICODE
TCHAR wcPortName[10];
mbstowcs(wcPortName,pszPortName,sizeof(wcPortName));
m_hCommHnd=CreateFile(wcPortName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,NULL,NULL);
#else
m_hCommHnd=CreateFile(pszPortName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,NULL,NULL);
#endif
if(m_hCommHnd==INVALID_HANDLE_VALUE)
return 2;
blSetOk = GetCommState(m_hCommHnd,&dcb);
if(!blSetOk) {
CloseHandle(m_hCommHnd);
return 3;
}
dcb.BaudRate = iBaudRate;
dcb.ByteSize = iByteSize;
// dcb.Parity = iParity;
dcb.StopBits = iStopBit;
dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fInX=0;
dcb.fOutX=0;
/* dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = 0;
dcb.StopBits = 0;
dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fInX=0;
dcb.fOutX=0;
*/
//prt
if(iComDev==3){
dcb.Parity = EVENPARITY;
dcb.fNull=FALSE;
dcb.fRtsControl=RTS_CONTROL_HANDSHAKE;
}
else{
dcb.Parity = NOPARITY;
dcb.fNull=TRUE;
dcb.fRtsControl=RTS_CONTROL_DISABLE;
}
blSetOk=SetCommState(m_hCommHnd,&dcb);
if(!blSetOk) {
CloseHandle(m_hCommHnd);
return 4;
}
//time out
GetCommTimeouts(m_hCommHnd,&CommTimeouts);
memset(&CommTimeouts,0,sizeof(CommTimeouts));
if(iComDev==0){
CommTimeouts.ReadIntervalTimeout=MAXDWORD;
}
else{
CommTimeouts.ReadTotalTimeoutMultiplier= TIMEOUT;
CommTimeouts.ReadTotalTimeoutConstant =TIMEOUT;
CommTimeouts.ReadIntervalTimeout=TIMEOUT;
}
SetCommTimeouts(m_hCommHnd,&CommTimeouts);
//透明方式
if(iComDev==0){
//create stop evnet
/* m_hStopEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
//create send request event
m_hSendDataEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
*/
m_blIsRcvThreadActive=FALSE;
m_blIsSndThreadActive=FALSE;
//create Rcv thread
DWORD dwRcvId;
if((m_pRcvThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)RcvThread,this,0,&dwRcvId))==NULL){
return 5;
}
//create Snd thread
/* DWORD dwSndId;
if(CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)SndThread,this,0,&dwSndId)==NULL){
return 6;
}
*/
//wait until started
while(!m_blIsRcvThreadActive){
Sleep(10);
}
/* while(!m_blIsSndThreadActive){
Sleep(10);
}
*/
}
return 0;
}
UINT CComPort::RcvThread(LPVOID pParam)
{
int iRetCode,iLoop;
char szTemp[100];
CCommunicate *pMyClass=(CCommunicate *)pParam;
pMyClass->m_blIsRcvThreadActive=TRUE;
iLoop=1;
while(iLoop==1){
memset(pMyClass->m_szDataBuf,0,sizeof(pMyClass->m_szDataBuf));
iRetCode=ReadFile(((CComPort *)pMyClass)->m_hCommHnd,pMyClass->m_szDataBuf,1,&(pMyClass->m_dwLen),NULL);
if(iRetCode<=0){
iRetCode=GetLastError();
if(iRetCode!=6){
sprintf(szTemp,"Rcv Error, error code=%d",iRetCode);
csLog.WriteLog(0, ((CComPort *)pMyClass)->m_iDevType,szTemp,0);
PostMessage(pMyClass->m_pOwnerWnd,WM_COMMERROR,((CComPort *)pMyClass)->m_iDevType,1);
}
break;
}
else{
if(pMyClass->m_dwLen!=0){
csLog.WriteLog(0,((CComPort *)pMyClass)->m_iDevType,pMyClass->m_szDataBuf, pMyClass->m_dwLen);
SendMessage(pMyClass->m_pOwnerWnd,WM_DATAARRIVAL,((CComPort *)pMyClass)->m_iDevType,0);
}
else{
Sleep(100);
}
}
}
pMyClass->m_blIsRcvThreadActive=FALSE;
return 0;
}
UINT CComPort::SndThread(LPVOID pParam)
{
HANDLE hEventGroup[3];
int iRetCode,iLoop;
DWORD dwSendLen;
CCommunicate *pMyClass=(CCommunicate *)pParam;
memset(hEventGroup,0,sizeof(HANDLE)*3);
hEventGroup[0]=pMyClass->m_hSendDataEvent;
hEventGroup[1]=pMyClass->m_hStopEvent;
pMyClass->m_blIsSndThreadActive=TRUE;
iLoop=1;
while(iLoop==1){
iRetCode=WaitForMultipleObjects(2,hEventGroup,FALSE,-1);
switch(iRetCode){
case WAIT_OBJECT_0: //Send data request
ResetEvent(hEventGroup[0]);
iRetCode=WriteFile(((CComPort *)pMyClass)->m_hCommHnd,pMyClass->m_szSendBuf,pMyClass->m_dwSendLen,&dwSendLen,NULL);
if(iRetCode<=0){
PostMessage(pMyClass->m_pOwnerWnd,WM_COMMERROR,2,1);
iLoop=0;
}
break;
case WAIT_OBJECT_0+1: //stop event
ResetEvent(hEventGroup[1]);
iLoop=0;
break;
default:
PostMessage(pMyClass->m_pOwnerWnd,WM_COMMERROR,2,0);
iLoop=0;
break;
}
}
pMyClass->m_blIsSndThreadActive=FALSE;
return 0;
}
int CComPort::RcvData(char *pszDataBuf, DWORD *pdwLen)
{
int iRetCode;
char szTemp[100];
iRetCode=ReadFile(m_hCommHnd,pszDataBuf,50,pdwLen,NULL);
if(iRetCode==0||(*pdwLen==0)){
sprintf(szTemp,"Rcv error,error code=%d",GetLastError());
csLog.WriteLog(0,1,szTemp,0);
return 1;
}
csLog.WriteLog(0,1,pszDataBuf,*pdwLen);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -