2010年5月7日 星期五

[vb.net]mscomm32 & RS232功能介紹

VB Communication

  • 以下資料節錄於microsoft msdn的相關說明

MSComm 控制項範例

下面這個簡單的例子,可示範用數據機進行基本的序列通訊:

Private Sub Form_Load ()     ' 儲存輸入字串的暫存區     Dim Instring As String     ' 使用 COM1.     MSComm1.CommPort = 1     ' 連線速度 9600 baud、無同位檢查、資料位元 8、停止位元 1     MSComm1.Settings = "9600,N,8,1"     ' 告訴控制項當使用 Input 時,讀取整個暫存區     MSComm1.InputLen = 0     ' 開啟序列連接埠     MSComm1.PortOpen = True     ' 將 attention 指令送到數據機     MSComm1.Output = "ATV1Q0" & Chr$(13) ' 確定      ' 數據機回應 "OK" 的訊息       ' 等待資料傳回到序列連接埠     Do        DoEvents     Buffer$ = Buffer$ & MSComm1.Input     Loop Until InStr(Buffer$, "OK" & vbCRLF)   ' 從序列連接埠讀取 "OK" 回應資料     ' 關閉序列連接埠     MSComm1.PortOpen = False  End Sub  

使用 Communications 控制項

Communications 控制項可以用來提供簡單的串列埠通訊功能,也可以用來建立功能完全、事件驅動的高階通訊工具。

Communications 控制項

1

Communications 控制項提供了一系列標準通訊指令的介面。您可以使用它來建立與串列埠的連接,並透過串列埠連接到其它通訊週邊設備 (例如數據機),以發出指令,交換資料,以及監視和回應在串列連接中發生的事件和錯誤。

用途

  • 撥打電話號碼。

  • 監視串列埠的輸入資料。

  • 建立功能完備的終端機程式。

範例應用程式:Dialer.vbp 和 VBTerm.vbp

Dialer.vbp 和 VBTerm.vbp 範例程式位於 samples 目錄中,分別用來示範 Communications 控制項的簡單用法與複雜用法。

串列通訊的基本知識

每台電腦都提供了一或多個串列埠。它們被依次命名為:COM1、COM2 等等。在標準的 PC 中,滑鼠通常被連接到 COM1 連接埠。數據機可能連接到 COM2,掃描器連接到 COM3,等等。串列埠提供了電腦與這些外部串列週邊設備之間的資料傳輸通道。

串列埠的功能是作為 CPU 和週邊設備間的程式碼轉換工具。當資料從 CPU 經過串列埠傳送出去時,位元組資料被轉換成串列的位元。在接收資料時,則是將串列的位元轉換成位元組資料。

要完成資料的傳輸,還需要另一個解譯層。在作業系統方面,Windows 使用通訊驅動程式 Comm.drv,以讓應用程式能夠使用標準的 Windows API 函數傳送和接收資料。串列週邊設備製造商則提供硬體驅動程式,以便讓其硬體能與 Windows 連結。在您使用 Communications 控制項時,實際上就是使用了 API 函數,API 函數將被 Comm.drv 解譯並傳輸給週邊設備驅動程式。

Windows 程式設計者必須知道如何與 Windows 溝通。而使用 Visual Basic,您就只需要關心,如何使用 Communications 控制項所提供的 Windows 通訊驅動程式 API 函數的介面。換句話說,您只需要設定和處理 Communications 控制項的屬性和事件就好了。

建立串列埠連線

使用 Communications 控制項的第一步,是建立與串列埠的連線。下表列出了用於建立串列埠連線的屬性:

屬性 描述
CommPort 設定或傳回通訊埠編號。
Settings 以字串型式設定或傳回傳輸速率、同位檢查、資料位元和停止位元。
PortOpen 設定或傳回通訊埠的狀態。以及開啟和關閉連接埠。

開啟串列埠

要開啟串列埠,您可以使用 CommPort、PortOpen 和 Settings 屬性。例如:

'開啟串列埠  MSComm1.CommPort = 2  MSComm1.Settings = "9600,N,8,1"  MSComm1.PortOpen = True  

CommPort 屬性是用來指定要開啟那個串列埠。假如 COM2 上連接了一個數據機,則在上面的例子中,您需要將該值設定為 2 (COM2)才能連接到此數據機。CommPort 屬性值可以設定為 1 到 16 之間的任何值 (預設值為 1),然而,如果您將此值設定為系統中不存在的 COM 連接埠,將會產生錯誤。

Settings 屬性可以用來指定傳輸速率、同位檢查、資料位元數和停止位元數。按照預設值,傳輸速率將被設定為 9600。同位檢查是用來指定資料是否要進行檢查。通常是不需使用,所以設定為「N」。資料位元數指定一個資料區塊的位元數。停止位元則是用來指示資料區 塊是否已接收完畢。

在您指定了要開啟的連接埠,以及如何進行資料通訊之後,就可以使用 PortOpen 屬性建立連接。它是一個布林值,即其值為 True 或 False。當連接埠無效、或者 CommPort 屬性設定有誤、或者此週邊設備不支援指定的設定時,就會產生錯誤、或是外部週邊設備無法正常工作。將 PortOpen 屬性設定為 False 即可關閉連接埠。

使用數據機

在絕大多數情況下,使用 Communications 控制項的目的是讓應用程式能夠使用數據機。利用 Communications 控制項,您將可以使用標準的 Hayes 相容指令集撥電話、或連接到另一數據機。

用 CommPort、Settings 和 PortOpen 屬性建立了串列埠連線之後,您就可以使用 Output 屬性啟動數據機,並與它進行溝通。Output 屬性是用來發出指令,以控制數據機之間的溝通。如下所示:

'啟動數據機,並撥電話號碼。  MSComm1.Output = "ATDT 555-5555" & vbCr  

在上面的範例中,「AT」指令初始化連接,「D」進行撥號,「T」指定使用音調 (而不是脈衝)。輸出到一個終端時必須指定 Return 鍵 (vbCr)。輸出到位元組陣列時,不需要再加一個 Return 字元。

如果指令被正確處理,傳回的結果碼將是「OK」。檢查結果碼即可確定指令是否被正確處理。

詳細資訊 完整的 Hayes 相容指令清單,您可在數據機隨附的文件中找到。

在設計階段設定接收和傳送緩衝區屬性

在連接埠被開啟後,會建立接收和傳送緩衝區。Communications 控制項提供了一系列的屬性,以讓您能夠管理這些緩衝區。在設計階段時,您可以用此控制項的「屬性頁」來設定這些屬性。

在設計階段設定緩衝區屬性

2

緩衝區記憶體分配

InBufferSize 和 OutBufferSize 屬性可用來指定接收和傳送緩衝區的記憶體數量。按照預設值,它們將被分別設定為上圖所示的值。這兩個值設定得越大,應用程式中可用的記憶體就越少。然而, 如果緩衝區太小,您就要冒緩衝區不足的風險,除非您使用「交握 (handshaking)」的方式。

附註 對於現在大多數電腦可使用的記憶體空間,由於有更多的可使用空間,緩 衝區記憶體分配已不在那麼重要了。換言之,可以把緩衝區的值設定得高一些而不影響應用程式的性能。

RThreshold 和 SThreshold 屬性

RThreshold 和 SThreshold 屬性是用來表示在 OnComm 事件發生之前,接收緩衝區或傳送緩衝區中可以接收的字元數。OnComm 事件被用來監視和回應通訊狀態的變化。如果您將每個屬性的值都設定為 0,OnComm 事件就不會發生。如果您將值設定為非零的值 (比如說 1),那麼每當緩衝區中接收到一個字元時,就會產生 OnComm 事件。

詳細資訊 有關這些屬性的詳細資訊,請參閱本主題中的〈OnComm 事件和 CommEvent 屬性〉。

InputLen 和 EOFEnable 屬性

如果您把 InputLen 屬性設定為 0,那麼在使用 Input 屬性時,Communications 控制項將會讀出接收緩衝區中的所有內容。如果您要讀取固定長度格式的資料時,則需要將此屬性設定為合適的值。

EOFEnable 屬性是用來指示在輸入資料期間何時出現檔案結束 (EOF)字元。如果您將此屬性設定為 True,則在發生這種情況的時,資料輸入將會停止,並且產生 OnComm 事件通知使用者。

詳細資訊 請參見本主題的〈管理接收和傳送緩衝區〉和〈OnComm 事件和 CommEvent 屬性〉。

管理接收和傳送緩衝區

如上面所說明的,在開啟連接埠以後,接收和傳送緩衝區就會被建立。接收和傳送緩衝區用來儲存傳入的資料和傳出的資 料。為了讓使用者能夠管理這些緩衝區,Communications 控制項提供了一系列的屬性。利用這些屬性,您將可以放置或擷取資料、傳回每個緩衝區大小、處理文字和二進位數資料。如何正確地管理這些緩衝區是 Communications 控制項應用中的一個重要課題。

接收緩衝區

Input 屬性被用來儲存和接收從接收緩衝區擷取的資料。例如,如果您希望從接收緩衝區擷取資料,並將其顯示在一個文字方塊中,則可以使用下面的程式碼:

TxtDisplay.Text = MSComm1.Input  

如果您需要擷取接收緩衝區中的所有內容,就必須將 InputLen 屬性設定為 0。這可以在設計階段或執行階段設定。

InputMode 屬性可以設定為如下的 Visual Basic 常數:comInputModeText 或 comInputModeBinary,即您可分別以文字或二進位格式接收傳入的資料。此資料將以字串或二進位資料的位元組陣列之形式存取。ANSI 字元集合的資料應使用 comInputModeText;而對其它資料,比如了包含控制字元、Nulll值等的資料,l應使用 comInputModeBinary。

每接收到一個位元組,該位元組都會被移入接收緩衝區,同時 InBufferCount 屬性值會加一。此時,就可用 InBufferCount 屬性來檢查接收緩衝區中位元組的數目。將此屬性的值設定為 0,即可清空接收緩衝區。

