| UINT COMReadThreadProc(LPVOID pParam) { …… file://設置讀端口線程執行標志的標識 g_comthread.SetReadThreadKillFlag(FALSE); while(1) { file://讀取端口開啟狀態的標識 if(TRUE==g_comthread.GetCloseCOMFlag()) { g_comthread.SetReadThreadKillFlag(TRUE); return 0;//正常關閉 } file://讀端口操作 dwNeedRead=500; file://從端口讀取數據到緩存中 if(!ReadFile(g_hCom,buf,dwNeedRead,&dwActRead,NULL)) { ClearCommError(g_hCom,&dwErrorMask,&comstat); PurgeComm(g_hCom,PURGE_RXCLEAR); continue; } file://讀字符加入到全局緩沖 g_comreadbuf.Add(buf,dwActRead); Sleep(1); } …… return 0; } |
其中用到的g_comthread和g_comreadbuf分別是線程類CCOMThread和讀端口類COMReadBuf的實例對象。這兩個類里都用類CCriticalSection m_Lock;實現了臨界區技術,用以保持線程間的同步。CCOMReadBuf類的兩個函數GetOneByte(……)、Add(……)分別用于從端口讀取一個字符和向緩沖區添加讀取的字符。其主要實現代碼如下:
| BOOL CCOMReadBuf::GetOneByte(BYTE *cb) { m_Lock.Lock(); if(m_nHead==m_nTail) { m_Lock.Unlock(); return FALSE;//空 } *cb=m_readbuf[m_nTail]; if(m_nTail < m_nBufSize-1) m_nTail++; else m_nTail=0; m_Lock.Unlock(); return TRUE;//空 }
void CCOMReadBuf::Add(BYTE buf[],int nBytes) { int nt,i; m_Lock.Lock(); for(i=0;i BR> { nt=(m_nHead-m_nTail); if(nt<0) nt+=m_nBufSize; if(nt+1==m_nBufSize) break;//緩沖區滿 m_readbuf[m_nHead]=buf[i]; if(m_nHead < m_nBufSize-1) m_nHead++; else m_nHead=0; } m_Lock.Unlock(); } |
(四) 控制命令的發送
控制命令可以從對話條上的編輯框獲取,然后就可以通過寫文件形式從端口發送出去,這部分實現起來較簡單,也牽扯不到線程等技術。主要的代碼主要有: