どうも!リョクちゃです。
今回はVB.Netで何らかの機器とシリアル通信をする方法について、
例を交えて簡単に紹介していきます。
シリアル通信を学んで様々な機器と接続をし、危機からのデータの取得や
機器の制御などができるようになるお手伝いができればなと思っております。
ちなみに前回はこちら
目次
準備編
VisualStudio2019を使って、Windowsフォームアプリケーションを作成していきます。
最初の手順については、下記記事をご参照ください。
シリアル通信とは
インターネットで検索すると、以下のような回答がヒットします。
シリアル通信(シリアルつうしん、英: Serial communication)は、電気通信において伝送路上を一度に1ビットずつ、逐次的にデータを送ることをいう。
1ビットは0や1のデータを指します。
シリアル通信には以下の規格があります。
- RS-232C
D-Sub25ピンまたはD-Sub9ピン(接続コネクタ)
正式名称:ANSI/EIA-232-E - RS-422A
各信号線の目的やタイミングは規定されています。
接続コネクタの規定はありません。
主にD-Sub25ピンやD-Sub9ピンが採用されています。 - RS-485
RS-422Aの上位互換の規格
正式名称:EIA-485
といった規格があり、主にはRS-232やRS-485が使われているのではないでしょうか。
主なパラメータごとの特徴は以下のようになります。
パラメータ | RS-232C | RS-422A | RS-485 |
伝送モード | シンプレックス | マルチポイント シンプレックス | マルチポイント マルチプレックス |
最大接続台数 | 1ドライバ 1レシーバ | 1ドライバ 10レシーバ | 32ドライバ 32レシーバ |
最大伝送速度 | 20[kbps] | 10[Mbps] | 10[Mbps] |
最大ケーブル長 | 15[m] | 1200[m] | 1200[m] |
特徴 | 短距離 全2重通信 1:1 | 長距離 全2重半2重通信 1:N | 長距離 全2重半2重 N:N |
フォームの作成
今回、以下のフォームを作成します。
各1~21までのコントロールの名称やテキストは以下のように設定しています。
No | コントロール | 名前 | テキスト |
---|---|---|---|
1 | GroupBox | gbBaudrate | ボーレート(bit/sec) |
2 | RadioButton | rb57600 | 56700 |
3 | RadioButton | rbs38400 | 38400 |
4 | RadioButton | rbs19200 | 19200 |
5 | RadioButton | rbs9600 | 9600 |
6 | RadioButton | rbs4800 | 4800 |
7 | GroupBox | gbDataLength | データ長 |
8 | GroupBox | gbParity | パリティ |
9 | RadioButton | rbSeven | 7ビット |
10 | RadioButton | rbEight | 8ビット |
11 | RadioButton | rbEven | 偶数 |
12 | RadioButton | rbOdd | 奇数 |
13 | RadioButton | rbNone | なし |
14 | GroupBox | gbStopBit | ストップビット |
15 | Label | lbComPort | COMポート名 |
16 | RadioButton | rbOne | 1ビット |
17 | RadioButton | rbTwo | 2ビット |
18 | Button | btnConnect | 接続 |
19 | ComboBox | cbComport | |
20 | Button | btClose | 非接続 |
21 | RitchTextBox | rtxSerial |
実行環境
筆者の実行環境は、
- VisualStudio2019
- Windows 10 64bit
- .Net Framework 4.5.1
になります。
※ Windows7 8 8.1でも動作はできますが、画面デザインの表示が変わるかもしれません。
アプリケーションの目的
各通信パラメータを選択し、接続ボタンを押すことで機器との接続が成功した場合には、
rtxSerialに接続成功が出ることを確認し、
データが受信できる機器であれば受信ができることを目的とします。
受信ができない場合は、接続のみ確認できることを目的とします。
プログラム編
定数・変数宣言
定数と変数には、それぞれ通信パラメータで必要となる変数を準備します。
1 2 3 4 5 6 7 8 9 10 11 12 |
#Region "定数宣言" Private Const DataLength_Seven As Integer = 7 Private Const DataLength_Eight As Integer = 8 #End Region #Region "変数宣言" Private mBaudRate As Integer = Nothing ' 通信速度(機器側) Private mDataLength As Integer = Nothing ' データ長 Private mStopBits As StopBits = Nothing ' ストップビット Private mParity As Parity = Nothing ' パリティ WithEvents mSerialPort As SerialPort = Nothing ' 通信用シリアルポート変数 #End Region |
#Region~#End Regionと書くことで、コードをわかりやすいように
ブロックごとに分けています。(今までの記事では書いていませんでした。。。)
通信速度用に以下の列挙体を準備しておきます。
1 2 3 4 5 6 7 8 9 |
#Region "列挙体" Public Enum BaudrateList BR1 = 57600 BR2 = 38400 BR3 = 19200 BR4 = 9600 BR5 = 4800 End Enum #End Region |
フォーム起動時の処理
フォーム起動時には以下の処理を行います。
1 2 3 4 5 6 7 8 9 |
#Region "画面ロード" Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'コムポート取得 Call SetComPort() End Sub #End Region |
PCに接続されているCOMポートを取得する関数を作成し、呼び出しています。
COMポート取得関数
COMポートを取得し、コンボボックスのcbComportに値をセットしています。
1 2 3 4 5 6 7 8 9 10 11 |
#Region "COMポート処理" ''' <summary> ''' コンボボックスへ接続されているCOMを追加 ''' </summary> Private Sub SetComPort() Dim subName As String = "SetComPort" For Each strComPort As String In SerialPort.GetPortNames cbComport.Items.Add(strComPort) Next strComPort End Sub #End Region |
ボタン押下時の処理
ボタンが押されたら、以下の処理を行います。
- SerialPort変数の初期化
- 各通信パラメータ(ストップビット、パリティ除く)入力値チェック
- シリアル通信開始
- 成功時、接続成功とrtxSerialに表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#Region "ボタン押下処理" ''' <summary> ''' シリアル機器接続 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btConnect_Click(sender As Object, e As EventArgs) Handles btConnect.Click mSerialPort = New SerialPort 'ボーレート If mBaudRate = Nothing Then MessageBox.Show("ボーレートが選択されていません。") Return End If mSerialPort.BaudRate = mBaudRate 'データビット If mDataLength = Nothing Then MessageBox.Show("データ長が選択されていません。") End If mSerialPort.DataBits = mDataLength 'COMポート If cbComport.Text = "" Then MessageBox.Show("COMポートが選択されていません。") Return End If mSerialPort.PortName = cbComport.SelectedItem.ToString() 'シリアル接続 mSerialPort.Open() rtxSerial.Text = "接続成功" End Sub |
通信パラメータに関する処理
シリアル通信の接続をするにあたって、通信時のパラメータがあります。
このパラメータが通信側の機器とあっていないと正しく通信ができないので、
注意が必要です。
通信パラメータには主に以下の項目があります。
- 通信速度(ボーレート[bit/sec])
- データ長(DataBits)
- パリティ(Parity)
- ストップビット(StopBits)
- COMポート
各通信パラメータのラジオボタンがチェックされたとき、以下の処理をそれぞれ行います。
ボーレート(通信速度)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
#Region "ボーレート処理" ''' <summary> ''' 通信速度57600(bit/sec) ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub rb57600_CheckedChanged(sender As Object, e As EventArgs) Handles rb57600.CheckedChanged Dim subName As String = "rb57600_CheckedChanged" If rb57600.Checked Then Me.mBaudRate = BaudrateList.BR1 Else Me.mBaudRate = Nothing End If End Sub ''' <summary> ''' 通信速度38400(bit/sec) ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub rb38400_CheckedChanged(sender As Object, e As EventArgs) Handles rb38400.CheckedChanged Dim subName As String = "rb38400_CheckedChanged" If rb38400.Checked Then Me.mBaudRate = BaudrateList.BR2 Else Me.mBaudRate = Nothing End If End Sub ''' <summary> ''' 通信速度19200(bit/sec) ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub rb19200_CheckedChanged(sender As Object, e As EventArgs) Handles rb19200.CheckedChanged Dim subName As String = "rb19200_CheckedChanged" If rb19200.Checked Then Me.mBaudRate = BaudrateList.BR3 Else Me.mBaudRate = Nothing End If End Sub ''' <summary> ''' 通信速度9600(bit/sec) ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub rb9600_CheckedChanged(sender As Object, e As EventArgs) Handles rb9600.CheckedChanged Dim subName As String = "rb9600_CheckedChanged" If rb9600.Checked Then Me.mBaudRate = BaudrateList.BR4 Else Me.mBaudRate = Nothing End If End Sub ''' <summary> ''' 通信速度4800(bit/sec) ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub rb4800_CheckedChanged(sender As Object, e As EventArgs) Handles rb4800.CheckedChanged Dim subName As String = "rb4800_CheckedChanged" If rb4800.Checked Then Me.mBaudRate = BaudrateList.BR5 Else Me.mBaudRate = Nothing End If End Sub #End Region |
データ長(データビット)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#Region "データビット処理" ''' <summary> ''' データビット 7ビット ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub rbSeven_CheckedChanged(sender As Object, e As EventArgs) Handles rbSeven.CheckedChanged Dim subName As String = "rbSeven_CheckedChanged" If rbSeven.Checked Then Me.mDataLength = DataLength_Seven Else Me.mDataLength = Nothing End If End Sub ''' <summary> ''' データビット 8ビット ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub rbEight_CheckedChanged(sender As Object, e As EventArgs) Handles rbEight.CheckedChanged Dim subName As String = "rbEight_CheckedChanged" If rbEight.Checked Then Me.mDataLength = DataLength_Eight Else Me.mDataLength = Nothing End If End Sub #End Region |
ストップビット
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#Region "ストップビット" ''' <summary> ''' ストップビット 1ビット ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub rbOne_CheckedChanged(sender As Object, e As EventArgs) Handles rbOne.CheckedChanged Dim subName As String = "rbOne_CheckedChanged" If rbOne.Checked Then Me.mStopBits = StopBits.One Else Me.mStopBits = Nothing End If End Sub ''' <summary> ''' ストップビット 2ビット ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub rbTwo_CheckedChanged(sender As Object, e As EventArgs) Handles rbTwo.CheckedChanged Dim subName As String = "rbTwo_CheckedChanged" If rbTwo.Checked Then Me.mStopBits = StopBits.Two Else Me.mStopBits = Nothing End If End Sub #End Region |
パリティ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#Region "パリティ処理" ''' <summary> ''' 偶数 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub rbEven_CheckedChanged(sender As Object, e As EventArgs) Handles rbEven.CheckedChanged Dim subName As String = "rbEven_CheckedChanged" If rbEven.Checked Then Me.mParity = Parity.Even Else Me.mParity = Nothing End If End Sub ''' <summary> ''' 奇数 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub rbOdd_CheckedChanged(sender As Object, e As EventArgs) Handles rbOdd.CheckedChanged Dim subName As String = "rbOdd_CheckedChanged" If rbOdd.Checked Then Me.mParity = Parity.Odd Else Me.mParity = Nothing End If End Sub ''' <summary> ''' なし ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub rbNone_CheckedChanged(sender As Object, e As EventArgs) Handles rbNone.CheckedChanged Dim subName As String = "rbNone_CheckedChanged" If rbNone.Checked Then Me.mParity = Parity.None Else Me.mParity = Nothing End If End Sub #End Region |
データ受信に関する処理
機器から何らかのデータを受信したとき、以下の処理を行います。
このアプリケーションでは、受け取った値をConsole.WriteLine()で出力します。
と記述することで通信された機器からデータを受信することができます。
また、mSerialPort.DataReceivedのイベントを書くことで、
機器からデータを受信したときにイベントが発生がされるので逐一データの出力がされます。
1 2 3 4 5 6 7 8 9 10 |
#Region "データ受信イベント" Private Sub mSerialPort_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles mSerialPort.DataReceived '受信データ格納変数 Dim mRecvData As String = mSerialPort.ReadLine() Console.WriteLine(mRecvData) End Sub #End Region |
実行編
それでは実行していきます。
プログラム起動時
通信パラメータ選択時
接続ボタン押下後、接続成功メッセージを表示
データ受信に関しては、手元になかったので後日改めて実行後書き足していきます。。。
続編として、以下の記事を作成しました。
ArduinoProMini互換機からデータを受信する記事になっています。
まとめ
VB.Netによるシリアル通信の接続や通信先の機器からデータの受信について、
紹介していきました。
シリアル通信では通信先のパラメータが正しく合致していないと
通信が正常に行われないので通信先のパラメータを
よく確認したうえで通信をするようにしましょう。
たとえ通信ができてもボーレートの違いによってデータの受信に失敗することもあります。
読者の方の少しでも参考になれば嬉しいです。
最後までご覧いただきありがとうございます。
・こちらの書籍を参考にVB.Net勉強しています。