傳送緩衝區

Output 屬性被用來對傳送緩衝區發出指令和資料。

與 Input 屬性類似,資料可以用文字或二進位格式傳送。Output 屬性必須用字串傳送文字,或用位元組陣列傳送二進位資料。

您可用 Output 屬性傳送指令、文字字串或位元組陣列資料。例如:

'傳送 AT 指令  MSComm1.Output = "ATDT 555-5555"    '傳送文字字串  MsComm1.Output = " This is a text string "    '傳送位元組陣列資料  MSComm1.Output = Out  

如前面提到的,每傳送一行都必須以 Return 鍵 (vbCr)結束。在上例中,Out 被定義為位元組陣列變數:Dim Out() As Byte。假如它是字串變數,則應定義為:Dim Out() As String。

您可用 OutBufferCount 屬性監看傳送緩衝區中的位元組數目。將該值設定為 0 即可清空傳送緩衝區。

交握協定 (Handshaking)

要保證資料傳輸成功,則您必須對接收和傳送緩衝區進行管理。例如,您必須確保接收資料的速度不超出緩衝區的限制。

交握協定是指一種使資料從硬體連接埠,傳輸到接收緩衝區內部的通訊協定。當串列埠收到一個字元時,通訊週邊設備必須 將它移動至接收緩衝區中,使程式能夠讀取它。如果資料到達連接埠的速度太快,接收緩衝區可能會來不及接收通訊週邊設備移來的資料,交握協定將可以保證不會 由於緩衝區不足,而導致資料遺失。

Handshaking 屬性可以用來指定在應用程式中使用的交握協定。預設情況下,此值將被設定為 comNone。您也可將其設定為下面列出的其它通訊協定:

設定值 數值 描述
comNone 0 不使用交握協定 (預設)
comXOnXOff 1 XOn/XOff 交握。
comRTS 2 RTS/CTS (Request To Send/Clear To Send)交握。
comRTSXOnXOff 3 兩者合用,RTS 交握和 XOn/XOff 交握。

需要使用什麼通訊協定與連接的週邊設備有關。如果您將此值設定為 comRTSXOnXOff,則可以同時支援兩種通訊協定。

在多數情況下。通訊協定本身能處理交握教握。因而,設定此屬性為非 comNone 的其他一些值可能會導致衝突。

附註 如果您將此值設定為 comRTS 或 comRTSXOnXOff,則您必需要將 RTSEnabled 屬性設定為 True,否則雖然能夠連接並傳送資料,但無法接收資料。

OnComm 事件和 CommEvent 屬性

根據應用程式的用途和功能,在連接到其它週邊設備的程序中,以及接收或傳送資料的程序中,您可能需要監視並回應一些 事件和錯誤。

您可以使用 OnComm 事件和 CommEvent 屬性來偵測並檢查通訊事件和錯誤的值。

在發生通訊事件或錯誤時,會引發 OnComm 事件,CommEvent 屬性的值將被改變。因此,在發生 OnComm 事件的時候,如果有必要,您可以檢查 CommEvent 屬性的值。由於通訊 (特別是透過電話線的通訊)是不可預料的,偵測這些事件和錯誤將有助於使應用程式對這些情況作出相對的反應。

下表列出了可能引發 OnComm 事件的通訊事件。對應的值將在發生事件時被寫入 CommEvent 屬性中。

常數 數值 描述
comEvSend 1 傳送緩衝區中的字元數少於 SThreshold。
comEvReceive 2 接收到 RThreshold 個字元。在使用 Input 屬性移除接收緩衝區中的資料之前,此事件將持續產生。
comEvCTS 3 CTS 信號發生變化。
comEvDSR 4 DSR 信號發生變化。此事件僅在 DSR 由 1 變為 0 時發生。
comEvCD 5 CD 信號發生變化。
comEvRing 6 檢測到電話鈴響。某些UART (通用非同步收發器)可能不支援本事件。
comEvEOF 7 收到檔案結束字元 (ASCII 字元 26)。

下列錯誤同樣會引發 OnComm 事件,並且在 CommEvent 屬性中寫入相對的值。

設定值 數值 描述
comEventBreak 1001 收到中斷信號。
comEventFrame 1004 框架 (framing)錯誤。硬體檢測到框架錯誤。
comEventOverrun 1006 連接埠超出限制。在下一個字元到達連接埠之前,前一字元還沒有被從硬體中讀 取走,因而遺失。
comEventRxOver 1008 接收緩衝區溢位。接收緩衝區已沒有空間。
comEventRxParity 1009 同位檢查錯誤。硬體檢測到同位檢查錯誤。
comEventTxFull 1010 傳送緩衝區已滿。在嘗試將字元傳入傳送緩衝區時,此緩衝區已滿。
comEventDCB 1011 在為連接埠擷取週邊設備控制區塊 ( Device Control Block,DCB)時,發生不可預期的錯誤。

沒有留言:

張貼留言