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