Serial Port 系列(4) 基本篇--基本屬性

噹噹噹!感謝各位耐心等候,終於要開始進入基本程式。且慢!先來把建構函式和基本屬性走過一遍吧。

       噹噹噹!感謝各位耐心等候,終於要開始進入基本程式。且慢!先來把建構函式和基本屬性走過一遍吧。

      

       SerialPort.PortName 屬性

       PortName這個屬性值代表的是所要使用的序列埠名稱,型別則是String;一般來說都是COM加上一個數字,比方COM1、COM2或是COM58之類的,有趣的是不知道會不會有不是COM開頭的PortName,所以這個屬性才特別用String型別,不過我是沒有見過這樣的情形。如下圖所示,我們可以從[裝置管理員]的[連接埠]這部份來看到目前可以使用的序列埠。

2012-01-05_152543

          

      SerialPort.BaudRate 屬性

       BaudRate屬性代表的是傳輸速率,就是一秒傳幾個鮑(Baud),這個值的型別是Int32,基本上就是個數字,但不代表你可以亂設一通,因為這個值和你所要傳輸的設備的設定必須相符 (再次提醒,請先看設備相關的手冊);比較常見的都是1200的倍數 (你如果開Windows上關於COM Port BaudRate設定畫面還會看到更小的數字),但是有些設備會呈現一些很奇妙的數字,根據我得到的馬路消息,這是因為該設備的震盪頻率比較奇怪導致的,這樣的狀況解決方法是 (1) 你用了一個高級的序列埠允許你設定奇怪的 BaudRate (2) 叫設備廠商改電路。因為如果你硬用一個不對稱的BaudRate去做通訊,下場就是不斷地掉資料。關於這個,我找到一篇有趣的文章[8051 UART Baudrate Setting ]大致有說明硬體工程師怎麼算出Baud Rate的,如果你的設備廠商硬是不懂這個怎麼調整,就丟這個文章給他看。

 

       Baud Rate的一個Baud並不一定代表1bits,只是恰好在電腦設備上的定義上會相等,Baud Rate原意指的是每一秒所能產生的最大電壓改變率,因為在電腦上的應用只有高低電位(也就是代表0和1,在RS232上一般性的定義上當訊號線減去基準線電壓值為 -3~-15V時代表1;值為+3~+15V時則為0),因此正好會讓一個Baud等於1bit 。

 

       SerialPort.Parity 屬性

       這個屬性代表的是資料的同位元檢查,此屬性的值是Parity 列舉型別,如下表整理 (資料來源:MSDN文件庫):

成員 說明
None 不發生同位檢查。
Odd 設定同位檢查位元,以便位元集計數為奇數。
Even 設定同位檢查位元,以便位元集計數為偶數。
Mark 將同位檢查位元集保持為 1。
Space 將同位檢查位元集保持為0。

      

       非常慚愧,Mark和Space我還真的沒用過,所以沒辦法解釋這兩個在同位元檢查倒底怎麼一回事,唯一我比較清楚的一點是在通用文件中Mark恆代表1(-3V~-15V低電位)、而Space恆代表0(+3~+15V高電位)。所以這邊我們先談None、Odd與Even。

       (1) 同位元檢查的目的是為了確保資料的正確性。

       (2) Parity.None:None 就是不做任何同位元檢查。

       (3) Parity.Odd:奇同位,這表示當資料位元拆解成二進位時,要使1的個數保持為奇數,假設資料位元是 00000111,這時有三個1,奇同位的狀況則傳輸的值會成為000001110。

       (4) Parity.Even:偶同位則是將1的個數保持為偶數,資料位元 00000111則成為000001111。

 

       SerialPort.DataBits 屬性

       DataBits就是資料的長度,雖然它是個Int32型別,但是值會被限制在5~8之間,最常見的資料位元長度是8 bits,不過日系的設備常會見到7 bits的要求。如果你設定了一個範圍外的數值,會產生以下的例外狀況。

2012-01-11_155347

      

       SerialPort.StopBits 屬性

       StopBits就是資料停止位元,代表這組資料單元到此為止,屬性值的型別是StopBits 列舉型別,如下表整理 (資料來源:MSDN文件庫):

成員 說明
None 未使用停止位元。 StopBits 屬性不支援這個值。
One 使用一個停止位元。
Two 使用兩個停止位元。
OnePointFive 使用 1.5 個停止位元。

 

       資料傳輸的內容

       談了這些基本屬性後不得不提一下序列埠的資料傳輸內容,也就是每個資料單元是如何構成的。

       (1) 當同位元檢查為None時:資料單元=起始位元+資料位元組+停止位元組,舉個例子來說如果DataBits=8且StopBits=2的情形,一個資料單元的長度就是 1+8+2=11。

       (2) 當同位元檢查為Odd或Even時:資料單元=起始位元+資料位元組+同位元檢查位元+停止位元組,以上面的例子則長度變成 1+8+1+2=12。

 

       這也說明了一件事情,假設傳輸率在9600 bps而DataBits=8、StopBits=2且具備同位元檢查的狀態下,每秒可以傳輸的資料 (此處資料單指我們在軟體中從序列埠緩衝區可獲取的資料) 理論最大值並不是 9600 / 8=1200 Bytes,而是 9600 / 12=800 Bytes。

      

       基本屬性介紹到這邊,下一篇來聊聊建構函式。

 

       [延伸閱讀 MSDN文件庫 SerialPort 類別 ]