?? rs232com.cpp
字號:
// *========================================================================*
// * (c) Copyright KYLINK COMMUNICATIONS CORP. 1998 *
// * Edited by Banjars Shen, 1998/07/01~1998/07/07 *
// *========================================================================*
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "RS232Com.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
static inline void ValidCtrCheck(RS232Com *)
{
new RS232Com(NULL);
}
//---------------------------------------------------------------------------
__fastcall RS232Com::RS232Com(TComponent* Owner)
: TComponent(Owner)
{
PortHandle=INVALID_HANDLE_VALUE;
FPortNumber=2;
FBaudRate=CBR_19200;
FDataBits=8;
FStopBits=ONESTOPBIT;
FParity=NOPARITY;
TempPortNumber=COM_2;
TempBaudRate=B_19200;
TempStopBits=One;
TempParity=NoParity;
}
//---------------------------------------------------------------------------
namespace Rs232com
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(RS232Com)};
RegisterComponents("KYLINK", classes, 0);
}
}
//---------------------------------------------------------------------------
// *****************************
// * RS232Com COM Port Destructor *
// *****************************
__fastcall RS232Com::~RS232Com()
{
this->Close();
}
//---------------------------------------------------------------------------
// ******************************************
// * Opens the COM Port, returns true if OK *
// ******************************************
bool __fastcall RS232Com::Open()
{
AnsiString Str_Com;
DCB dcbPort;
if (IsOpen())
Close();
Str_Com="COM"+IntToStr(FPortNumber);
PortHandle=CreateFile(Str_Com.c_str(),
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
long (0));
if (IsOpen())
{
if (GetCommState(PortHandle,&dcbPort))
{
dcbPort.BaudRate=FBaudRate;
dcbPort.ByteSize=FDataBits;
dcbPort.Parity=FParity;
dcbPort.StopBits=StopBits;
dcbPort.fAbortOnError=false;
dcbPort.fOutX=false;
dcbPort.fInX=false;
// Unsupported flag bit fields:
// dcb_Binary, dcb_Parity, dcb_OutxCtsFlow, dcb_fOutDsrFlow,
// dcb_fOutX , dcb_fInX , dcb_DtrFlow , dcb_RtsFlow
SetCommState(PortHandle,&dcbPort);
}
}
return (IsOpen());
}
//---------------------------------------------------------------------------
// *********************************
// * Return true if port is opened *
// *********************************
bool __fastcall RS232Com::IsOpen()
{
return (PortHandle!=INVALID_HANDLE_VALUE);
}
//---------------------------------------------------------------------------
// *********************************************************************
// * Write a string out the COM port, return true if all chars written *
// *********************************************************************
bool __fastcall RS232Com::Write(const BYTE* WriteDataPtr,const BYTE WriteLen)
{
unsigned long dwCharsWritten;
bool Result;
Result=false;
if (IsOpen())
{
dwCharsWritten=0;
WriteFile(PortHandle,WriteDataPtr,WriteLen,&dwCharsWritten,NULL);
if (dwCharsWritten==(unsigned long)WriteLen)
Result=true;
}
return Result;
}
//---------------------------------------------------------------------------
// **************************************************************
// * Reads a string from the port, puts it into sBuffer, return *
// * the number of characters read *
// **************************************************************
unsigned long __fastcall RS232Com::Read(BYTE *ReadDataPtr)
{
unsigned long ReadLen;
if (IsOpen())
{
if (CharsAvailable>0)
{
ReadFile(PortHandle,ReadDataPtr,CharsAvailable,&ReadLen,NULL);
}
}
return ReadLen;
}
//---------------------------------------------------------------------------
// *********************************************************
// * Flush the port by reading any characters in the queue *
// *********************************************************
void __fastcall RS232Com::Flush()
{
if (IsOpen())
PurgeComm(PortHandle,PURGE_TXABORT|PURGE_RXABORT|
PURGE_TXCLEAR|PURGE_RXCLEAR);
}
//---------------------------------------------------------------------------
// *****************************
// * Close the RS-232 COM Port *
// *****************************
void __fastcall RS232Com::Close()
{
if (IsOpen())
{
CloseHandle(PortHandle);
PortHandle=INVALID_HANDLE_VALUE;
}
}
//---------------------------------------------------------------------------
// *************************
// * Set the Port Property *
// *************************
void __fastcall RS232Com::SetPortNumber(COMPORT PortNumberToSet)
{
TempPortNumber=PortNumberToSet;
if (FPortNumber!=(COMPORT_VAL[PortNumberToSet]))
{
FPortNumber=COMPORT_VAL[PortNumberToSet];
if (IsOpen())
{
Close();
Open();
}
}
}
//---------------------------------------------------------------------------
// *****************************
// * Set the BaudRate Porperty *
// *****************************
void __fastcall RS232Com::SetBaudRate(BAUDRATE BaudRateToSet)
{
TempBaudRate=BaudRateToSet;
if (FBaudRate!=BAUDRATE_VAL[BaudRateToSet])
{
FBaudRate=BAUDRATE_VAL[BaudRateToSet];
if (IsOpen())
{
Close();
Open();
}
}
}
//---------------------------------------------------------------------------
// *****************************
// * Set the StopBits Property *
// *****************************
void __fastcall RS232Com::SetStopBits(STOPBITS StopBitsToSet)
{
TempStopBits=StopBitsToSet;
if (FStopBits!=STOPBITS_VAL[StopBitsToSet])
{
FStopBits=STOPBITS_VAL[StopBitsToSet];
if (IsOpen())
{
Close();
Open();
}
}
}
//---------------------------------------------------------------------------
// ***************************
// * Set the Parity Property *
// ***************************
void __fastcall RS232Com::SetParity(PARITY ParityToSet)
{
TempParity=ParityToSet;
if (FParity!=PARITY_VAL[ParityToSet])
{
FParity=PARITY_VAL[ParityToSet];
if (IsOpen())
{
Close();
Open();
}
}
}
//---------------------------------------------------------------------------
COMPORT __fastcall RS232Com::GetPortNumber()
{ return COMPORT(TempPortNumber); }
//---------------------------------------------------------------------------
BAUDRATE __fastcall RS232Com::GetBaudRate()
{ return BAUDRATE(TempBaudRate); }
//---------------------------------------------------------------------------
STOPBITS __fastcall RS232Com::GetStopBits()
{ return STOPBITS(TempStopBits); }
//---------------------------------------------------------------------------
PARITY __fastcall RS232Com::GetParity()
{ return PARITY(TempParity); }
//---------------------------------------------------------------------------
// ***************************************************
// * return the number of bytes waiting in the Queue *
// ***************************************************
long __fastcall RS232Com::IsRxData()
{
COMSTAT statPort;
unsigned long dwErrorCode;
CharsAvailable=0;
if (IsOpen())
{
ClearCommError(PortHandle,&dwErrorCode,&statPort);
CharsAvailable=statPort.cbInQue;
}
return CharsAvailable;
}
//---------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -