VB.NETでシリアル通信を行う
(その1)
Visual Basicから.NET FrameworkのSerialPortコントロールを使用してシリアルポートからデータの送受信を行うサンプルコードです。
文字列の送受信を行います。
SerialPortクラスの使い方はC#でシリアル通信を行うときと同じです。
作成するサンプルプログラムは以下の仕様にします。
- ウインドウ・スタイルはダイアログにする。
- シリアルポートはユーザーが選択できる。
- ボーレートは、4800bps/9600bps/19200bps/115200bpsからユーザーが選択できる。
- フロー制御をユーザーが選択できる。
- その他の通信設定は固定値とする。
- [接続]ボタンを押すとシリアルポートをオープンし、ボタン表示を[切断]にする。
- [切断]ボタンを押すとシリアルポートをクローズし、ボタン表示を[接続]にする。
- [送信]ボタンを押すと、送信データのテキストボックスから送信する文字列を取得してシリアルポートに送信する。
- シリアルポートから受信したデータは、受信データのテキストボックスに追記する。
サンプルプログラムの外観は以下のようにします。
SerialPortクラスの主なメソッドとプロパティは以下のとおりです。
| クラス名 | System.IO.Ports.SerialPort |
|---|---|
| 基本型 | Component |
| メソッド名 | 説明 |
| GetPortNames | 利用可能なシリアルポート名の配列を取得します。 |
| Open | シリアルポートを接続します。 |
| Close | 接続中のシリアルポートを切断します。 |
| Read | シリアルポートの受信バッファから受信データを読み込みます。 |
| ReadByte | 受信バッファから、受信データを1バイト読み込みます。 |
| ReadChar | 受信バッファから、受信データを1文字読み込みます。 |
| ReadExisting | データ受信待ちをせずに、現在受信バッファにある読込み可能なデータを読み込みます。 |
| ReadLine | 受信バッファから1行分(改行コードまで)の文字列を読み込みます。 |
| ReadTo | 受信バッファから指定した値までの文字列を読み込みます。 |
| Write | シリアルポートの送信バッファに送信データを書き込みます。 |
| WriteLine | 文字列と改行コード(NewLine値)を送信バッファに書き込みます。 |
| プロパティ名 | 説明 |
| PortName | オープンするシリアルポートの名称を設定します。 |
| BaudRate | 通信速度(ボーレート)を設定します。 |
| DataBits | 1バイトのデータビット数を設定します。 |
| Parity | パリティビットを設定します。 |
| StopBits | ストップビットを設定します。 |
| Handshake | フロー制御を設定します。 |
| Encoding | 送信する文字列の文字コードを設定します。 |
| NewLine | 改行コードを設定します。 |
| ReadBufferSize | 受信バッファのサイズを設定します。 |
| WriteBufferSize | 送信バッファのサイズを設定します。 |
| ReceivedBytesThreshold | データ受信イベントが発生する、受信バッファのバイト数を設定します。 |
| ReadTimeout | 受信待ちタイムアウトを設定します。(ms単位) |
| WriteTimeout | 送信完了タイムアウトを設定します。(ms単位) |
| BreakState | ブレーク シグナルを設定します。 |
| DiscardNull | 受信した null バイトを無視するかどうかを設定します。 |
| ParityReplace | パリティエラーの発生したデータを置き換えるデータを設定します。 |
| IsOpen | シリアルポートがオープンしているかどうかを調べます。 |
| BytesToRead | 受信バッファ内にある受信データのバイト数を取得します。 |
| BytesToWrite | 送信バッファ内にある未送信データのバイト数を取得します。 |
| RtsEnable | RTS(Request To Send)信号を設定します。 |
| DtrEnable | DTR(Data Terminal Ready)信号を設定します。 |
| DsrHolding | DSR(Data Set Ready) シグナルの状態を取得します。 |
| CtsHolding | CTS(Clear To Send)信号の状態を取得します。 |
| CDHolding | CD(キャリア検出)信号の状態を取得します。 |
| イベント名 | 説明 |
| DataReceived | シリアルポートでデータ受信が発生したときのイベントを処理するメソッド。 |
| ErrorReceived | シリアルポートで受信エラーが発生したときのイベントを処理するメソッド。 |
| PinChanged | シリアルポートの信号線の状態が変化したときのイベントを処理するメソッド。 |
ダイアログのLoad()メソッドでダイアログの初期処理を行います。
ダイアログの初期処理では、シリアルポート名と通信設定値のコンボボックスを作成します。
サンプルコードを以下に示します。
'****************************************************************************'
'*
'* @brief ダイアログの初期処理.
'*
'* @param [in] sender イベントの送信元のオブジェクト.
'* @param [in] e イベント情報.
'*
'* @retval なし.
'*
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'利用可能なシリアルポート名の配列を取得する.
Dim PortList As String()
PortList = SerialPort.GetPortNames()
cmbPortName.Items.Clear()
'シリアルポート名をコンボボックスにセットする.
Dim PortName As String
For Each PortName In PortList
cmbPortName.Items.Add(PortName)
Next PortName
If cmbPortName.Items.Count > 0 Then
cmbPortName.SelectedIndex = 0
End If
cmbBaudRate.Items.Clear()
'ボーレート選択コンボボックスに選択項目をセットする.
Dim baud As BuadRateItem
baud = New BuadRateItem
baud.NAME = "4800bps"
baud.BAUDRATE = 4800
cmbBaudRate.Items.Add(baud)
baud = New BuadRateItem
baud.NAME = "9600bps"
baud.BAUDRATE = 9600
cmbBaudRate.Items.Add(baud)
baud = New BuadRateItem
baud.NAME = "19200bps"
baud.BAUDRATE = 19200
cmbBaudRate.Items.Add(baud)
baud = New BuadRateItem
baud.NAME = "115200bps"
baud.BAUDRATE = 115200
cmbBaudRate.Items.Add(baud)
cmbBaudRate.SelectedIndex = 1
cmbHandShake.Items.Clear()
'フロー制御選択コンボボックスに選択項目をセットする.
Dim ctrl As HandShakeItem
ctrl = New HandShakeItem
ctrl.NAME = "なし"
ctrl.HANDSHAKE = Handshake.None
cmbHandShake.Items.Add(ctrl)
ctrl = New HandShakeItem
ctrl.NAME = "XON/XOFF制御"
ctrl.HANDSHAKE = Handshake.XOnXOff
cmbHandShake.Items.Add(ctrl)
ctrl = New HandShakeItem
ctrl.NAME = "RTS/CTS制御"
ctrl.HANDSHAKE = Handshake.RequestToSend
cmbHandShake.Items.Add(ctrl)
ctrl = New HandShakeItem
ctrl.NAME = "XON/XOFF + RTS/CTS制御"
ctrl.HANDSHAKE = Handshake.RequestToSendXOnXOff
cmbHandShake.Items.Add(ctrl)
cmbHandShake.SelectedIndex = 0
'送受信用のテキストボックスをクリアする.
SndTextBox.Clear()
RcvTextBox.Clear()
End Sub
使用するシリアルポートをユーザーが選択できるように、利用可能なシリアルポートの名称をSerialPortクラスのGetPortNamesメソッドを利用してコンボボックスにリストアップします。
Public Shared Function GetPortNames As String()
戻り値として利用可能なシリアルポート名のString型の配列を取得します。
設定可能な通信設定としてボーレートとフロー制御のコンボボックスを作成します。