智能家居安防系统设计毕业论文-智能小区安防系统设计论文 下载本文

基于无线传感器网络的智能家居安防系统初步构建

//-----------------------串口操作类CZdx_Port.cpp------------------------------------ #include \#include \#include

CZdx_Port::CZdx_Port() { m_hComm = NULL; // initialize overlapped structure members to zero m_ov.Offset = 0; m_ov.OffsetHigh = 0; // create events m_ov.hEvent = NULL; m_hWriteEvent = NULL; m_hShutdownEvent = NULL; m_szWriteBuffer = NULL; m_nWriteSize=1; m_bThreadAlive = FALSE; }

// Delete dynamic memory CZdx_Port::~CZdx_Port() { do { SetEvent(m_hShutdownEvent); } while (m_bThreadAlive); // if the port is still opened: close it if (m_hComm != NULL) { CloseHandle(m_hComm); m_hComm = NULL; } // Close Handles if(m_hShutdownEvent!=NULL) CloseHandle( m_hShutdownEvent); if(m_ov.hEvent!=NULL) CloseHandle( m_ov.hEvent ); if(m_hWriteEvent!=NULL) CloseHandle( m_hWriteEvent ); TRACE(\ delete [] m_szWriteBuffer; }

// Initialize the port. This can be port 1 to 4.

BOOL CZdx_Port::InitPort(CWnd* pPortOwner, // the owner (CWnd) of the port (receives message) UINT portnr, // portnumber (1..4) UINT baud, // baudrate char parity, // parity UINT databits, // databits UINT stopbits, // stopbits DWORD dwCommEvents, // EV_RXCHAR, EV_CTS etc UINT writebuffersize) // size to the writebuffer { assert(portnr > 0 && portnr < 5); assert(pPortOwner != NULL); // if the thread is alive: Kill

- 48 -

浙江理工大学信息电子学院本科毕业论文

if (m_bThreadAlive) { do { SetEvent(m_hShutdownEvent); } while (m_bThreadAlive); TRACE(\ } // create events if (m_ov.hEvent != NULL) ResetEvent(m_ov.hEvent); else m_ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (m_hWriteEvent != NULL) ResetEvent(m_hWriteEvent); else m_hWriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (m_hShutdownEvent != NULL) ResetEvent(m_hShutdownEvent); else m_hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // initialize the event objects m_hEventArray[0] = m_hShutdownEvent; // highest priority m_hEventArray[1] = m_ov.hEvent; m_hEventArray[2] = m_hWriteEvent; // initialize critical section InitializeCriticalSection(&m_csCommunicationSync); // set buffersize for writing and save the owner m_pOwner = pPortOwner; if (m_szWriteBuffer != NULL) delete [] m_szWriteBuffer; m_szWriteBuffer = new char[writebuffersize]; m_nPortNr = portnr; m_nWriteBufferSize = writebuffersize; m_dwCommEvents = dwCommEvents; BOOL bResult = FALSE; char *szPort = new char[50]; char *szBaud = new char[50]; // now it critical! EnterCriticalSection(&m_csCommunicationSync); // if the port is already opened: close it if (m_hComm != NULL) { CloseHandle(m_hComm); m_hComm = NULL; } // prepare port strings sprintf(szPort, \ sprintf(szBaud, \ // get a handle to the port m_hComm = CreateFile(szPort, // communication port string (COMX) GENERIC_READ | GENERIC_WRITE, // read/write types // comm devices must be opened with exclusive access NULL, // no security attributes

- 49 -

基于无线传感器网络的智能家居安防系统初步构建

OPEN_EXISTING, // comm devices must use OPEN_EXISTING FILE_FLAG_OVERLAPPED, // Async I/O // template must be 0 for comm devices if (m_hComm == INVALID_HANDLE_VALUE) { // port not found delete [] szPort; delete [] szBaud; return FALSE; } // set the timeout values m_CommTimeouts.ReadIntervalTimeout = 1000; m_CommTimeouts.ReadTotalTimeoutMultiplier = 1000; m_CommTimeouts.ReadTotalTimeoutConstant = 1000; m_CommTimeouts.WriteTotalTimeoutMultiplier = 1000; m_CommTimeouts.WriteTotalTimeoutConstant = 1000; // configure if (SetCommTimeouts(m_hComm, &m_CommTimeouts)) { if (SetCommMask(m_hComm, dwCommEvents)) { if (GetCommState(m_hComm, &m_dcb)) { m_dcb.EvtChar = 'q'; m_dcb.fRtsControl = RTS_CONTROL_ENABLE; // set RTS bit high! if (BuildCommDCB(szBaud, &m_dcb)) { if (SetCommState(m_hComm, &m_dcb)) ; // normal operation... continue else ProcessErrorMessage(\ } else ProcessErrorMessage(\ } else ProcessErrorMessage(\ } else ProcessErrorMessage(\ } else ProcessErrorMessage(\ delete [] szPort; delete [] szBaud; // flush the port PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT); // release critical section LeaveCriticalSection(&m_csCommunicationSync); TRACE(\portnr); return TRUE;

- 50 -

浙江理工大学信息电子学院本科毕业论文

}

// The CommThread Function.

UINT CZdx_Port::CommThread(LPVOID pParam) { CZdx_Port *port = (CZdx_Port*)pParam; port->m_bThreadAlive = TRUE; DWORD BytesTransfered = 0; DWORD Event = 0; DWORD CommEvent = 0; DWORD dwError = 0; COMSTAT comstat; BOOL bResult = TRUE; // Clear comm buffers at startup if (port->m_hComm) // check if the port is opened PurgeComm(port->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR PURGE_RXABORT | PURGE_TXABORT); // begin forever loop. This loop will run as long as the thread is alive. for (;;) { bResult = WaitCommEvent(port->m_hComm, &Event, &port->m_ov); if (!bResult) { switch (dwError = GetLastError()) { case ERROR_IO_PENDING: { break; } case 87: { break; } default: { port->ProcessErrorMessage(\ break; } } } else { bResult = ClearCommError(port->m_hComm, &dwError, &comstat); if (comstat.cbInQue == 0) continue; } Event = WaitForMultipleObjects(3, port->m_hEventArray, FALSE, INFINITE); switch (Event) { case 0: { CloseHandle(port->m_hComm);

- 51 -

|

基于无线传感器网络的智能家居安防系统初步构建

port->m_hComm=NULL; port->m_bThreadAlive = FALSE; AfxEndThread(100); break; } case 1: // read event { GetCommMask(port->m_hComm, &CommEvent); if (CommEvent & EV_RXCHAR) ReceiveChar(port, comstat); if (CommEvent & EV_CTS) ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_CTS_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr); if (CommEvent & EV_BREAK) ::SendMessage(port->m_pOwner->m_hWnd,

WM_COMM_BREAK_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr); if (CommEvent & EV_ERR) ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_ERR_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr); if (CommEvent & EV_RING) ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_RING_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr); if (CommEvent & EV_RXFLAG) ::SendMessage(port->m_pOwner->m_hWnd,

WM_COMM_RXFLAG_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr); break; } case 2: // write event { // Write character event from port WriteChar(port); break; } } } return 0; }

// start comm watching

BOOL CZdx_Port::StartMonitoring() { if (!(m_Thread = AfxBeginThread(CommThread, this))) return FALSE; TRACE(\ return TRUE; }

// Restart the comm thread

BOOL CZdx_Port::RestartMonitoring() { TRACE(\ m_Thread->ResumeThread(); return TRUE;

- 52 -