Windows平臺下常用的序列通訊串列埠程式設計API
阿新 • • 發佈:2019-01-05
實作時拿來查就好!
1、CreateFile() ——開啟串列埠& CloseHandle()——關閉串列埠,成功關閉返回true HANDLE CreateFile(LPCTSTR lpFileName ,DWORD dwDesireAccess ,DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes ,DWORD dwCreationDistribution , DWORD dwFlagsAndAttributes ,HANDLE hTemplateFile); BOOL CloseHandle(HANDLE hObjedt) ; lpFileName 要開啟的裝置檔名稱,對串列埠通訊來說就是COM1或COM2 dwDesiredAccess 讀/寫模式設定,一般為GENERIC_READ 或 GENERIC_WRITE dwShareMode 串列埠共享模式,一般不允許與其他應用程式共享,設為0 lpSecurityAttributes 串列埠的安全屬性,應為0,表示該串列埠不可被子程式繼承 dwCreationDistribution 建立檔案的性質,一般標識為OPEN_EXISTING dwFlagsAndAttributes 屬性及相關標誌,若用非同步方式應1設為FILE_FLAG_OVERLAPPED hTemplateFile 模板檔案指定,一般為0,選定為預設值 串列埠開啟成功方可使用。CreateFile函式返回操作串列埠的控制代碼,可供以後對串列埠操作使用。 GetCommState()——取得串列埠的工作狀態和 SetCommState()——設定串列埠的工作狀態 BOOL GetCommState(HANDLE hFile,LPDCB lpDCB); BOOL SetCommState(HANDLE hFile ,LPDCB lpDCB); hFile表示串列埠控制代碼,lpDCB表示特定的裝置控制塊DCB(Device Control Block)。DCB結構中含有裝置相關的引數,如資料位數、起止/校驗和波特率等。初始化串列埠時一般先用GetCommState()取得串列埠的引數結構,修改部分引數後再呼叫SetCommState()將引數結構寫入DCB DCB中進行串列埠初始化設定相關的幾個常用引數: DWORD BaudRate 串列埠波特率 DWORD fParity 為1時啟用奇偶校驗 DWORD Parity 校驗方式,0~4分別對應無校驗,奇校驗,偶校驗,校驗置位和校驗清零 DWORD ByteSize 一個位元組的資料位個數,範圍是5~8 DWORD StopBits 停止位個數,0~2分別對應1位、1.5位、2位停止位 GetCommTimeouts()——取得串列埠收發的超時時間和SetCommTimeouts()——設定串列埠收發的超時時間 兩個函式主要通過改變COMMTIMEOUTS結構體的成員變數值來實現 BOOL GetCommTimeouts(HANDLE hFile ,LPCOMMTIMEOUTS lpCommTimeouts); BOOL SetCommTimeouts(HANDLE hFile ,LPCOMMTIMEOUTS lpCommTimeouts); COMMTIMEOUTS 結構用於表示讀/寫操作相關的時間限制 typedef struct _COMMTIMEOUTS { DWORD ReadIntervalTimeout ;//兩個字元到達的最大時間間隔,單位為ms DWORD ReadTotalTimeoutMultiplier ;//讀操作一個字元的時間值 DWORD ReadTotalTimeoutConstant ;//讀操作的時間限定值 DWORD WriteTotalTimeoutMultiplier ;//寫操作一個字元的時間值 DWORD WriteTotalTimeoutConstant ;//寫操作的時間限定值 } COMMTIMEOUTS ,*LPCOMMTIMEOUTS ; 其中 ReadTotalTimeout = ReadTotalTimeoutMultiplier *BytesToRead +ReadTotalTimeoutComnstant WriteTotalTimeout =WriteTotalTimeoutMultiplier * BytesToWrite + WriteTotalTimeoutConstant 讀完一個字元後,超過了ReadIntervalTimeout ,仍未讀取到下一個字元,發生超時事件 讀或寫操作時間超過上述式子中的設定值,發生超時事件 SetupComm()——設定資料緩衝區大小 和 PurgeComm()——清零資料緩衝區 BOOL SetuoComm(HANDLE hFile ,DWORD dwInQueue ,DWORD dwOutQueue); BOOL PurgeComm(HANDLE hFile ,DWORD dwFlags) ; dwInQueue——接收緩衝區的位元組長度 dwOutQueue——傳送緩衝區的位元組長度 dwFlags——指定對串列埠執行的動作 常用的dwFlags標識: PURGE_TXABORT——停止目前所有的傳輸工作,立即返回,不管是否完成傳輸動作 PURGE_RXABORT ——停止目前所有的讀取工作,立即返回,不管是否完成讀取動作 PURGE_TXCLEAR——清除傳送緩衝區的所有資料 PURGE_RXCLEAR——清除接收緩衝區的所有資料 ReadFile() ——讀串列埠操作 和WriteFile()——寫串列埠操作 BOOL ReadFile(HANDLE hFile ,LPVOID lpBuffer ,DWORD nNumberOfBytesToRead , LPDWORD lpNumberOfBytesRead , LPOVERLAPPED lpOverlapped ); BOOL WriteFile( HANDLE hFile ,LPCVOID lpBuffer ,DWORD nNumberOfBytesToWrite , LPDWORD lpNumberOfBytesWritten ,LPOVERLAPPED lpOverlapped); lpBuffer——等待讀或寫資料的首地址 ;nNumberOfBytesToRead 等待讀的位元組數長度 nNumberOfBytesToWrite 等待寫的位元組數長度 lpNumberOfBytesRead 從串列埠實際讀出的位元組個數 lpNumberOfBytesWritten 實際寫入串列埠的資料個數 lpOverlapped 指向一個可重疊型I/O結構的指標 ClearCommError()——清除串列埠錯誤或讀取串列埠當前的狀態 BOOL ClearCommError(HANDLE hFile ,LPDWORD lpErrors ,LPCOMATAT lpStat ); lpError 返回的錯誤數值 常見的錯誤常數定義: CE_BPEAK 檢測到某個位元組資料缺少合法的停止位 CE_FRAME 硬體1檢測到幀錯誤 CE_IOE 通訊裝置發生輸入/輸出錯誤 CE_MODE 設定模式錯誤,或是hFile值錯誤 CE_OVERRUN 溢位錯誤,緩衝區容量不足,資料將丟失 CE_RXOVER 溢位錯誤 CE_RXPARITY 硬體檢查到校驗位錯誤 CE_TXFULL 傳送緩衝區已滿 lpStat 指向通訊埠狀態的結構變數 COMSTAT typedef struct _COMSTAT { ...... DWORD cbInQue ;//輸入緩衝區的位元組數 DWORD cbOutQue ;//輸出緩衝區的位元組數 }COMSTAT ,*LPCOMSTAT ; GetCommMask() 、SetCommMask() WaitCommEvent () 獲得、設定、等待串列埠上指定監視事件 BOOL GetCommMask(HANDLE hFile ,LPDWORD lpEvtMask ); BOOL SetCommMask(HANDLE hFile ,DWORD dwEvtMask ); BOOL WaitCommEvent (HANDLE hFile ,LPDWORD lpEvtMask ,LPOVERLAPPED lpOverlapped ); lpEvtMask 準備監視的串列埠事件掩碼,可以是以下一個或幾個定義事件的組合: EV_BREAK 收到Break訊號 EV_CTS CTS(Clear to Send )線路狀態發生變化 EV_DSR DSR(Data Set Ready )線路狀態發生變化 EV_ERR 線路狀態錯誤,包括CE_FRAME、CE_OVERRUN 、CE_RXPARRITY 3種錯誤 EV_RING 檢測到振鈴訊號 EV_RLSD CD(Carrier Detect)線路訊號發生變化 EV_RXCHAR 輸入緩衝區中已收到資料 EV_RXFLAG 使用SetCommState()函式設定DCB結構中的等待字元已被傳入輸入緩衝區 EV_TXEMPTY 輸出緩衝區中的資料已被完全送出 lpOverlapped 用於在非同步通訊時儲存非同步操作結果