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

📄 comport.cpp

📁 通过串口发送接受文件
💻 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 + -