Advertisement
Guest User

Serial Port

a guest
Nov 1st, 2011
346
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.78 KB | None | 0 0
  1. //////////////////////////////////////////////HEADER///////////////////////////////////////
  2. #ifndef __RS232_H_
  3. #define __RS232_H_
  4. #include <windows.h>
  5.  
  6. class ComPort{
  7.   HANDLE hCom;
  8.   int opened;
  9. public:
  10.   ~ComPort();
  11.   ComPort();
  12.   int Init(const char * comPortStr,int speed, int byteSize = 8, int parity = 0, int stopBit = 0);
  13.   int SetBaudRate(int speed);
  14.   void Close ();
  15.   int Read(char * c,int num);
  16.   int GetStatus();
  17.   int Writef(char * str, ...);
  18.   int Write(char *c, int num);
  19.   int Write(char *c);
  20.   int Write(char c);
  21.   int SetRTS(int level);
  22.   int SetDTR(int level);
  23.   void ClearTxBuff();
  24.   void ClearRxBuff();
  25. };
  26. #endif
  27. ////////////////////////////////////////////////////////////////////////////////////////////
  28.  
  29. #include "rs232.h"
  30. #include <stdarg.h>
  31. #include <stdio.h>
  32.  
  33. void ComPort::ClearTxBuff(){
  34.   PurgeComm(hCom,PURGE_TXCLEAR);
  35. }
  36.  
  37. void ComPort::ClearRxBuff(){
  38.   PurgeComm(hCom,PURGE_RXCLEAR);
  39. }
  40.  
  41. int ComPort::SetBaudRate(int speed){
  42.   DCB dcb;
  43.   GetCommState( hCom, &dcb );
  44.   dcb.BaudRate = speed ;
  45.   if ( !SetCommState( hCom, &dcb ) ){
  46. //    CloseHandle(hCom);
  47.     return 1;//SetCommState error
  48.   }
  49.   return 0;
  50. }
  51.  
  52. int ComPort::GetStatus(){
  53.   unsigned int stat;
  54.   GetCommModemStatus(hCom, (LPDWORD)&stat);
  55.   return stat;
  56. }
  57.  
  58. int ComPort::SetRTS(int level){
  59.   DCB dcb;
  60.   GetCommState( hCom, &dcb );
  61.   dcb.fRtsControl = level ? RTS_CONTROL_ENABLE : RTS_CONTROL_DISABLE;
  62.   if ( !SetCommState( hCom, &dcb ) ){
  63. //    CloseHandle(hCom);
  64.     return 1;
  65.   }
  66.   return 0;
  67. }
  68.  
  69. int ComPort::SetDTR(int level){
  70.   DCB dcb;
  71.   GetCommState( hCom, &dcb );
  72.   dcb.fDtrControl = level ? DTR_CONTROL_ENABLE : DTR_CONTROL_DISABLE;
  73.   if ( !SetCommState( hCom, &dcb ) ){
  74. //    CloseHandle(hCom);
  75.     return 1;
  76.   }
  77.   return 0;
  78. }
  79.  
  80.  
  81. ComPort::~ComPort(){
  82.   Close();
  83.  
  84. }
  85.  
  86. ComPort::ComPort(){
  87.   opened = 0;
  88. }
  89.  
  90. int ComPort::Init(const char * comPortStr,int speed, int byteSize, int parity, int stopBit){
  91.   DCB dcb;
  92.  
  93.   COMMTIMEOUTS  CommTimeOuts ;
  94.   if ( ( hCom = CreateFile (comPortStr, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL ) )
  95.                == INVALID_HANDLE_VALUE   ) {
  96.      return 1; // error
  97.   }
  98.   CommTimeOuts.ReadIntervalTimeout = MAXDWORD;
  99.   CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
  100.   CommTimeOuts.ReadTotalTimeoutConstant = 0;
  101.   CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
  102.   CommTimeOuts.WriteTotalTimeoutConstant = 0;
  103.  
  104.   if ( !SetCommTimeouts( hCom, &CommTimeOuts )){
  105.     CloseHandle(hCom);
  106.     return 2; // SetCommTimeouts error
  107.   }
  108.  
  109.   dcb.DCBlength = sizeof ( DCB ) ;
  110.   dcb.BaudRate = speed ;
  111.   dcb.fBinary = TRUE ;
  112.   dcb.fParity = 0;
  113.   dcb.fOutxCtsFlow = 0;         // CTS output flow control
  114.   dcb.fOutxDsrFlow = 0;         // DSR output flow control
  115.   dcb.fDtrControl =  DTR_CONTROL_ENABLE;         // DTR flow control type
  116.  
  117.   dcb.fDsrSensitivity = 0;      // DSR sensitivity
  118.   dcb.fTXContinueOnXoff = 0;    // XOFF continues Tx
  119.   dcb.fOutX = 0;                // XON/XOFF output flow control
  120.   dcb.fInX = 0;                 // XON/XOFF input flow control
  121.  
  122.   dcb.fErrorChar = 0;           // enable error replacement
  123.   dcb.fNull = 0;                // enable null stripping
  124.   dcb.fRtsControl = RTS_CONTROL_ENABLE;          // RTS flow control
  125.  
  126.   dcb.fAbortOnError = 0;        // abort reads/writes on error
  127.   dcb.XonLim = 0;            // transmit XON threshold
  128.   dcb.XoffLim = 0;            // transmit XOFF threshold
  129.   dcb.ByteSize = byteSize;      // number of bits/byte, 4-8
  130.   dcb.Parity = parity;          // 0-4=no,odd,even,mark,space
  131.   dcb.StopBits = stopBit;       // 0,1,2 = 1, 1.5, 2
  132.   dcb.XonChar = 0;             // Tx and Rx XON character
  133.   dcb.XoffChar = 0;            // Tx and Rx XOFF character
  134.   dcb.ErrorChar = 0;            // error replacement character
  135.   dcb.EofChar = 0;              // end of input character
  136.   dcb.EvtChar = 0;              // received event character
  137.   if ( !SetCommState( hCom, &dcb ) ){
  138.     CloseHandle(hCom);
  139.     return 3;//SetCommState error
  140.   }
  141.   opened = 1;
  142.   return(0);
  143. }
  144.  
  145. void ComPort::Close (){
  146.   if (opened!=1) return;
  147.   opened = 0;
  148.   CloseHandle( hCom );
  149. }
  150.  
  151. int ComPort::Read(char * c,int num){
  152.   DWORD length = 0;
  153.   if( !ReadFile(hCom, c, num, &length, NULL) ) return 0;
  154.   return length;
  155. }
  156.  
  157. int ComPort::Write(char *c, int num){
  158.   DWORD length = 0;
  159.   WriteFile(hCom, c, num, &length, NULL);
  160.   return length;
  161. }
  162.  
  163. int ComPort::Write(char c){
  164.   DWORD length;
  165.   return WriteFile(hCom, &c, 1, &length, NULL);
  166. }
  167.  
  168. int ComPort::Write(char * c){
  169.   DWORD length;
  170.   int num = 0;
  171.   while (c[num]) num += 1;
  172.   return WriteFile(hCom, c, num, &length, NULL);
  173. }
  174.  
  175. int ComPort::Writef(char * str, ...){
  176.   char tmpStr[1024];
  177.   va_list args;
  178.   va_start (args, str);
  179.   vsprintf_s (tmpStr, 1024, str, args);
  180.   va_end (args);
  181.   return Write(tmpStr);
  182. }
  183.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement