?? 34.htm
字號:
<p>基 于Win95 的VB5 串 口 通 信 程 序 </p>
<p>山 東 省 水 文 水 資 源 勘 測 局 王 軍 </p>
<p></p>
<p>---- Visual Basic5.0( 以 下 簡 稱VB) 以 其 簡 單 易 學、32 位 面 向 對 </p>
<p>象 的 程 序 設 計 等 特 點, 倍 受 廣 大 計 算 機 開 發 者 的 青 睞, 已 </p>
<p>廣 泛 地 應 用 于 各 個 領 域; 在 實 時 監 測 系 統 中 串 行 端 口 通 </p>
<p>信 是 一 項 基 礎 功 能, 因 此 我 們 使 用VB5 編 寫 了 實 時 水 庫 水 </p>
<p>文 自 動 監 測 系 統 的 后 臺 機 軟 件。 本 文 就Windows 95 環 境 中 采 </p>
<p>用VB5 設 計 串 行 端 口 通 信 程 序 進 行 討 論 并 給 出 實 例。 </p>
<p></p>
<p>---- 一 般 用VB 開 發 串 行 通 信 程 序 有 兩 種 方 法: 一 是 利 用</p>
<p>Windows 的 通 信API 函 數; 另 一 種 是 采 用VB 標 準 控 件Mscomm 來 實 </p>
<p>現。 </p>
<p></p>
<p>Windows 95 的 通 信API</p>
<p>---- Windows 95 中 的 串 口 通 信API 函 數 不 同 于Windows3.x 中 的</p>
<p>OpenComm、CloseComm、ReadComm、WriteComm, 而 是 采 用 硬 件 與 文 件 通 </p>
<p>用 的 函 數CreateFile、ReadFile、WriteFile、CloseHandle, 該 類 函 數 更 </p>
<p>具 有 一 般 性, 并 且 可 以 用EscapeCommFunction 函 數 實 現 底 層 硬 </p>
<p>件 操 作, 比 如:SETXOFF、 CLRDTR 等。 </p>
<p>---- 利 用API 編 寫 串 口 通 信 程 序 較 為 復 雜, 需 要 掌 握 大 量 通 </p>
<p>信 知 識, 其 優 點 是 可 實 現 的 功 能 更 豐 富、 應 用 面 更 廣 泛, </p>
<p>更 適 合 于 編 寫 較 為 復 雜 的 低 層 次 通 信 程 序。 采 用 這 種 方 </p>
<p>法 編 寫 串 行 端 口 通 信 程 序 一 般 可 分 為 以 下 幾 個 過 程: </p>
<p></p>
<p>---- 1. 初 始 化 串 行 端 口 </p>
<p></p>
<p>---- 首 先 用CreateFile 函 數 打 開 指 定 串 口, 置 參 數 中 訪 問 類 </p>
<p>型 為GENERIC_READ |GENERIC_WRITE、 共 享 模 式 為0、 創 建 標 志 為</p>
<p>OPEN_EXISTING、 模 板 句 柄 為NULL。 </p>
<p></p>
<p>---- 2. 配 置 串 口 </p>
<p></p>
<p>---- Windows 95 的 串 口 配 置 比Windows 3.x 較 為 復 雜, 但 其 功 能 </p>
<p>更 強 大, 對 一 般 程 序 可 使 用CommConfigDialog 函 數 以 對 話 框 方 </p>
<p>式 設 置 波 特 率、 數 據 位、 奇 偶 校 驗、 停 止 位 和 流 控 制 方 式,</p>
<p>并 且 可 以 恢 復 缺 省 值。 </p>
<p></p>
<p>---- 3. 超 時 控 制 </p>
<p></p>
<p>---- 為 了 防 止 意 外 情 況 使 串 口 讀 寫 無 休 止 地 等 待,Windows </p>
<p>95 提 供 了 超 時 設 置, 這 是 由COMMTIMEOUTS 結 構 定 義 的, 通 過 調 </p>
<p>用GetCcommTimeOuts 函 數 獲 得 當 前 的 設 置, 用SetCommTimeOuts 函 數 </p>
<p>來 完 成 設 置。 </p>
<p></p>
<p>---- 4. 數 據 傳 輸 </p>
<p></p>
<p>---- 讀 寫 串 行 端 口 與 讀 寫 文 件 采 用 的 函 數 相 同, 即ReadFile、</p>
<p>WriteFile, 讀 寫 操 作 可 分 四 種 方 式: 查 詢 方 式、 同 步I/O、 異 </p>
<p>步( 后 臺)I/O 和 事 件 驅 動I/O。 </p>
<p></p>
<p>---- 5. 關 閉 串 口 </p>
<p></p>
<p>---- 程 序 的 終 止 可 以 自 動 關 閉 串 口, 也 可 用 函 數CloseHandle()</p>
<p>, 以 便 釋 放 所 獨 占 資 源。 </p>
<p></p>
<p>VB 通 信 控 件Mscomm</p>
<p>---- Mscomm 控 件 提 供 了 功 能 完 善 的 串 口 數 據 的 發 送 和 接 收 </p>
<p>功 能,Mscomm 控 件 具 有 兩 種 處 理 方 式: 1 事 件 驅 動 方 式: 由</p>
<p>Mscomm 控 件 的OnComm 事 件 捕 獲 并 處 理 通 信 錯 誤 及 事 件;2 查 詢 </p>
<p>方 式: 通 過 檢 查CommEvent 屬 性 的 值 來 判 斷 事 件 和 錯 誤。 </p>
<p>---- Mscomm 控 件 的 通 信 功 能 實 現, 實 際 上 是 調 用 了API 函 數, </p>
<p>而API 函 數 是 由Comm.drv 解 釋 并 傳 給 設 備 驅 動 程 序 執 行 的, 對 </p>
<p>于VB 程 序 開 發 者 只 需 知 道Mscomm 控 件 的 屬 性 和 事 件 的 用 法 </p>
<p>即 可 以 實 現 串 口 的 操 作。 </p>
<p></p>
<p>---- 以 下 是Mscomm 控 件 的 主 要 屬 性 和 方 法: </p>
<p></p>
<p>---- 1)CommPort: 設 置 或 返 回 串 行 端 口 號, 其 取 值 范 圍 為1 ~99,</p>
<p>缺 省 為1。 </p>
<p></p>
<p>---- 2) Setting 設 置 或 返 回 串 行 端 口 的 波 特 率、 奇 偶 校 驗 位、</p>
<p>數 據 位 數、 停 止 位。 如:Mscomm.Setting=“9600,N,8,1”。 </p>
<p></p>
<p>---- 3)PortOpen: 打 開 或 關 閉 串 行 端 口, 格 式 為:Mscomm.PortOpen={</p>
<p>TRUE|FALSE}。 </p>
<p></p>
<p>---- 4) InBufferSize: 設 置 或 返 回 接 收 緩 沖 區 的 大 小, 缺 省 為</p>
<p>1024 字 節。 </p>
<p></p>
<p>---- 5) InBufferCount: 返 回 接 收 緩 沖 區 內 的 等 待 讀 取 的 字 節 </p>
<p>個 數, 可 通 過 設 置 該 屬 性 為0 來 清 除 接 收 緩 沖 區。 </p>
<p></p>
<p>---- 6) RThreshold: 該 屬 性 為 一 閥 值, 它 確 定 當 接 收 緩 沖 區 內 </p>
<p>字 節 個 數 達 到 或 超 過 該 值 后 就 產 生 代 碼 為MSCOMM_EV_RECEIVE </p>
<p>的OnComm 事 件。 </p>
<p></p>
<p>---- 7) InputLen: 設 置 或 返 回 接 收 緩 沖 區 內 用Input 讀 入 的 個 </p>
<p>數。 若 取0, 則INPUT 讀 取 整 個 緩 沖 區 的 內 容。 </p>
<p></p>
<p>---- 8) Input: 該 屬 性 表 示 從 接 收 緩 沖 區 移 走 一 串 字 符。 </p>
<p></p>
<p>---- 9) OutBufferSize: 設 置 或 返 回 發 送 緩 沖 區, 缺 省 為512 字 節。</p>
<p></p>
<p></p>
<p>---- 10) OutBufferCounter: 返 回 發 送 緩 沖 區 內 等 待 發 送 的 字 符 </p>
<p>數, 可 用 來 清 空 緩 沖 區。 </p>
<p></p>
<p>---- 11) Output: 向 發 送 緩 沖 區 傳 送 一 字 符 串。 </p>
<p></p>
<p>---- 12) EOFEnable: 若 置TRUE, 則 當 輸 入 中 出 現EOF, 就 停 止 輸 入 </p>
<p>并 產 生OnComm 事 件。 </p>
<p></p>
<p>---- 如 果 在 通 信 過 程 中 發 生 錯 誤 或 事 件, 就 會 引 發OnComm 事 </p>
<p>件 并 且 改 變 屬 性 值, 由CommEvent 屬 性 代 碼 反 映 錯 誤 類 型, 在 </p>
<p>通 信 程 序 的 設 計 中 可 根 據 該 屬 性 值 來 執 行 不 同 的 操 作, </p>
<p>以 下 是 部 分 屬 性 常 數 值 及 其 含 義: </p>
<p></p>
<p>---- 1)ComEvSend: 其 值 為1, 發 送 緩 沖 區 的 內 容 少 于SThreshold 指 </p>
<p>定 的 值。 </p>
<p></p>
<p>---- 2) ComEvReceive: 其 值 為2, 接 收 緩 沖 區 內 字 符 數 達 到 </p>
<p>RThreshold 值, 該 事 件 在 緩 沖 區 中 數 據 被 移 走 前 將 持 續 產 生。</p>
<p></p>
<p></p>
<p>---- 3) ComEventFrame: 其 值 為1004, 硬 件 檢 測 到 幀 錯 誤。 </p>
<p></p>
<p>---- 4) ComEventRxOver: 其 值 為1008, 接 收 緩 沖 區 溢 出。 </p>
<p></p>
<p>---- 5) ComEventTxFull: 其 值 為1010, 發 送 緩 沖 區 溢 出。 </p>
<p></p>
<p>---- 6) ComEventRxParity: 其 值 為1009, 奇 偶 校 驗。 </p>
<p></p>
<p>---- 7) ComEvEOF: 其 值 為7, 接 收 數 據 中 出 現 文 件 結 束(ASCII 碼 </p>
<p>為 26) 字 符。 </p>
<p></p>
<p>程 序 樣 例</p>
<p>---- 采 用Mscomm 控 件 實 現 串 口 通 信 時, 首 先 添 加 一Mscomm 控 件 </p>
<p>到 窗 體 中, 該 控 件 一 般 不 在 通 用 工 具 窗 口 中, 而 是 需 通 過 </p>
<p>菜 單 項“ 工 程(P) → 部 件(O)” 進 入 選 擇 窗 口, 在 控 件tab 頁 </p>
<p>中 選 取Microsoft Comm Control 5.0 , 此 時 工 具 窗 口 中 出 現Mscomm </p>
<p>圖 標, 即 可 被 使 用。 </p>
<p>---- 以 下 是 事 件 驅 動 方 式 的 接 收 程 序 的 主 要 部 分: Private </p>
<p>Sub getdatafromserial_Click() </p>
<p></p>
<p>---- CommonDialog1.InitDir = “c:\temp" </p>
<p></p>
<p>---- CommonDialog1.ShowSave </p>
<p></p>
<p>---- mainfrm.MSComm1.CommPort=1 </p>
<p></p>
<p>---- hfile = FreeFile </p>
<p></p>
<p>---- ’ 打 開 存 儲 接 收 數 據 的 文 件 </p>
<p></p>
<p>---- Open CommonDialog1.filename For Output As #hfile </p>
<p></p>
<p>---- ’ 設 接 收 緩 沖 區 的 大 小, 可 按 量 確 定 </p>
<p></p>
<p>---- mainfrm.MSComm1.InBufferSize = 4096 </p>
<p></p>
<p>---- If Not mainfrm.MSComm1.PortOpen Then ’ 打 開 串 口 </p>
<p></p>
<p>------ mainfrm.MSComm1.PortOpen = True </p>
<p></p>
<p>---- End If </p>
<p></p>
<p>---- If Err Then </p>
<p></p>
<p>---- MsgBox “Communcation port cannot be opened!!" </p>
<p></p>
<p>---- ’ 清 接 收 緩 沖 區 </p>
<p></p>
<p>---- mainfrm.MSComm1.InBufferCount = 0 </p>
<p></p>
<p>---- ’ 設 一 次</p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -