RS232com

xiaoxiao2021-03-06  65

// 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);

转载请注明原文地址:https://www.9cbs.com/read-89619.html

New Post(0)