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型の配列を取得します。
設定可能な通信設定としてボーレートとフロー制御のコンボボックスを作成します。