何 謂 串 列 通 訊 串 列 通 訊 (Serial Communication) bit8 bit7 bit1 bit0 1 0 0 1 0 0 1 1 data 1 0 0 1 0 0 1 1 bit7 bit8 bit1 bit0 並 列 轉 串 列 1 1 0 0 1 0 0 1 clk Time
串 列 傳 輸 方 式 及 比 較 RS-232,RS-422,RS-485 發 送 接 收 接 收 發 送 共 地 RS-232 單 點 接 (Single-Ended), 傳 輸 距 離 :15m 發 送 接 收 接 收 發 送 共 地 RS-422,485 差 動 訊 號 傳 輸 距 離 :1200m
串 列 埠 的 參 數 串 列 埠 的 參 數 ( 通 訊 協 定 ) 資 料 位 元 : 日 本 PLC 多 用 JIS 字 元 碼 只 用 7 位 元 (ASCII 0~127) 歐 美 多 用 ASCII 碼 8 位 元 起 始 位 元 : 開 始 傳 輸 電 位 從 Hi 變 Low( 固 定 為 1 個 位 元 ) 同 位 位 元 : 防 錯 機 制 分 偶 同 位 (Even Parity) 及 奇 (Odd) 同 位 或 不 加 入 停 止 位 元 : 有 1,1.5,2 位 元 一 般 為 1 個 位 元 傳 送 速 度 : 設 資 料 為 1 個 起 始 位 元 +7 個 資 料 位 元 +1 個 同 位 位 元 +1 個 停 止 位 元 =10 位 元 傳 送 速 度 為 :19200bps(Bit Per Second) 則 每 秒 可 傳 送 1920 byte
電 腦 上 的 串 列 埠 電 腦 上 的 串 列 埠 控 制 台 系 統 裝 置 管 理 員 連 接 埠 串 列 通 訊 方 式 同 步 : 共 同 clk 非 同 步 : 個 自 具 有 獨 立 clk 非 同 步 串 列 通 訊 協 定 傳 輸 率 - 鮑 率 (baud) 每 秒 位 元 bps( bit per second), 資 料 位 元 同 位 位 元 起 始 位 元 停 止 位 元
串 列 埠 的 接 腳 (9 pin) 腳 位 簡 寫 / 出 入 意 義 Pin 1 CD /in 振 鈴 載 波 Pin 2 RXD /in 接 收 資 料 Pin 3 TXD /out 傳 送 資 料 Pin 4 DTR /out Data Terminal Ready Pin 5 GND 接 地 Pin 6 DSR /in Data Set Ready Pin 7 RTS /out Ready To Send Pin 8 CTS /in Clear To Send Pin 9 RI /in Ringing 振 鈴
各 種 串 列 接 線 法 1 2 3 4 6 7 8 9 5 DcD RxD TxD DTR DSR RTS CTS RI GND DcD RxD TxD DTR DSR RTS CTS RI GND 1 2 3 4 6 7 8 9 5 1 2 3 4 6 7 8 9 5 DcD RxD TxD DTR DSR RTS CTS RI GND DcD RxD TxD DTR DSR RTS CTS RI GND 1 2 3 4 6 7 8 9 5 RS-232 最 簡 易 連 接 RS-232 虛 擬 連 接 1 2 3 4 6 7 8 9 5 DcD RxD TxD DTR DSR RTS CTS RI GND DcD RxD TxD DTR DSR RTS CTS RI GND 1 2 3 4 6 7 8 9 5 為 使 兩 台 電 腦 完 成 全 雙 工 交 握 協 定, 須 將 RS-232 連 接 線 之 一 端 打 開 並 將 第 2 腳 與 第 3 腳 4 腳 與 6 腳 第 7 腳 與 第 8 腳 對 調 RS-232 全 雙 工 交 握 協 定
VB2005 串 列 通 訊 類 別 元 件 SerialPort 位 於 System.IO.Port 使 用 方 法 在 程 式 最 前 面 加 入 Imports System.IO.Ports SerialPort 建 構 方 式 名 稱 說 明 SerialPort() SerialPort(IContainer) SerialPort(Str) SerialPort(str,Int32) SerialPort(str,Int32,Parity) SerialPort(str,Int32,Parity,In t32) SerialPort(str,Int32,Parity,In t32,stopbits) 初 始 化 SerialPort 使 用 指 定 的 IContainer 初 始 化 SerialPort 使 用 指 定 的 連 接 埠 初 始 化 SerialPort 上 項 加 上 傳 輸 率 上 項 加 上 同 位 檢 查 初 始 化 SerialPort 上 項 加 上 資 料 位 元 上 項 加 上 停 止 位 元
使 用 工 具 箱 之 SerialPort
SerialPort 常 用 屬 性 BaseStream BaudRate BreakState ByteToRead ByteToWrite CDHolding CtsHolding DataBits DsrHolding DtrEnable Encding Handshake IsOpen NewLine Parity ParityReplace PortName ReadBufferSize ReadTimeOut ReceveBytesThreshold RtsEnable StopBit
公 用 方 法 Close createobref DiscardInBuffer DiscardOutBuffer Dispose Equals GetHashCode GetPortName GetType Open Read Read Byte ReadChar ReadExisting ReadLine ReadTo ToString Write WriteLine
公 用 事 件 DataReceived Disposed ErrorReceived PinChanged 通 訊 錯 誤 事 件 1. Frame: 框 架 錯 誤 一 般 為 傳 輸 協 定 設 定 不 符 2. Overrun: 字 元 緩 衝 區 發 生 滿 溢 下 一 個 字 元 將 遺 失 3. RXOver: 輸 入 緩 衝 區 發 生 溢 位 或 在 EOF 後 還 收 到 字 元 4. RXParity: 硬 體 偵 測 到 同 位 檢 查 錯 誤 5. TXFull: 輸 出 緩 衝 區 已 滿 但 程 式 企 圖 傳 送 字 元
Write 的 多 載 (Overload) SerialPort.Write(str) 將 參 數 字 元 寫 入 並 傳 出 SerialPort.Write(Byte[],Int32,Int32) 將 指 定 位 元 組 數 寫 入 輸 出 緩 衝 區 ( 陣 列 處 理 ) SerialPort.Write(Char[],Int32,Int32) 將 指 定 的 字 元 寫 入 緩 衝 區 WriteLine 將 指 定 字 串 和 NewLine 值 寫 入 緩 衝 區
通 訊 步 驟 方 法 一 IMPORTS System.IO.Port Dim Rs232 as SerialPort 方 法 二 選 擇 工 具 箱 之 SerialPort 元 件 並 將 name 改 成 Rs232 使 用 Open 方 法 打 開 通 訊 埠 ( 須 選 擇 通 訊 埠 編 號 ) 使 用 PinChanged 事 件 判 別 CDHolding CtsHolding DsrHolding 使 用 DtrEnable RtsEnable 達 成 交 握 使 用 Write ReadExisting 傳 送 及 接 收 使 用 完 畢 以 close 關 閉 通 訊 埠
串 列 埠 開 啟 及 使 用 流 程 開 始 加 入 Imports System.IO.Port 宣 告 通 訓 物 件 Dim Rs232 as SerialPort 設 定 通 訊 參 數 進 行 通 訊 埠 操 作 以 Open 方 法 打 開 通 訊 埠 失 敗 成 功 以 Close 關 閉 通 訊 埠 顯 式 錯 誤 訊 息 結 束 串 列 埠 開 啟 及 使 用 流 程
讀 取 電 腦 Com Port 名 稱 方 法 一 : 使 用 My.Computer.Ports.SerialPortName For Each sp As String In My.Computer.Ports.SerialPortName ListBox.Items.add(sp) Next 方 法 二 : 使 用 GetProtNmae 公 用 方 法 For Each sp As String in SerialPort.GetPorttName() CobCom.Iterms.Add(sp) Next 方 法 一 使 用 ListBox 方 法 二 使 用 ComboBox
開 啟 通 訊 埠 1. Rs232.PortName=CmbCom.SelectedItem.Tostring 2. If (Not Rs232.Isopen) Then 3. Rs232.Open() 4. Else 5. MsgBox( 通 訊 埠 已 開 啟 ", MsgBoxStyle.Critical Or _ 6. MsgBoxStyle.OkCancel) 7. end 8. End if 1 使 用 ComboBox 選 取 通 訊 埠 後 以 Rs232.PortNmae 設 定 通 訊 埠 2~8 檢 查 是 否 以 開 啟 通 訓 埠 若 未 開 啟 則 以 Open 方 法 打 開, 若 已 開 啟 則 傳 回 錯 誤 訊 息 並 結 束 程 式
串 列 埠 基 本 實 驗 目 的 : 練 習 通 訊 埠 傳 輸 資 料 步 驟 : 使 用 以 改 裝 之 Rs232 延 長 線 (9 pin 母 / 母 ), 將 pin2, pin3 以 導 線 短 路 開 啟 Vb2005 專 案 使 化 面 如 下 btnopenporton cmbcom btncloseporton picdtr btndtr btndtr picrts picoff picon
將 兩 顆 發 光 二 極 體 分 別 接 在 pin4,pin5 及 pin7 pin5 Pin4(DTR) Pin7(RTS) Pin5(GND) 將 下 列 程 式 鍵 入 執 行 程 式
Imports System.IO.Ports Public Class Form1 ' 表 單 的 Load 事 件 中 先 將 所 有 的 通 訊 埠 先 列 出 來 ' 將 通 訊 埠 排 序, 並 將 第 一 個 通 訊 埠 設 為 預 設 值 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For Each sp As String In SerialPort.GetPortNames() cmbcom.items.add(sp) Next cmbcom.sorted = True ' 排 序 cmbcom.selectedindex = 0 ' 第 一 個 是 預 設 選 項 btndtr.enabled = False btnrts.enabled = False
'************************************************************* ' 開 啟 通 訊 埠 按 鈕 的 Click 事 件 ' 此 事 件 將 設 定 通 訊 埠 參 數, 並 開 啟 通 訊 埠 '************************************************************* Private Sub btnopenport_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnopenport.click Dim mportname As String mportname = cmbcom.selecteditem.tostring ' 欲 開 啟 的 通 訊 埠 RS232.PortName = mportname ' 指 定 通 訊 埠 If Not RS232.IsOpen Then ' 尚 未 開 啟 RS232.Open() ' 開 啟 通 訊 埠 RS232.DtrEnable = False RS232.RtsEnable = False picdtr.image = picoff.image picrts.image = picoff.image btndtr.enabled = True btnrts.enabled = True Else MsgBox("~~ 通 訊 埠 開 啟 錯 誤 ( 通 訊 埠 已 被 開 啟 )~~", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel) End End If
'************************************************************* ' 關 閉 通 訊 埠 按 鈕 的 Click 事 件 ' 以 Close 方 法 關 閉 通 訊 埠, 並 釋 放 物 件 所 佔 用 的 資 源 '************************************************************* Private Sub btncloseport_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btncloseport.click If RS232 Is Nothing OrElse Not RS232.IsOpen Then ' 尚 未 開 啟 MsgBox("~~ 通 訊 埠 尚 未 開 啟 ~~", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel) Else RS232.Close() btndtr.enabled = False btnrts.enabled = False End If '************************************************************* ' 結 束 程 式 按 鈕 的 Click 事 件 ' 此 事 件 將 設 定 通 訊 埠 參 數, 並 開 啟 通 訊 埠 '************************************************************* Private Sub btnend_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnend.click If Not RS232 Is Nothing Then ' 判 斷 是 否 已 建 立 通 訊 物 件 If RS232.IsOpen Then RS232.Close() ' 若 已 開 啟, 就 將 其 關 閉 End If End
' DTR 控 制 按 鈕 的 Click 事 件 ' 此 事 件 將 使 得 DTR 線 路 狀 態 發 生 改 變 Private Sub btndtr_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btndtr.click RS232.DtrEnable = Not RS232.DtrEnable ' 變 更 狀 態 If RS232.DtrEnable Then picdtr.image = picon.image ' 變 更 為 白 色 圖 示 Else picdtr.image = picoff.image ' 變 更 為 紅 色 圖 示 End If ' RTS 控 制 按 鈕 的 Click 事 件 ' 此 事 件 將 使 得 RTS 線 路 狀 態 發 生 改 變 Private Sub btnrts_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnrts.click RS232.RtsEnable = Not RS232.RtsEnable ' 變 更 狀 態 If RS232.RtsEnable Then picrts.image = picon.image ' 變 更 為 白 色 圖 示 Else picrts.image = picoff.image ' 變 更 為 紅 色 圖 示 End If
'************************************************************* ' 通 訊 埠 的 KeyPress 事 件, 在 此 不 讓 使 用 者 輸 入 資 料 '************************************************************* Private Sub cmbcom_keypress(byval sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles cmbcom.keypress e.keychar = ChrW(0) ' 禁 止 使 用 者 在 其 中 輸 入 任 何 的 文 字 End Class 習 題 8-1: 串 列 埠 Digital Out 練 習 增 加 Timer 使 兩 LED 輪 流 閃 滅 使 用 HScrollBar 控 制 閃 動 速 度
串 列 埠 Digital In/Out 實 驗 目 的 : 練 習 串 列 埠 中 Digital IN/Out 步 驟 : 完 成 右 邊 表 單 畫 面 完 成 SerialPinChange 事 件 程 式 執 行 程 式 將 DTR 接 到 DSR 及 CTS 將 RTS 接 到 DCD 及 RI 觀 察 輸 入 情 況 提 示 : 利 用 Timer 使 DTR 及 RTS 自 動 閃 滅
' 通 訊 埠 物 件 的 PinChanged 事 件 程 式 ' 當 有 硬 體 線 路 電 位 發 生 變 化 時, 會 引 發 此 事 件 ' 接 收 的 程 式 可 以 寫 在 此 事 件 程 序 中 Private Sub RS232_PinChanged(ByVal sender As Object, ByVal e As System.IO.Ports.SerialPinChangedEventArgs) Handles RS232.PinChanged Dim pinstate As SerialPinChange = e.eventtype ' 那 一 個 事 件 發 生 Timer1.Enabled = False Select Case pinstate Case SerialPinChange.CDChanged 'CD 發 生 變 化 If RS232.CDHolding Then ' 判 斷 電 位 高 低 picdcd.image = picon.image fdcd = True Else picdcd.image = picoff.image fdcd = False End If Case SerialPinChange.CtsChanged 'CTS 發 生 變 化 If RS232.CtsHolding Then ' 判 斷 電 位 高 低 piccts.image = picon.image fcts = True Else piccts.image = picoff.image fcts = False End If 註 :fdcd,fcts,fdsr 為 布 林 變 數 當 成 旗 標 (flag) 使 用
Case SerialPinChange.DsrChanged 'DSR 發 生 變 化 If RS232.DsrHolding Then ' 判 斷 電 位 高 低 picdsr.image = picon.image fdsr = True Else picdsr.image = picoff.image fdsr = False End If Case SerialPinChange.Ring 'RI 發 生 變 化 If picri.tag = 0 Then ' 由 於 沒 有 相 應 的 屬 性 可 用, 故 以 狀 態 予 以 辨 認 picri.image = picon.image picri.tag = 1 ' 狀 態 記 錄 fri = True Else picri.image = picoff.image picri.tag = 0 ' 狀 態 記 錄 fri = False End If End Select Timer1.Enabled = True
串 列 傳 輸 及 I/O 實 驗 目 的 : 學 習 串 列 資 料 傳 輸 及 I/O 步 驟 : 完 成 以 下 表 單 btnsend btnrec
增 加 下 列 程 式 Private Sub Btnsend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnsender.Click Rs232.Write(Txtsender.Text.ToString) Private Sub BtnRec_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnRecive.Click TxtRecive.Text = Rs232.ReadExisting 將 Rxd(Pin2),TxD(Pin3) 連 接,DTR,DSR 連 接 RTS,CTS 連 接 執 行 程 式, 觀 察 資 料 是 否 正 確 傳 輸 作 業 8-2: 交 握 協 定 通 訊 (p2p 之 bbs): 完 成 兩 台 電 腦 交 握 協 定 通 訊 (1) 以 DTR 通 知 對 方 可 送 資 料 (2) 以 收 到 DSR 才 傳 送 資 料 (3) 在 TxT 顯 示 雙 方 傳 送 資 料
使 用 Timer 自 動 接 收 資 料 實 驗 目 的 : 利 用 Timer 自 動 檢 查 輸 入 緩 衝 區 並 讀 回 資 料 步 驟 : 安 排 表 單 畫 面 如 下
' 開 啟 通 訊 埠 按 鈕 的 Click 事 件 ' 此 事 件 將 設 定 通 訊 埠 參 數, 並 開 啟 通 訊 埠 Private Sub btnopenport_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnopenport.click Dim mportname As String mportname = cmbcom.selecteditem.tostring ' 欲 開 啟 的 通 訊 埠 RS232.PortName = mportname RS232.Encoding = Encoding.ASCII ` 限 定 為 ASCII 字 元 0~127 If Not RS232.IsOpen Then ' 尚 未 開 啟 RS232.Open() ' 開 啟 通 訊 埠 btnsend.enabled = True ' 致 能 傳 送 按 鈕 Timer1.Interval = 100 Timer1.Enabled = True ` 啟 動 Timer Else MsgBox("~~ 通 訊 埠 開 啟 錯 誤 ( 通 訊 埠 已 被 開 啟 )~~", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel) End End If
' 計 時 器 控 制 項 的 Timer 事 件 ' 將 接 收 的 動 作 放 於 其 中, 只 要 有 資 料 就 會 被 接 收 進 來 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim InString As String InString = "" Try ` 使 用 try Catch End Try RS232.ReadTimeout = 1000 ` 加 入 TimeOut 若 超 時 仍 無 資 料 則 為 錯 誤 InString = RS232.ReadExisting() If InString.Length = 0 Then ' 若 無 資 料 則 跳 出 Exit Sub Else txtreceive.text += InString ' 若 有 資 料 則 加 到 接 收 的 文 字 框 End If Catch ex As Exception MessageBox.Show(" 讀 取 錯 誤 :" + ex.tostring, " 錯 誤 通 知 ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End Try
接 收 事 件 處 理 實 驗 目 的 : 利 用 接 收 事 件 完 成 資 料 接 收 步 驟 : 安 排 表 單 如 上 一 實 驗 但 不 使 用 Timer 利 用 DataReceived 配 合 ReceivedBytesThreshold 表 單 畫 面 如 下 鍵 入 以 下 程 式
Imports System.IO.Ports Imports System.Text Public Class Form1 ' 宣 告 一 個 委 派 類 別, 並 宣 告 符 合 函 式 參 數 有 一 個, 而 其 型 態 是 字 串 Delegate Sub SetTextCallback(ByVal InputString As String) ' 表 單 的 Load 事 件 中 先 將 所 有 的 通 訊 埠 先 列 出 來 ' 將 通 訊 埠 排 序, 並 將 第 一 個 通 訊 埠 設 為 預 設 值 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For Each sp As String In SerialPort.GetPortNames() cmbcom.items.add(sp) Next cmbcom.sorted = True ' 排 序 cmbcom.selectedindex = 0 ' 第 一 個 是 預 設 選 項
' 開 啟 通 訊 埠 按 鈕 的 Click 事 件 ' 此 事 件 將 設 定 通 訊 埠 參 數, 並 開 啟 通 訊 埠 Private Sub btnopenport_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnopenport.click Dim mportname As String mportname = cmbcom.selecteditem.tostring ' 欲 開 啟 的 通 訊 埠 RS232.PortName = mportname RS232.Encoding = Encoding.ASCII If Not RS232.IsOpen Then ' 尚 未 開 啟 RS232.Open() ' 開 啟 通 訊 埠 Else MsgBox("~~ 通 訊 埠 開 啟 錯 誤 ( 通 訊 埠 已 被 開 啟 )~~", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel) End End If ' 關 閉 通 訊 埠 按 鈕 的 Click 事 件 ' 以 Close 方 法 關 閉 通 訊 埠, 並 釋 放 物 件 所 佔 用 的 資 源 Private Sub btnclose_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnclose.click If RS232 Is Nothing OrElse Not RS232.IsOpen Then ' 尚 未 開 啟 MsgBox("~~ 通 訊 埠 尚 未 開 啟 ~~", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel) Else RS232.Close() End If
Imports System.IO.Ports Imports System.Text Public Class Form1 ' 宣 告 一 個 委 派 類 別, 並 宣 告 符 合 函 式 參 數 有 一 個, 而 其 型 態 是 字 串 Delegate Sub SetTextCallback(ByVal InputString As String) ' 表 單 的 Load 事 件 中 先 將 所 有 的 通 訊 埠 先 列 出 來 ' 將 通 訊 埠 排 序, 並 將 第 一 個 通 訊 埠 設 為 預 設 值 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For Each sp As String In SerialPort.GetPortNames() cmbcom.items.add(sp) Next cmbcom.sorted = True ' 排 序 cmbcom.selectedindex = 0 ' 第 一 個 是 預 設 選 項
' 開 啟 通 訊 埠 按 鈕 的 Click 事 件 ' 此 事 件 將 設 定 通 訊 埠 參 數, 並 開 啟 通 訊 埠 Private Sub btnopenport_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnopenport.click Dim mportname As String mportname = cmbcom.selecteditem.tostring ' 欲 開 啟 的 通 訊 埠 RS232.PortName = mportname RS232.Encoding = Encoding.ASCII If Not RS232.IsOpen Then ' 尚 未 開 啟 RS232.Open() ' 開 啟 通 訊 埠 Else MsgBox("~~ 通 訊 埠 開 啟 錯 誤 ( 通 訊 埠 已 被 開 啟 )~~", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel) End End If
************************************************************** ' 關 閉 通 訊 埠 按 鈕 的 Click 事 件 ' 以 Close 方 法 關 閉 通 訊 埠, 並 釋 放 物 件 所 佔 用 的 資 源 Private Sub btnclose_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnclose.click If RS232 Is Nothing OrElse Not RS232.IsOpen Then ' 尚 未 開 啟 MsgBox("~~ 通 訊 埠 尚 未 開 啟 ~~", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel) Else RS232.Close() End If ' 結 束 程 式 按 鈕 的 Click 事 件 ' 此 事 件 將 設 定 通 訊 埠 參 數, 並 開 啟 通 訊 埠 Private Sub btnend_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnend.click If Not RS232 Is Nothing Then ' 判 斷 是 否 已 建 立 通 訊 物 件 If RS232.IsOpen Then RS232.Close() ' 若 已 開 啟, 就 將 其 關 閉 End If End
' 通 訊 埠 的 KeyPress 事 件, 在 此 不 讓 使 用 者 輸 入 資 料 Private Sub cmbcom_keypress(byval sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles cmbcom.keypress e.keychar = ChrW(0) ' 禁 止 使 用 者 在 其 中 輸 入 任 何 的 文 字 ' 通 訊 埠 物 件 的 DataReceived 事 件 程 式 ' 當 有 資 料 超 過 ReceivedBytesThreshold 屬 性 設 定 值 會 引 發 此 事 件 ' 接 收 的 程 式 可 以 寫 在 此 事 件 程 序 中 ' 由 於 此 事 件 的 引 發 是 在 另 一 個 執 行 緒, 因 此 必 須 使 用 委 派 來 處 理 Private Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived If e.eventtype <> SerialData.Chars Then Exit Sub ' 判 斷 接 收 的 資 料 是 否 為 字 元 Dim InString As String InString = RS232.ReadExisting ' 取 得 字 串 DisplayText(InString) ' 顯 示 資 料
' 委 派 副 程 式 ' 處 理 上 述 通 訊 埠 的 接 收 事 件 ' 由 於 欲 將 資 料 顯 示 到 接 收 文 字 框 中, 因 此 必 須 檢 查 是 否 由 另 外 的 Thread ' 所 呼 叫 的, 若 是, 則 必 須 先 建 立 委 派 物 件 'Invoke 用 於 在 擁 有 控 制 項 基 礎 視 窗 控 制 代 碼 的 執 行 緒 上 執 行 委 派 Private Sub DisplayText(ByVal comdata As String) ' 如 果 呼 叫 txtreceive 的 是 另 外 的 執 行 緒, 傳 回 True If Me.txtReceive.InvokeRequired Then ' 利 用 委 派 型 別 建 立 委 派 物 件, 並 指 定 委 派 的 函 式 Dim d As New SetTextCallback(AddressOf DisplayText) ' 用 大 括 號 {} 括 住 初 始 值, 藉 以 初 始 化 陣 列 的 值 Me.Invoke(d, New Object() {comdata}) ' 以 指 定 的 引 數 清 單 叫 用 函 式 Else ' 相 同 的 執 行 緒 txtreceive.text += comdata ' 將 收 到 的 資 料 入 接 收 文 字 框 中 End If ************************************************************** ' 傳 送 按 鈕 的 Click 事 件 ' 以 Write 方 法 送 出 文 字 框 內 的 資 料 Private Sub btnsend_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnsend.click RS232.Write(txtSend.Text & vbcr) End Class
' 結 束 程 式 按 鈕 的 Click 事 件 ' 此 事 件 將 設 定 通 訊 埠 參 數, 並 開 啟 通 訊 埠 Private Sub btnend_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnend.click If Not RS232 Is Nothing Then ' 判 斷 是 否 已 建 立 通 訊 物 件 If RS232.IsOpen Then RS232.Close() ' 若 已 開 啟, 就 將 其 關 閉 End If End ' 通 訊 埠 的 KeyPress 事 件, 在 此 不 讓 使 用 者 輸 入 資 料 Private Sub cmbcom_keypress(byval sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles cmbcom.keypress e.keychar = ChrW(0) ' 禁 止 使 用 者 在 其 中 輸 入 任 何 的 文 字 ' 通 訊 埠 物 件 的 DataReceived 事 件 程 式 ' 當 有 資 料 超 過 ReceivedBytesThreshold 屬 性 設 定 值 會 引 發 此 事 件 ' 接 收 的 程 式 可 以 寫 在 此 事 件 程 序 中 ' 由 於 此 事 件 的 引 發 是 在 另 一 個 執 行 緒, 因 此 必 須 使 用 委 派 來 處 理 Private Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived If e.eventtype <> SerialData.Chars Then Exit Sub ' 判 斷 接 收 的 資 料 是 否 為 字 元 Dim InString As String InString = RS232.ReadExisting ' 取 得 字 串 DisplayText(InString) ' 顯 示 資 料
' 委 派 副 程 式 ' 處 理 上 述 通 訊 埠 的 接 收 事 件 ' 由 於 欲 將 資 料 顯 示 到 接 收 文 字 框 中, 因 此 必 須 檢 查 是 否 由 另 外 的 Thread ' 所 呼 叫 的, 若 是, 則 必 須 先 建 立 委 派 物 件 'Invoke 用 於 在 擁 有 控 制 項 基 礎 視 窗 控 制 代 碼 的 執 行 緒 上 執 行 委 派 Private Sub DisplayText(ByVal comdata As String) ' 如 果 呼 叫 txtreceive 的 是 另 外 的 執 行 緒, 傳 回 True If Me.txtReceive.InvokeRequired Then ' 利 用 委 派 型 別 建 立 委 派 物 件, 並 指 定 委 派 的 函 式 Dim d As New SetTextCallback(AddressOf DisplayText) ' 用 大 括 號 {} 括 住 初 始 值, 藉 以 初 始 化 陣 列 的 值 Me.Invoke(d, New Object() {comdata}) ' 以 指 定 的 引 數 清 單 叫 用 函 式 Else ' 相 同 的 執 行 緒 txtreceive.text += comdata ' 將 收 到 的 資 料 入 接 收 文 字 框 中 End If