---- 過 去, 開 發 通 信 軟 件 對 于 一 般 的 應 用 軟 件 開 發 人 員 來 說 是 比 較 困 難 的。 而 現 在 這 件 事 已 經 變 得 容 易 多 了。 本 文 介 紹 如 何 利 用VB5.0 和MSCOMM 控 件 開 發 通 信 軟 件。
---- 要 想 自 己 開 發 通 信 軟 件, 除 了 要 掌 握VB5.0 的 基 本 編
程 語 言 以 外, 還 需 知 道 一 些 微 機 通 信 的 基 本 原 理。 如 有 關 串 行 端 口 及 調 制 解 調 器 的 基 本 知
識, 調 制 解 調 器 的 使 用 手 冊 及AT 命 令 集 等。 這 在 許 多 書 中 都 可 以 找 到。 本 文 不 再 敘 述。
二 有 關 預 備 知 識
---- 在 PC 機 串 行 端 口 與 調 制 解 調 器 進 行 連 接 時, 有
十 幾 根 線 進 行 信 號 傳 輸。 對 于 用MSCOMM 控 件 編 制 通 信 軟 件 來 說, 只 需 了 解 以 下 五 根 線 的 代 號
及 作 用。 以 下 五 根 線 的 高 電 平/ 低 電 平 狀 態 分 別 對 應 MScomm 控 件 的 相 應 屬 性 的 True/False
值。
---- (1) DTR 線:PC 發 往MODEM, 表 示 PC 機 是 否 已 準 備 好。
---- (2) RTS 線:PC 發 往MODEM, 表 示 PC 機 是 否 允 許modem
發 回 數 據.
---- (3) DSR 線: MODEM 發 往PC, 表 示MODEM 是 否 已 做 好 操
作 準 備
---- (4) CTS 線: MODEM 發 往PC, 表 示 MODEM 是 否 允 許 發
送 數 據
---- (5) CD 線: MODEM 發 往PC, 表 示 MOEDM 已 經 與 呼 叫 的 遠
方 MODEM 處 于 連 結 狀 態
三 MSCOMM 控 件 的 屬 性 及 事 件
---- VB5.0 所 帶 的 通 信 控 件 MSCOMM 易 學 易 用。 它 只
有 約30 個 屬 性 和 事 件。 可 以 從VB5.0 的 聯 機 幫 助 中 找 到 它 的 全 部 資 料。 本 文 簡 述 它 的 主 要 屬 性
及 事 件, 并 加 已 歸 類 整 理。 以 下 用 MSCOMM1 表 示 在 窗 體 上 設 置 的 一 個 MSCOMM 控 件 的 名 稱
---- ( 一) 通 信 參 數 設 置
---- (1) CommPort 屬 性
---- 語 法: MSCOMM1.CommPort [=Value]
---- 作 用: 設 置 或 返 回 聯 接 MODEM 的 串 口 的 編 號。
---- 值: 用1,2, ... 表 示 串 口 COM1,COM2 ....
---- (2) Settings 屬 性
---- 語 法: MSCOMM1.Settings [=Value]
---- 作 用: 設 置 或 返 回 通 信 參 數。
---- 值: String 型。 例 入 用 "19200,N,8,1" 表 示 傳 輸 速 率 為19200
bps, 沒 有 奇 偶 校 驗 位,8 位 數 據 位,1 位 停 止 位。
---- (3) Handshaking 屬 性
---- 語 法: MSCOMM1.Handshaking [=Value]
---- 作 用 與 值: 設 置 或 返 回 硬 件 握 手 協 議。 指 的 是PC 機MODEM
之 間 為 了 控 制 流 速 而 約 定 的 內 部 協 議。
---- 0 沒 有 握 手 協 議。 不 考 慮 流 量 控 制。
---- 1 XON/XOFF。 即 在 數 據 流 中 嵌 如 控 制 苻 來 進 行 流 控。
---- 2 RTS/CTS 。 既 由 信 號 線RTS/CTS 自 動 進 行 流 量 控 制。
---- 3 兩 者 皆 可。
---- 注: 實 踐 中 我 們 發 現 選 用 2( 即RTS/CTS) 是 很 方 便 的。
---- ( 二) 打 開/ 關 閉 端 口
---- (4) PortOpen 屬 性
---- 語 法: MSCOMM1.PortOpen [=Value]
---- 作 用: 打 開 或 關 閉 端 口。
---- 值: Boolean 型。 設 為 True/False 可 以 打 開/ 關 閉 端 口。
---- ( 三) 發 送 數 據
---- (5) OutBufferSize 屬 性
---- 語 法: MSCOMM1.OutBufferSize [=Value]
---- 作 用: 設 置 或 返 回 傳 輸 緩 沖 區 大 小。
---- 值: Integer 型。 傳 輸 緩 沖 區 的 字 節 數。 例 如 可 選 1024
。
---- (6) OutPut 屬 性
---- 語 法: MSCOMM1.OutPut [=Variant]
---- 作 用: 向 傳 輸 緩 沖 區 寫 數 據 流。
---- 值: Variant 型 變 量。
---- 注: 傳 輸 文 本 數 據 時, 應 將 String 型 數 據 放 入 Variant
變 量, 傳 輸 二 進 制 數 據( 即 按 字 節) 時, 應 將 Byte 型 數 組 數 據 放 入 Variant 變 量
---- ( 四) 接 收 數 據
---- (7) InBufferSize 屬 性
---- 語 法: MSCOMM1.InBufferSize [=Value]
---- 作 用: 設 置 或 返 回 接 收 緩 沖 區 大 小。
---- 值: Integer 型。 接 收 緩 沖 區 的 字 節 數。 例 如 可 選 1024
。
---- (8) InputMode 屬 性
---- 語 法: MSCOMM1.InputMode [=Value]
---- 作 用: 設 置 或 返 回 接 收 數 據 的 數 據 類 型。
---- 值: 0 用Input 屬 性 接 收 文 本 型 數 據。
---- 1 用Input 屬 性 接 收 二 進 制 數 據。
---- (9) InBufferCount 屬 性
---- 語 法: MSCOMM1.InBufferCount [=Value]
---- 作 用: 返 回 接 收 緩 沖 區 中 已 傳 到 但 還 未 取 走 的 字 符 個 數。
---- 值: Integer 型。
---- (10) Input 屬 性
---- 語 法: MSCOMM1.Input [=Variant]
---- 作 用: 將 接 收 緩 沖 區 中 收 到 的 數 據 讀 入 變 量。
---- 值: Variant 型 變 量。
---- 注: 當InputMode 屬 性 值 為 0( 文 本 模 式) 時, 變 量 中 含 String
型 數 據。
---- 當InputMode 屬 性 值 為 1( 二 進 制 模 式) 時, 變 量 中 含
Byte 型 數 組 數 據。
---- ( 五) 狀 態 控 制
---- (11) DTREnabled 屬 性
---- (12) RTSEnabled 屬 性
---- (13) DSRHolding 屬 性
---- (14) CTSHolding 屬 性
---- (15) CDHolding 屬 性
---- 以 上 五 個 屬 性 即 如 二 所 述, 均 取 值 TRUE/FALSE, 用 于 讀 取 或 控 制 pc 機 與 modem 之 間 的 交 互 狀 態。 需 運 用 好。 例 如, 應 在 讀 取 到 DSRHolding 屬 性 值 為TRUE 時 再 向 MODEM 發 出 命 令。 應 當 在 載 波 檢 測 到 以 后(CDHolding 屬 性 為 TRUE) 時 再 向MODEM 發 送 數 據。
---- ( 六) 事 件
---- MSCOMM 控 件 把 實 際 上 是 十 七 個 事 件 歸 并 為 一 個 事 件 OnComm, 用 屬 性 CommEvent 的 十 七 個 值 來 區 分 不 同 的 觸 發 時 機。 主 要 有 以 下 幾 個:
---- (1)CommEvent=1 時: 傳 輸 緩 沖 區 中 的 字 符 個 數 已 少
于 Sthreshold( 可 設 置 的 屬 性 值) 個.
---- (2)CommEvent=2 時: 接 收 緩 沖 區 中 收 到 hreshold(
可 設 置 的 屬 性 值) 個 個 字 符. 利 用 此 事 件 可 編 寫 接 收 數 據 的 過 程。
---- (3)CommEvent=3 時: CTS 線 發 生 變 化 .
---- (4)CommEvent=4 時: DSR 線 發 生 變 化 .
---- (5)CommEvent=5 時: CD 線 發 生 變 化 .
---- (6)CommEvent=6 時: 檢 測 到 振 鈴 信 號 .
---- 另 外 十 個 情 況 是 可 能 發 生 的 各 種 通 信 錯 誤 時 觸 發。
可 參 看 有 關 資 料.
四 通 信 軟 件 參 數 設 置
---- 在 自 己 編 寫 的 通 信 軟 件 中, 應 包 含 進 行 通 信 參
數 設 置 的 功 能。 主 要 就 是 可 以 設 置 端 口 號, 波 特 率, 數 據 位, 停 止 位, 奇 偶 校 驗 位 及 設 置 硬 件 握
手 協 議。
---- 可 在 一 個 窗 體 上 用 下 拉 列 表 框, 選 擇 鈕 等 由 用 戶 來
選 擇。《 保 存》 時, 利 用VB5.0 的 Settings 函 數 將 這 些 參 數 存 儲 在WINDOWS 95 的 系 統 注 冊 表
中。 每 次 運 行 該 軟 件 時, 先 用 GetSettings 函 數 調 出 這 些 參 數, 并 對Commport,Settings,Handshaking
等 屬 性 賦 值, 來 進 行 通 信 參 數 設 置。
五 打 開 通 信 端 口
---- 在 編 寫 的 通 信 軟 件 的 主 窗 體 上, 可 以 安 排 一 個
打 開/ 關 閉 端 口 的 菜 單 項 或 圖 形 按 鈕。 在 打 開 端 口 時, 可 向 MODEM 發 出 命 令, 進 行 MODEM 參 數
設 置。 可 以 象 下 面 這 樣 來 編 程:
'(1)打開/關閉端口
MSComm1.PORTOPEN = Not MSComm1.PORTOPEN
'(2)向 MODEM 發出 DTR(已準備好) 信號-----
OpenFlag = MSComm1.PORTOPEN
If OpenFlag Then
MSComm1.DTREnable = True
Else
MSComm1.DTREnable = False
End If
'(3)打開時向 MODEM 發出一些命令來設置參數
'S0=n (n>=1)自動應答. n為響鈴次數
'E0/E1 關閉/打開命令字符回應
'Q0/Q1 modem返回/不返回結果碼
'M0/M1 關閉/打開MODEM揚聲器.
If OpenFlag Then
L1:
If MSComm1.CTSHolding Then
Outstring = "AT S0=1 E1 Q0 M0 " + Chr(13)
MSComm1.Output = Outstring
GoTo LL
Else
GoTo L1
End If
End If
'-----
LL: ...
---- 也 可 以 安 排 一 些 可 變 換 顏 色 的 指 示 燈 來 代 表 端 口 打 開
狀 態,CD 線 狀 態 等, 這 樣 更 形 象 生 動。
---- 其 中 TEXT1 是 窗 體 上 讓 用 戶 輸 入 電 話 號 的 文 本 框。
---- 為 了 使 程 序 功 能 更 強 一 些, 可 以 增 加< 電 話 號 碼
簿 管 理>, 可 以 增 加, 修 改, 刪 除, 查 詢 電 話 號 碼。 這 與 一 般 的 數 據 庫 應 用 程 序 是 一 樣 的。
七 發 送 文 件
---- 撥 號 以 后, 程 序 要 循 環 等 待 并 隨 時 判 定 是 否 接
通。 如 果 MODEM 向 PC 的 回 應 字 符 串 中 含 有 "Connect " 或 CDHolding 屬 性 值 變 為 True ( 檢
測 出 載 波), 則 表 示 已 與 遠 方MODEM 連 機 了。 這 時 就 可 以 發 送 文 件 了。
---- 發 送 文 件 開 始 以 前, 可 打 開 一 個 顯 示 發 送 信 息 的 窗 口。 可 在 此 窗 口 上 顯 示 要 發 送 的 文 件 名, 總 長 度, 已 發 送 長 度 等 信 息。
---- 設 置 以 下 全 局 變 量, 存 放 標 志 字 符 串, 在 發 送 及 接 收 程 序 中 均 使 用。
S_FILENAME = "FILENAME" + Chr(5) + Chr(13) + Chr(10) S_FILELEN = "FILELEN " + Chr(5) + Chr(13) + Chr(10) S_FILESTAR = "FILESTAR" + Chr(5) + Chr(13) + Chr(10)---- (1) 打 開 文 件:
---- 要 想 把 一 個 文 件 的 全 部 字 節 都 傳 送, 需 以 二 進 制 方
式 打 開 文 件。 可 用 如 下 語 句
---- ' 得 到 下 一 個 可 用 的 文 件 號, 放 在 整 型 變 量 hSend
---- hSend = FreeFile
---- ' 打 開 文 件
---- Open SENDFN For Binary Access Read As hSend
---- LF& = LOF(hSend) ' 文 件 長 度 為 LF&
---- 其 中 變 量 SENDFN 中 含 有 由 用 戶 選 定 的 要 傳 送 的 文 件
名。
---- (2) 發 送 文 件 名, 文 件 長 度, 文 件 開 始 等 信 息 字 符 串。
---- 例 如, 我 們 設 計 成 如 下:
DIM VARC AS VARIANT VARC = S_FILENAME MSComm1.Output = VARC '發出 "FILENAME" 提示字串 VARC = SENDFN + Chr(13) + Chr(10) TXRJ.MSComm1.Output = VARC '發出文件名 VARC = S_FILELEN MSComm1.Output = VARC '發出 "FILELEN" 提示字串 VARC = Trim(Str(LF&)) + Chr(13) + Chr(10) MSComm1.Output = VARC '發出文件寬度 VARC = S_FILESTAR '發出 "FILESTART" 提示字串,表示下面文件開始。 MSComm1.Output = VARC 然后程序倒計時,在發送信息窗口顯示 8,7,6,5,4,3,2,1,0 .---- (3) 發 送 文 件 內 容
DIM SENDARR() AS BYTE '定義字節型數組
Sum = 0 '記錄累計發送的字節數
BSIZE = MSComm1.OutBufferSize '每次發送的塊大小
ReDim SENDARR(1 To BSIZE)
' 循環發送
Do While Sum < LF&
If LF& - Loc(hSend) < BSIZE Then
BSIZE = LF& - Loc(hSend)
ReDim SENDARR(1 To BSIZE)
End If
Get hSend, , SENDARR '從文件取字節放入字節數組
SENDVAR = SENDARR '轉放到 Variant 型變量
' 當CTS線及CD線為高電平時才可發送,否則需等待。
T = Timer + 60
L:
If MSComm1.CTSHolding And MSComm1.CDHolding Then
MSComm1.Output = SENDVAR '發送
Sum = Sum + BSIZE '累加計數
Label6.Caption = Str(Sum) '顯示在發送窗口上
Else
If Timer < T Then
GoTo L '循環等待
Else
GoTo CLOSEFILE '等待時間超過 60秒則退出
End If
End If
' 等待系統處理完
Do
RET = DoEvents()
Loop Until MSComm1.OutBufferCount = 0
Loop '循環語句結尾
---- 文 件 發 送 完 畢 以 后, 關 閉 該 文 件。 并 關 閉 發 送 文 件 信 息
窗 口。
Private Static Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
'接收緩沖區收到Rthreshold個字符時觸發
Dim VARC As Variant
Dim N As Long
Dim SJARR() As Byte
'
N = MSComm1.InBufferCount '接收緩沖區字符總數
If MSComm1.InputMode = 0 Then
'當輸入模式為文本模式時,將收到的數據放到字符串變量。
MSComm1.InputLen = 0
VARC = Space(N)
VARC = MSComm1.Input
Else
'當輸入模式為二進制模式時,將收到的數據放到字節數組。
ReDim SJARR(1 To N)
VARC = ARR
MSComm1.InputLen = N
VARC = MSComm1.Input
End If
ShowDATA TextTerm, N, VARC
'調接收數據處理過程Showdata
End Select
End Sub
---- (三) 接 收 數 據 處 理 過 程 ShowData
Public Static Sub ShowData(Term As Control, _
N As Long, DATA As Variant)
'參數:Term (主窗體上的文本框,用于顯示接受數據)
' N 為本次接收到的字節數
' DATA (接收到的數據.Variant型 )
(變量定義部分:略)
'(一) 非文件傳輸情形(接收的是字符串)
If not mscomm1.InputMode= 0 Then
GoTo L2
End If
'(1)把新接收的字符數據放到文本框TERM末尾
Term.SelStart = Len(Term.Text)
Term.SelLength = 0
Term.SelText = DATA
'(2)未找到文件傳輸開始標志就結束此過程----
W_FILESTAR = InStr(1, Term.Text, S_FILESTAR, 0)
If W_FILESTAR = 0 Then
Exit Sub
End If
'(3)以下為找到文件傳輸開始標志的情況
'(3-1) 找文件名及文件長度
W_FILENAME = InStr(1, Term.Text, S_FILENAME, 0)
W_FILELEN = InStr(1, Term.Text, S_FILELEN, 0)
FN = Mid(Term.Text, W_FILENAME + 11, (W_FILELEN - W_FILENAME - 13))
' (3-2)打開接收文件
hJS = FreeFile
JSFN = Pathc + "\SJFILE\S" + Trim(Str(NO)) + "_" + FN
Open JSFN For Binary Access Write As hJS
'(3-3)收件箱增加新記錄
W_FILENAME = InStr(1, Term.Text, S_FILENAME, 0)
W_FILELEN = InStr(1, Term.Text, S_FILELEN, 0)
FN = Mid(Term.Text, W_FILENAME + 11, (W_FILELEN - 1) - (W_FILENAME + 11))
FL = Mid(Term.Text, W_FILELEN + 11, W_FILESTAR - (W_FILELEN + 10))
SENDLEN = Val(FL)
'應收總字節數SENDLEN
'以下SJRS是已打開的收件箱對應的記錄集型變量
SJRS.AddNew '增加一新記錄
SJRS!SJRQ = Now '寫入收件日期
SJRS!SJFILE = FN '寫入收件的文件名
SJRS!SJLEN = Val(FL) '寫入收件的長度
SJRS!FILENO = NO '寫入收件的序號
'(3-4)顯示文件接收窗口
JSLEN = 0
TXINPUT.Show
'(3-5)改變輸入模式屬性 InputMode為二進制模式
TXRJ.MSComm1.InputMode = comInputModeBinary
'(7)等待幾秒, 顯示 8 7 6 5 4 3 2 1 0
Exit Sub
'(二)文件傳輸狀態處理------------
L2:
ReDim JSARR(0 To N - 1)
JSARR = DATA '將字節流放入字節型數組
'將字節型數組中的數據寫入已打開的接收文件
Put hJS, , JSARR
JSLEN=JSLEN+N ’本次已累計收到的字節數
' 已收字節數與文件總長相比較
If JSLEN < SENDLEN Then
Exit Sub
End If
' 轉此為文件傳輸已結束------
'關閉接收文件
Close hJS
'提交收件箱表的新增記錄
SJRS.Update
'修改文本顯示
W_FILENAME = InStr(1, Term.Text, S_FILENAME, 0)
Term.SelStart = W_FILENAME - 1
Term.SelLength = Len(Term.Text)
Term.SelText = ""
FL = "文件" + FN + "接收結束" + Chr(13) + Chr(10)
Term.Text = Term.Text & FL
'關閉收件窗口
Unload TXINPUT
'改變 InputMode屬性為文本模式
TXRJ.MSComm1.InputMode = 0
Exit Sub
End Sub
---- 以 上 以 發 送 和 接 收 文 件 為 例 介 紹 了 我 們 是 如 何 使 用VB5.0
及MSCOMM 控 件 來 開 發 自 己 的 的 通 信 軟 件 的。 掌 握 了 以 上 基 本 技 術, 就 可 以 稍 加 改 變 來 開 發 自
己 的 各 種 專 用 通 信 軟 件。 例 如 發 送 數 據 庫 的 一 條 記 錄, 并 使 接 收 方 把 接 收 到 的 數 據 也 放 在 數
據 庫 中。 也 可 以 進 行 數 據 加 密/ 解 密 傳 輸 等。 總 之, 學 習 怎 樣 使 用VB5.0 及MSCOMM 控 件 來 開 發 自
己 的 的 通 信 軟 件 是 十 分 有 用 的。
---- 附 注: 本 軟 件 運 行 環 境
主站蜘蛛池模板: 亚洲中文字幕第二十三页| 成人AV专区精品无码国产| 国产精品一区二区三区91| 日韩精品在线观看一二区| 中文成人在线| 中文字幕日韩有码一区| 中文字幕在线无码一区二区三区| 免费人妻无码不卡中文字幕18禁| 日韩精品久久久肉伦网站| 国产免费高清视频在线观看不卡| 亚洲AVAV天堂AV在线网阿V| 97人妻免费碰视频碰免| 国产精品久久久久鬼色| 久久久久人妻精品一区三寸| 亚洲AⅤ天堂AV天堂无码| 精品无码久久久久成人漫画| 亚洲AV永久无码精品秋霞电影影院 | 国产熟睡乱子伦视频在线播放| 国产乱人无码伦AV在线A| 鲁丝片一区二区三区免费| 精品无码一区二区三区爱欲| 精品国产美女福到在线不卡| 国产精品无码素人福利不卡| 国产精品理论片在线观看| 国产精品熟女一区二区三区| 国产午夜亚洲精品国产成人| 99久久国产精品无码| 午夜高清福利在线观看| 国产91久久精品一区二区| 精品国产丝袜自在线拍国语| 亚洲第一二三区日韩国产| 国产一区日韩二区三区| 国产亚洲欧美在线观看三区| 国产成人亚洲欧美二区综合| 久久精品日日躁夜夜躁 | 国语对白在线免费视频| 自拍偷自拍亚洲一区二区| 国产深夜福利在线观看网站| 午夜射精日本三级| 无码人妻aⅴ一区二区三区蜜桃| 亚洲精品尤物av在线网站|