www.pudn.com > mod_rssim6.zip > RS232Port.h
///////////////////////////////////////////////////////////////////////////// // // FILE: RS232Port.cpp : headder file // // See _README.CPP // // interface for the CRS232Port class. // Requires MFC headder///////////////////////////////////////////////////////////////////////////// #if !defined(AFX_RS232PORT_H__19C837A9_9EB1_408D_83F7_6D85FDEF9739__INCLUDED_) #define AFX_RS232PORT_H__19C837A9_9EB1_408D_83F7_6D85FDEF9739__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 extern CHAR * GetLongComPortName(LPCTSTR portName, LPSTR newName); extern CHAR * FixComPortName(CHAR *portName); #define RSPORTCURRENTLY_VOID 0 #define RSPORTCURRENTLY_READING 1 #define RSPORTCURRENTLY_WRITTING 2 #define RSPORTCURRENTLY_CLOSING 3 #define RSPORTCURRENTLY_OPENING 4 #define RSPORTCURRENTLY_IDLE 5 // server thread states #define RS232_EX_PENDING 0 #define RS232_EX_SUSPENDED 1 #define RS232_EX_RUNNING 2 #define RS232_EX_TERMINATE 3 #define RS232_EX_TERMINATED 4 // # milliseconds to wait before discarding buffer contents #define PORT_MAX_IDLETIME 10000 //after 10 seconds, kill all chars in the buffer extern char commsParityStr[]; //NOPARITY ODDPARITY EVENPARITY MARKPARITY SPACEPARITY extern char commsStopStr[][4]; class CRS232Port : public CObject { public: DECLARE_DYNAMIC(CRS232Port) CRS232Port(); virtual ~CRS232Port(); BOOL OpenPort(LPCTSTR oPortName); BOOL ConfigurePort(DWORD baud, DWORD byteSize, DWORD parity, DWORD stopBits, DWORD rts, DWORD checkParity=TRUE); BOOL ClosePort(); BOOL Purge(); LONG Recieve(DWORD *numberOfBytesRead, CHAR* bufferPtr, CHAR* debugStrPtr); LONG Send(int numberOfBytestoWrite, const BYTE* bufferPtr, CHAR* debugStrPtr); // user must derive from this class and override this method. // virtual BOOL ProcessData(const CHAR *pBuffer, DWORD numBytes) = NULL; virtual void OnHWError(DWORD dwCommError); virtual BOOL OnProcessData(const CHAR *pBuffer, DWORD numBytes, BOOL *discardData) = NULL; // overridable notification functions virtual void RSStateChanged(DWORD state); virtual void RSDataDebugger(const BYTE * buffer, LONG length, BOOL transmit) = NULL; virtual void RSDataMessage(LPCTSTR msg) = NULL; void Poll(CHAR * debugStr); UINT friend AsyncFriend(LPVOID pParam); BOOL ReConfigurePort(); // diagnostic #ifdef _DEBUG VOID Dump(CDumpContext& dc) const; #endif public: CString portNameS; // short (display) port name CEvent m_threadStartupEvent; CEvent m_threadDeadEvent; CWinThread * m_pWorkerThread; DWORD m_debuggerStep; HANDLE h232Port; // a handle DWORD m_listenThreadStatus; BOOL m_masterHasWork; // if TRUE, then do not RX BOOL keepPolling; DWORD m_lastCharIncommingtime; private: CRITICAL_SECTION critSec; //sync object for this class CString portName; // long port name DCB dcb; // settings Device context block BYTE rxBuffer[1024]; //keep space for up to 2 messages DWORD rxBufferIndex; // index to past last usable byte (is also the length) }; #endif // !defined(AFX_RS232PORT_H__19C837A9_9EB1_408D_83F7_6D85FDEF9739__INCLUDED_)