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

📄 rs232.h

📁 尽量朝“单片”方向设计硬件系统。系统器件越多
💻 H
字号:

#ifndef __RS232_H__
#define __RS232_H__

#include <stdio.h>
#include <mem.h>
#include <winbase.h>

class RS232 {
   private:
      HANDLE Comdrv;
      DWORD Baudrate(long baudrate);
   public:
      int Open(char *name,int Insize,int Outsize,long baudrate);
      int Close(void);
      int Clear(void);
      int ClearIn(void);
      int Length(void);
      DWORD ModemStatus(void);
      int Read(char *buffer,int len);
      int Write(char *buffer,int len);
};

DWORD RS232::Baudrate(long baudrate)
{
   switch (baudrate)
   {  case 110    : return CBR_110;
      case 300    : return CBR_300;
      case 600    : return CBR_600;
      case 1200   : return CBR_1200;
      case 2400   : return CBR_2400;
      case 4800   : return CBR_4800;
      case 9600   : return CBR_9600;
      case 14400  : return CBR_14400;
      case 19200  : return CBR_19200;
      case 38400  : return CBR_38400;
      case 56000  : return CBR_56000;
      case 57600  : return CBR_57600;
      case 115200 : return CBR_115200;
      case 128000 : return CBR_128000;
      case 256000 : return CBR_256000;
   }
   return baudrate;
}

DWORD RS232::ModemStatus(void)
{
   DWORD stat;
   if(GetCommModemStatus(Comdrv,&stat))
      return stat;
   return 0L;
}

int RS232::Length(void)
{
   COMSTAT comstate;
   DWORD   error;
   ClearCommError(Comdrv,&error,&comstate);
   if(error==0)
      return (int)comstate.cbInQue;
   return -1;
}

int RS232::Open(char *name,int Insize,int Outsize,long baudrate)
{
   COMMTIMEOUTS commtmout;
   DCB          comdcb;
   Comdrv = CreateFile(name,GENERIC_READ+GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
   if(Comdrv==INVALID_HANDLE_VALUE)
      return 0;
   SetCommMask(Comdrv,EV_RXCHAR);
   SetupComm(Comdrv,Insize,Outsize);
   commtmout.ReadIntervalTimeout=0xFFFFFFFF;
   commtmout.ReadTotalTimeoutMultiplier=0;
   commtmout.ReadTotalTimeoutConstant=0;
   commtmout.WriteTotalTimeoutMultiplier=0;
   commtmout.WriteTotalTimeoutConstant=5000;
   SetCommTimeouts(Comdrv,&commtmout);
   GetCommState(Comdrv,&comdcb);
   char comm_params[100];
   sprintf(comm_params,"%s: baud=%d parity=N data=8 stop=1",name,baudrate);
   BuildCommDCB(comm_params,&comdcb);
   SetCommState(Comdrv,&comdcb);
   return 1;
}

int RS232::Close(void)
{
   if (CloseHandle(Comdrv))
      return 1;
   return 0;
}

int RS232::Read(char *buffer,int len)
{
   DWORD nread;
   if (ReadFile(Comdrv,buffer,len,&nread,NULL))
      return (int)nread;
   return -1;
}

int RS232::Write(char *buffer,int len)
{
   DWORD nwrite;
   if (WriteFile(Comdrv,buffer,len,&nwrite,NULL))
      return (int)nwrite;
   return -1;
}

int RS232::Clear(void)
{
   if (PurgeComm(Comdrv,PURGE_TXCLEAR|PURGE_RXCLEAR))
      return 1;
   return 0;
}

int RS232::ClearIn(void)
{
   if (PurgeComm(Comdrv,PURGE_RXCLEAR))
      return 1;
   return 0;
}

#pragma pack()
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -