0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VBで外部機器から測定値をシリアル通信で取得

Posted at

はじめに

やりたいこととしては、外部機器に測定指示を出し、測定値を取得し、それを画面に表示させることです。
本記事では、測定指示と測定値の取得にフォーカスします。
※古いシステムへの導入だったため、ターゲットフレームワークは .NET Framework 2.0 を想定します。

シリアル通信の設定

外部機器とシリアル通信を行うためには、SerialPort クラスを使用します。
まず、シリアルポートの各種設定を行います。
※シリアルポートの設定は環境によって適宜変えてください。

SerialPort2.PortName = "COM6"                   ' ポート番号の設定
SerialPort2.BaudRate = 9600                     ' ボーレートの設定
SerialPort2.Parity = IO.Ports.Parity.None       ' パリティの設定
SerialPort2.DataBits = 8                        ' データビット長の設定
SerialPort2.StopBits = IO.Ports.StopBits.Two    ' ストップビット数の設定
SerialPort2.ReadBufferSize = 4096               ' 入力バッファサイズの設定
SerialPort2.WriteBufferSize = 4096              ' 出力バッファサイズの設定
SerialPort2.Handshake = IO.Ports.Handshake.None ' フロー制御の設定

上記の設定は、外部機器の仕様に応じて適宜変更する必要があります。

シリアルポートのオープンとバッファのクリア

ポートを開く際に、既存のデータを破棄することで、不要なデータを受信しないようにします。

Try
    SerialPort2.Open()
Catch ex As Exception
    MessageBox.Show("シリアルポートを開けませんでした: " & ex.Message)
End Try

SerialPort2.DiscardInBuffer()  ' 受信バッファをクリア
SerialPort2.DiscardOutBuffer() ' 送信バッファをクリア

シリアルポートが正常に開けない場合、エラーメッセージを表示する処理を入れています。

測定指示の送信

測定値を取得するには、まず測定指示を外部機器へ送信します。

Dim strCommand As String = "XXX"  ' 送信コマンド
SerialPort2.WriteLine(strCommand)

測定値の受信

外部機器から送信される測定値を受信し、適切に処理します。

Dim strReadLNG As String = ""

Try
    strReadLNG = SerialPort2.ReadLine()
    If strReadLNG = "" Then
        Console.WriteLine("測定器から値が取得できませんでした。")
    End If
Catch ex As TimeoutException
    Console.WriteLine("【測定値受信エラー】通信に失敗しました: " & ex.Message)
End Try

測定器がデータを送らない場合や、通信がタイムアウトした場合の処理も考慮しています。
しかし、この状態では受信がうまくいきませんでした。
以下の設定を受信の前に追加することで、測定値の受信が正常に行えるようになりました。

SerialPort2.RtsEnable = True

測定値の解析

受信した測定値を解析し、適切に処理します。

If Microsoft.VisualBasic.Left(strReadLNG, 1) = "G" Then
    If Val(Mid(strReadLNG, 3)) > 99999 Then
        Console.WriteLine("異常値検出: " & strReadLNG)
    Else
        Console.WriteLine("取得した測定値: " & Val(Mid$(strReadLNG, 3)))
    End If
Else
    Console.WriteLine("測定値のフォーマットが正しくありません: " & strReadLNG)
End If

ここでは、測定値のフォーマットが正しいかどうかを確認し、異常値(99999以上)を除外する処理を行っています。

まとめ

本記事では、VBで外部機器とシリアル通信を行い、測定指示を送信し、測定値を受信する方法について解説しました。
特に 「SerialPort2.RtsEnable = True」 を設定しないと受信がうまくいかない点に注意が必要です。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?