📄 comm.cpp
字号:
//Comm.cpp Rs232c烹脚阑 窍扁 困茄 努贰胶
#include "stdafx.h"
#include "comm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(CComm, CObject)
CComm::CComm( )
{
idComDev=NULL;
bFlowCtrl= FC_XONXOFF ;
fConnected = FALSE ;
}
CComm::~CComm( )
{
DestroyComm();
}
//BEGIN_MESSAGE_MAP(CComm, CObject)
//{{AFX_MSG_MAP(CComm)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
//END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CComm message handlers
//CommWatchProc()
//烹脚阑 窍绰 橇肺技历 溜 单捞鸥啊 甸绢吭阑措 皑矫窍绰
//风凭 夯风凭篮 OpenComPort 窃荐 角青矫 橇肺矫历肺 楷搬凳
//OpenComPort 窃荐 曼炼
DWORD CommWatchProc(LPVOID lpData)
{
DWORD dwEvtMask ;
OVERLAPPED os ;
CComm* npComm = (CComm*) lpData ;
char InData[MAXBLOCK + 1];
int nLength ;
//idCommDev 扼绰 勤甸俊 酒公繁 com 器飘啊 救嘿绢 勒栏搁
// 俊扼 府畔
if ( npComm == NULL ||
!npComm->IsKindOf( RUNTIME_CLASS( CComm ) ) )
return (DWORD)(-1);
memset( &os, 0, sizeof( OVERLAPPED ) ) ;
os.hEvent = CreateEvent( NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
NULL ) ; // no name
if ( os.hEvent == NULL )
{
MessageBox( NULL, "Failed to create event for thread!", "comm Error!",
MB_ICONEXCLAMATION | MB_OK ) ;
return ( FALSE ) ;
}
if (!SetCommMask(npComm->idComDev, EV_RXCHAR ))
return ( FALSE ) ;
while (npComm->fConnected )
{
dwEvtMask = 0 ;
WaitCommEvent(npComm->idComDev, &dwEvtMask, NULL );
if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
{
do
{
memset(InData,0,80);
if (nLength = npComm->ReadCommBlock((LPSTR) InData, MAXBLOCK ))
{
npComm->SetReadData(InData);
//捞镑俊辑 单捞鸥甫 罐绰促.
}
}
while ( nLength > 0 ) ;
}
}
CloseHandle( os.hEvent ) ;
return( TRUE ) ;
}
//单捞鸥甫 老绊 单捞鸥甫 佬菌促绰
//皋技瘤甫 府畔茄促.
void CComm::SetReadData(LPSTR data)
{
lstrcpy((LPSTR)abIn,(LPSTR)data);
//ConverData
//汲沥等 扩档快俊 WM_RECEIVEDATA皋技瘤甫
//朝妨林绢 泅力 单捞鸥啊 甸绢吭促绰巴阑
//舅妨霖促.
SendMessage(m_hwnd,WM_RECEIVEDATA,0,0);
}
//皋技瘤甫 傈崔且 hwnd汲沥
void CComm::SetHwnd(HWND hwnd)
{
m_hwnd=hwnd;
}
//哪器飘甫 汲沥茄促.
void CComm::SetComPort(int port,DWORD rate,BYTE bytesize,BYTE stop,BYTE parity)
{
bPort=port;
dwBaudRate=rate;
bByteSize=bytesize;
bStopBits=stop;
bParity=parity;
}
//XonOff 溜 府畔蔼 歹喉 汲沥
void CComm::SetXonOff(BOOL chk)
{
fXonXoff=chk;
}
void CComm::SetDtrRts(BYTE chk)
{
bFlowCtrl=chk;
}
//哪器飘 沥焊甫 父电促.
//捞巴阑 父甸锭 捞傈俊 且老捞
// SetComPort(); -> SetXonOff() ->SetDtrRts() 茄促澜 汲沥茄促.
BOOL CComm::CreateCommInfo()
{
osWrite.Offset = 0 ;
osWrite.OffsetHigh = 0 ;
osRead.Offset = 0 ;
osRead.OffsetHigh = 0 ;
//捞亥飘 芒备 汲沥
osRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ) ;
if (osRead.hEvent == NULL)
{
return FALSE ;
}
osWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ) ;
if (NULL == osWrite.hEvent)
{
CloseHandle( osRead.hEvent ) ;
return FALSE;
}
return TRUE ;
}
//com 器飘甫 凯绊 楷搬阑 矫档茄促.
//OpenComport()
BOOL CComm::OpenComPort( )
{
char szPort[ 15 ] ;
BOOL fRetVal ;
COMMTIMEOUTS CommTimeOuts ;
if (bPort > MAXPORTS)
lstrcpy( szPort, "\\\\.\\TELNET" ) ;
else
wsprintf( szPort, "COM%d", bPort ) ;
// COMM device甫 拳老屈侥栏肺 楷搬茄促.
if ((idComDev =
CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security attrs
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL |
FILE_FLAG_OVERLAPPED, // overlapped I/O
NULL )) == (HANDLE) -1 )
return ( FALSE ) ;
else
{
//哪器飘俊辑 单捞鸥甫 背券窍绰 规过阑 char窜困甫 扁夯栏肺 汲沥
//窍磊
SetCommMask( idComDev, EV_RXCHAR ) ;
SetupComm( idComDev, 4096, 4096 ) ;
//叼官捞胶俊 静饭扁啊 乐阑瘤 葛福聪鳖 柄昌捞 没家甫 窍磊!
PurgeComm( idComDev, PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;
CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0 ;
CommTimeOuts.WriteTotalTimeoutConstant = 1000 ;
SetCommTimeouts( idComDev, &CommTimeOuts ) ;
}
fRetVal = SetupConnection() ;
if (fRetVal)//楷搬捞 登菌促搁 fRetVal TRUE捞骨肺
{
fConnected = TRUE ;//楷搬登菌促绊 富秦淋
//橇肺矫傈甫 CommWatchProc俊 楷搬窍聪鳖 唱吝俊 单捞鸥啊 吭促艾促
//窍搁 葛电 郴侩篮 CommWatchProc啊 淬寸茄促.
AfxBeginThread((AFX_THREADPROC)CommWatchProc,(LPVOID)this);
}
else
{
fConnected = FALSE ;
CloseHandle( idComDev) ;
}
return ( fRetVal ) ;
}
//拳老肺 汲沥等 哪器飘客 角龙 器飘客 楷搬阑 矫挪促.
//SetupConnection 捞傈俊 CreateComPort甫 秦林绢具 茄促.
BOOL CComm::SetupConnection()
{
BOOL fRetVal ;
// BYTE bSet ;
DCB dcb ;
dcb.DCBlength = sizeof( DCB ) ;
GetCommState( idComDev, &dcb ) ;//dcb狼 扁夯蔼阑 罐绰促.
//捞何盒阑 荐沥秦具 钦聪促.
dcb.BaudRate = dwBaudRate;//傈价加档
dcb.ByteSize = bByteSize ;//单捞鸥厚飘
dcb.Parity = bParity;//菩府萍 眉农
dcb.StopBits = bStopBits;//胶砰厚瓢
dcb.fOutxDsrFlow =0 ;//Dsr Flow
dcb.fDtrControl = DTR_CONTROL_ENABLE ;//Dtr Control
dcb.fOutxCtsFlow = 0 ;//Cts Flow
dcb.fRtsControl = RTS_CONTROL_ENABLE ; //Ctr Control
dcb.fInX = dcb.fOutX = 1 ; //XON/XOFF 包茄巴
dcb.XonChar = ASCII_XON ;
dcb.XoffChar = ASCII_XOFF ;
dcb.XonLim = 100 ;
dcb.XoffLim = 100 ;
dcb.fBinary = TRUE ;
dcb.fParity = TRUE ;
dcb.fBinary = TRUE ;
dcb.fParity = TRUE ;
fRetVal = SetCommState( idComDev, &dcb ) ; //函版等 Dcb 汲沥
return ( fRetVal ) ;
}
//哪器飘肺 何磐 单捞鸥甫 佬绰促.
int CComm::ReadCommBlock(LPSTR lpszBlock, int nMaxLength )
{
BOOL fReadStat ;
COMSTAT ComStat ;
DWORD dwErrorFlags;
DWORD dwLength;
// only try to read number of bytes in queue
ClearCommError( idComDev, &dwErrorFlags, &ComStat ) ;
dwLength = min( (DWORD) nMaxLength, ComStat.cbInQue ) ;
if (dwLength > 0)
{
fReadStat = ReadFile( idComDev, lpszBlock,
dwLength, &dwLength, &osRead ) ;
if (!fReadStat)
{
//捞镑俊 俊扼甫 持绰巴捞促.
//溜 ReadFile 沁阑锭 单捞鸥啊 力措肺 救唱坷搁 fReadState俊 咯矾
//俊扼 内靛甫 府畔茄促. 捞锭 汗备且荐乐栏搁 亮瘤父 角龙利牢
//汗备啊 阂啊瓷窍促 蝶扼辑 犁价免阑 秦崔扼绰 皋技瘤甫 秦林绰巴捞
//亮促.
}
}
return ( dwLength ) ;
}
//哪器飘甫 肯傈洒 秦力茄促.
BOOL CComm::DestroyComm()
{
if (fConnected)
CloseConnection( ) ;
CloseHandle( osRead.hEvent ) ;
CloseHandle( osWrite.hEvent ) ;
return ( TRUE ) ;
}
//楷搬阑 摧绰促.
BOOL CComm::CloseConnection()
{
// set connected flag to FALSE
fConnected = FALSE ;
// disable event notification and wait for thread
// to halt
SetCommMask( idComDev, 0 ) ;
EscapeCommFunction( idComDev, CLRDTR ) ;
PurgeComm( idComDev, PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
CloseHandle( idComDev ) ;
return ( TRUE ) ;
}
BOOL CComm::WriteCommBlock( LPSTR lpByte , DWORD dwBytesToWrite)
{
BOOL fWriteStat ;
DWORD dwBytesWritten ;
fWriteStat = WriteFile( idComDev, lpByte, dwBytesToWrite,
&dwBytesWritten, &osWrite ) ;
if (!fWriteStat)
{
//哪器飘俊 单捞鸥甫 力措肺 结持瘤 给沁阑版快捞促.
//捞锭绰 绢痘霸 且鳖 弊巴篮 荤侩磊 付澜捞摆促.
//促矫 焊郴绊 酵栏搁 力蓖价免阑 窍搁 等促.
//弊矾唱 林狼痢 公茄 风橇甫 倒荐 乐促绰痢阑 积阿窍扼
}
return ( TRUE ) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -