📄 comport.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "COMPORT.h"
#include "Message.h"
#include <dos.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
TComport::TComport(void)
{
Port=1;
BaudRate=9600;
strcpy( DeviceName,"COM1" );
Handle=NULL;
Opened=False;
memset( &CommConfig,0,sizeof(CommConfig) );
CommConfig.dwSize=0;
UseIrDA=False;
}
TComport::~TComport(void)
{
Close();
}
bool TComport::Open(void)
{
if( Opened==True )Close();
switch( Port )
{
case 1:strcpy( DeviceName,"COM1" );break;
case 2:strcpy( DeviceName,"COM2" );break;
case 3:strcpy( DeviceName,"COM3" );break;
case 4:strcpy( DeviceName,"COM4" );break;
case 5:strcpy( DeviceName,"COM5" );break;
case 6:strcpy( DeviceName,"COM6" );break;
case 7:strcpy( DeviceName,"COM7" );break;
case 8:strcpy( DeviceName,"COM8" );break;
default:goto Error;
};
Handle=CreateFile(DeviceName,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_ARCHIVE,
NULL);
if( Handle==NULL )goto Error;
dwSize=sizeof( COMMCONFIG );
if( CommConfig.dwSize==0 )
{
CommConfig.dwSize=dwSize;
if( GetCommConfig( Handle,&CommConfig,&dwSize )==False )goto Error;
};
if( SetupComm( Handle,4096,4096 )==False )goto Error;
if( UseIrDA==True )
{
CommConfig.dcb.BaudRate = 9600;
if( SetCommState( Handle,&CommConfig.dcb )==False )goto Error;
frmMessage->Show();
frmMessage->ShowMessage("正在初始化红外头(irDA).....");
InitIrDA();
frmMessage->Close();
CommConfig.dcb.BaudRate = BaudRate;
if( SetCommState( Handle,&CommConfig.dcb )==False )goto Error;
}
else
{
CommConfig.dcb.BaudRate = BaudRate;
if( SetCommState( Handle,&CommConfig.dcb )==False )goto Error;
}
ClearInputBuf();
ClearOutputBuf();
Opened = True;
return True;
Error:
Close();
return False;
}
void TComport::Close(void)
{
if( Handle!=NULL )CloseHandle(Handle);
Opened=False;
}
int TComport::WriteChar( char ch,int timeout )
{
COMMTIMEOUTS CommTimeOuts;
DWORD n;
DWORD comtimeout;
if( timeout<0 ){ comtimeout=0xffff; }
else { comtimeout=timeout; };
CommTimeOuts.ReadIntervalTimeout = comtimeout;
CommTimeOuts.ReadTotalTimeoutMultiplier = 1;
CommTimeOuts.ReadTotalTimeoutConstant = comtimeout;
CommTimeOuts.WriteTotalTimeoutMultiplier = 1;
CommTimeOuts.WriteTotalTimeoutConstant = comtimeout;
if( SetCommTimeouts( Handle,&CommTimeOuts )==False )return -2;
if( WriteFile( Handle,&ch,1,&n,NULL )==False )return -1;
if( n!=1 )return -1;
return 0;
}
int TComport::WriteStr( char *buf,int len,int timeout )
{
COMMTIMEOUTS CommTimeOuts;
DWORD n;
DWORD comtimeout;
if( timeout<0 ){ comtimeout=0xffff; }
else { comtimeout=timeout; };
CommTimeOuts.ReadIntervalTimeout = comtimeout;
CommTimeOuts.ReadTotalTimeoutMultiplier = 1;
CommTimeOuts.ReadTotalTimeoutConstant = comtimeout;
CommTimeOuts.WriteTotalTimeoutMultiplier = 1;
CommTimeOuts.WriteTotalTimeoutConstant = comtimeout;
if( SetCommTimeouts( Handle,&CommTimeOuts )==False )return -2;
if( WriteFile( Handle,buf,len,&n,NULL )==False )return -1;
if( n!=(unsigned)len )return -1;
return 0;
}
int TComport::ReadChar( char *ch,int timeout )
{
COMMTIMEOUTS CommTimeOuts;
DWORD n;
DWORD comtimeout;
if( timeout<0 ){ comtimeout=0xffff; }
else { comtimeout=timeout; };
CommTimeOuts.ReadIntervalTimeout = comtimeout;
CommTimeOuts.ReadTotalTimeoutMultiplier = 1;
CommTimeOuts.ReadTotalTimeoutConstant = comtimeout;
CommTimeOuts.WriteTotalTimeoutMultiplier = 1;
CommTimeOuts.WriteTotalTimeoutConstant = comtimeout;
if( SetCommTimeouts( Handle,&CommTimeOuts )==False )return -2;
if( ReadFile( Handle,ch,1,&n,NULL )==False )return -1;
if( n!=1 )
return -1;
return 0;
}
bool TComport::Write(char *buf,int len)
{
DWORD n;
if( Opened==false )return false;
if( WriteFile( Handle,buf,len,&n,NULL )==False )return false;
if( n!=DWORD(len) )return false;
return true;
}
int TComport::Read(char *ch)
{
DWORD n;
if( Opened==false )return -1;
if( ReadFile( Handle,ch,1,&n,NULL )==false )return -1;
if( n!=1 )return -1;
return 0;
}
void TComport::ClearInputBuf(void)
{
PurgeComm( Handle,PURGE_RXABORT|PURGE_RXCLEAR);
}
void TComport::ClearOutputBuf(void)
{
PurgeComm( Handle,PURGE_TXABORT|PURGE_TXCLEAR);
}
void TComport::SetDtr(int value)
{
if( value==0 ){ EscapeCommFunction(Handle,CLRDTR); }
else { EscapeCommFunction(Handle,SETDTR); };
}
void TComport::SetRts(int value)
{
if( value==0 ){ EscapeCommFunction(Handle,CLRRTS); }
else { EscapeCommFunction(Handle,SETRTS); };
}
void TComport::delay( int milliseconds )
{
Sleep( milliseconds );
}
int TComport::InitIrDA(void)
{
char ch;
unsigned long n;
long baudrate;
baudrate=BaudRate;
switch( baudrate )
{
case 115200: ch=0x10;break;
case 57600: ch=0x11;break;
case 38400: ch=0x12;break;
case 19200: ch=0x13;break;
case 9600: ch=0x14;break;
case 2400: ch=0x18;break;
default: return -1;
};
SetDtr(1);
SetRts(0);
delay(200);
WriteFile( Handle,&ch,1,&n,NULL );
delay(10);
SetRts(1);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -