// rs232com.h: interface for the crs232com class.////
#if! defined (AFX_RS232COM_H__B81A9E13_D764_42BB_AE18_3E296EF735C7__INCLUDED _) #DINE AFX_RS232COM_H__B81A9E13_D764_42BB_AE18_3E296EF735C7__included_
#if _MSC_VER> 1000 # prgma overce # endif //_MSC_VER> 1000
#include
#define FC_DTRDSR 0x01 # define FC_RTSCTS 0x02 # define FC_XONXOFF 0x04 # define ASCII_BEL 0x07 # define ASCII_BS 0x08 # define ASCII_LF 0x0A # define ASCII_CR 0x0D # define ASCII_XON 0x11 # define ASCII_XOFF 0x13
Class CRS232COM {public: CRS232com (); Virtual ~ CRS232com ();
BOOL Open (int NPORT = 1, int NBAUD = 9600); BOOL Close (Void);
Int ReadData (Void * Buffer, Int Limit); Int Senddata (Unsigned Char * Buffer, Int Size); int tentdatawaiting (void);
Bool isopened (void) {return (m_bopened);
Protected: bool writecommbyte; handle m_hidcomdev; overlapped m_overlapped, m_overlappened;};
#endif //! defined (AFX_RS232COM_H__B81A9E13_D764_42BB_AE18_3E296EF735C7__INCLUDED _) / **************************************** *********************************************************** ****************, CPP ************************************** *********************************************************** *************************** / / / RS232com.cpp: importation of the crs232com class.////
#include "stdafx.h" #include "rs232com.h"
//// construction / destruction //
CRS232com :: CRS232com () {MEMSET (& M_Overlapped, 0, Sizeof (Overlapped)); Memset (& M_OverlappedWrite, 0, Sizeof (overlapped);
m_hidcomdev = null; m_bopENed = false;}
CRS232com :: ~ CRS232com () {close ();
BOOL CRS232com :: Open (int nport, int nbaud) {
if (m_bOpened) return (TRUE); char szPort [15]; DCB dcb; wsprintf (szPort, "COM% d", nPort); m_hIDComDev = CreateFile (szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED , NULL); if (m_hIDComDev == NULL) return (FALSE); memset (& m_OverlappedRead, 0, sizeof (OVERLAPPED)); memset (& m_OverlappedWrite, 0, sizeof (OVERLAPPED)); COMMTIMEOUTS CommTimeOuts; CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF; CommTimeOuts .ReadTotalTimeoutMultiplier = 0; CommTimeOuts.ReadTotalTimeoutConstant = 0; CommTimeOuts.WriteTotalTimeoutMultiplier = 0; CommTimeOuts.WriteTotalTimeoutConstant = 5000; SetCommTimeouts (m_hIDComDev, & CommTimeOuts); m_OverlappedRead.hEvent = CreateEvent (NULL, TRUE, FALSE, NULL); m_OverlappedWrite.hEvent = CreateEvent (NULL, TRUE, FALSE, NULL); DCB.DCBLENGTH = SIZEOF (DCB); getcommstate (M_HIDCOMDEV, & DCB); dcb.baudrate = nbaud; dcb.bytesize = 8; unsigned char ucset; ucset = (unsigned char) ((unsigned char) FC_RTSCTS & FC _Dtrdsr)! = 0); ucset = (fc_rtscts & fc_rtscts)! = 0); ucset = (unsigned char) ((fc_rtscts & fc_xonxoff)! = 0);
if (!! SetCommState (m_hIDComDev, & dcb) || SetupComm (m_hIDComDev, 10000, 10000) || m_OverlappedRead.hEvent == NULL || m_OverlappedWrite.hEvent == NULL) {DWORD dwError = GetLastError (); if (m_OverlappedRead.hEvent ! = Null) CloseHandle (m_overlappedread.hevent); if (m_overlappedwrite.hevent! = Null) CloseHandle (m_overlappedwrite.hevent);
CloseHandle (M_HIDCOMDEV);
Return (false);} m_bopened = true; return (m_bopened);
Bool CRS232com :: close (void) {if (! M_bopened || m_hidcomdev == null) {return (true);}}} {closehandle (m_overlappedret hevent);
IF (m_overlappedwrite.hevent! = null) {closeHandle (m_overlappedwrite.hevent);}
CloseHandle (M_HIDCOMDEV);
m_bopened = false; m_hidcomdev = NULL;
Return (True);
INT CRS232COM :: readdata (void * buffer, int limit) {if (! m_bopened || m_hidcomdev == null) {return (0);
Bool Breadstatus; DWORD DWBYTESREAD, DWERRORFLAGS; Comst COMSTAT;
Clearcommorror (M_HidComDev, & dwerrorflags, & combst);
IF (! comStat.cbinque) {return (0);
DWBYTESREAD = (DWORD) COMSTAT.CBINQUE;
IF (Limit <(int) dwbytesread) {dwbytesread = (dword) limit;}
Breadstatus = Readfile (M_HidComDev, Buffer, DwbytesRead, & DwbytesRead, & m_overlapped ";
If (! BreadStatus) {IF (getLastError () == Error_io_pending) {WaitForsingleObject (m_overlappedread.hevent, 2000); return ((int) dwbytesread;}
Return (0);
Return ((int) dwbytesread;}
INT CRS232COM :: readdatawaiting (void) {if (! m_bopened || m_hidcomdev == null) {return (0);
DWORD DWERRORFLAGS; comStat Comstat;
Clearcommorror (M_HidComDev, & dwerrorflags, & combst);
Return ((int) comstat.cbinque;}
INT CRS232COM :: Senddata (unsigned char * buffer, int size) {if (! m_bopened || m_hidcomdev == null) {return (0);
DWORD DWBYTESWRITTEN = 0;
For (int i = 0; i Return ((int) dwbyteswritten;} Bool Crs232com :: WriteCommbyte (unsigned char ucbyte) {bool bwritestat; dword dwbyteswritten bWriteStat = WriteFile (m_hIDComDev, (LPSTR) & ucByte, 1, & dwBytesWritten, & m_OverlappedWrite); if (bWriteStat && (GetLastError () == ERROR_IO_PENDING)!) {if (WaitForSingleObject (m_OverlappedWrite.hEvent, 1000)) {dwBytesWritten = 0; } else { GetoverlappedResult (m_hidcomdev, & m_overlappedwrite, & dwbyteswritten, false); m_overlappedwrite.offset = dwbyteswritten;}} Return (True);