1. 程式人生 > >Windows平臺下常用的序列通訊串列埠程式設計API

Windows平臺下常用的序列通訊串列埠程式設計API

實作時拿來查就好!

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  用於在非同步通訊時儲存非同步操作結果