2011年12月20日 星期二

C# Serial Port Communication #2

我們在前一篇已經學會如何列出電腦上所有的 serial ports,接下來我們將學習 serial port 的使用方法,也就是怎麼開啟以及讀寫 serial port。

Open, Read, Write, Close

在開啟 serial port 之前,必須先設定 serial port。例如,假如你要用 COM5, 通訊設定使用 9600 的速率 (baud), 沒有 parity bit, 每個位元組為 8 個 data bits 加上 1 個 stop bit,那麼就要這樣設定 serial port:

設定好 serial port 後,接著就可以呼叫 SerialPort 物件的 Open() method 打開 serial port。為了預防意外,例如 「serial port 不存在」或是「serial port 已經被其它程式開啟了」等這些狀況,通常我們會把程式碼寫在 try … catch 區塊裏:

打開 serial port 之後,之後便可以用 ReadXXX, WriteXXX 之類的 methods 來讀寫 serial port,這部份後面將以實例介紹。最後,當你不需要使用 serial port 的時候,最好呼叫 Close() method 關閉 serial port 以免佔著資源:

Write 範例

SerialPort 的 Write() method 可以讓我們寫資料到 serial port 上,底下我們將示範 SerialPort.Write() 的使用方法。

程式分成兩個部份,首先是 Arduino 的程式:

這支程式會不斷的讀取 serial port,並且根據收到的字元決定要打開或關掉 LED,如果收到的字元是 '1' 就打開 pin 13 上的 LED,如果收到的字元是 '0' 就關掉 pin 13 上的 LED。請把這支程式上傳到 Arduino 板子上。關於 Arduino 的 Serial Port 通訊,請參考「Arduino 筆記 – Serial Library 介紹」一文。

接著是 C# 的 WriteDemo 範例程式。先說明 WriteDemo 範例程式的 GUI 介面:

image

這個使用介面很簡單:Combobox 上會列出所有 serial ports,按下 Open 會打開所選的 serial port,接著畫面下方的 LED 這個大按鈕會變成 enabled。按下 LED 這個大按鈕,程式會送出 '1' 到 serial port 命令 Arduino 打開 LED,而且 LED 大按鈕 BackColor 會變成草綠色 (LawnGreen):

image
▲ 按下 LED 按鈕 BackColor 會變成草綠色 (LawnGreen)

image
▲ pin 13 上的 LED (L) 會打開

再按一次 LED 這個大按鈕的話,程式就會送出 '0' 到 serial port 命令 Arduino 關掉 LED,而且 BackColor 會還原為白煙色 (WhiteSmoke)。

WriteDemo 程式碼說明

底下摘要說明 WriteDemo 的程式碼。程式一開始會把所有 serial ports 的名稱填到 ComboBox 裏,這很簡單,我們在前一篇看過:

當按下 Open 時,程式會設定 (Setup) 並開啟 serial port:

其中,cbSerialPorts.SelectedItem.ToString() 會傳回目前 Combobox 所選的 serial port。

接著,使用者按下中間 LED 大按鈕的時候,就會執行底下 btnLED_Click() 這個 method:

如果 btnLED 的 BackColor 是 WhiteSmoke 的顏色,程式會送出 '1' 到 serial port 命令 Arduino 打開 LED,而且 LED 大按鈕 BackColor 會變成草綠色 (LawnGreen),如果 btnLED 的 BackColor 是 LawnGreen 的顏色,程式會送出 '0' 到 serial port 命令 Arduino 關掉 LED,而且 LED 大按鈕 BackColor 會變成白煙色 (WhiteSmoke)。

這篇的文章範例程式可以在底下的網址取得:

http://goo.gl/AM5t1

示範影片
動動腦

有了以上的知識後,可以進一步參考 babyfish0226 寫的「C# 控制 ten bar LED」這個範例,相信你現在應該很容易就能看得懂 babyfish0226 的程式。

參考資料

0 意見: