⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs232com.cpp

📁 RS232串口通信编程
💻 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 + -