データ受信 - Visual Basic 2005 シリアル通信プログラム-

COM1に割り当てたUSB接続のRS-232C 1ポートタイプ COM-1(USB)H で、対象装置からの送信データを受信イベント処理を用いて、非同期に受信バッファからデータを読み込みます。例えば、バーコードがデータを読み取った時点や計測器が計測を終えた時点で受信データを読み込む際に有効な方法です。デリゲートとInvokeメソッドを使用して受信データをテキストボックスに表示するプログラム例です。

使用COMポート COM1
通信速度 9600bps
パリティ設定 なし(None)
データビット長 8ビット
ストップビット 1ビット
ハンドシェイク 使用しない
RTSライン 有効

画面の作成とプロパティ設定

Visual Basic 2005を立ち上げ、新しいプロジェクトを作成し、左図のような画面を作成します。SerialPortコンポーネントを画面に貼り付けます。SerialPortコンポーネントのプロパティの内容を確認します(ボーレートなどの通信設定)。

オブジェクト TextBox1 COM1
オブジェクト Button1 接続
オブジェクト Button2 切断
オブジェクト TextBox2

マルチスレッド処理について

  • DataReceivedイベント(受信イベント)ハンドラはセカンダリスレッド(2次スレッド)から呼び出されます。即ち、受信イベント処理は2次スレッドで行われます。
  • そのためWindows.FormsのUI要素(コントロール)にアクセスする場合はControl.Invoke()メソッドを使用する必要があります。
  • Invokeメソッドを使用することで、コントロールに対する操作をメインスレッドで実行させることが可能です。
  • メインスレッド上で実行したいメソッド(コントロールへの操作を含む)に対応したデリゲートを作成し、そのデリゲートのインスタンスをInvokeメソッドのパラメータで指定して呼び出します。
  • 例えば、タイマイベントの受信時と同様に受信イベント内でフォームのテキストボックスに受信データの表示を行おうとすると、下図のような例外エラーが発生してしまいます。マルチスレッド処理の詳細に関してはVisual Basic 2005のヘルプを参照ください。

プログラム記述例

接続ボタン、切断ボタンクリック時の処理を追加します。Form1.vbに以下のコードを記述します。各オブジェクト(ボタンなど)をダブルクリックすると、ボタンならば、ボタンが押された時の処理を記述するプロシージャが開きます。そこに行いたい処理を記述していきます。

Private Sub Button1_Click(… → 接続ボタンが押されたときの処理
	Try   					'例外処理のはじまり 
   	 If SerialPort1.IsOpen = True Then   		'ポートはオープン済み
	   	MessageBox.Show("エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)                
		Exit Sub
	 End If
	 	SerialPort1.PortName = TextBox1.Text 	'オープンするポート名を格納
	   	SerialPort1.Open() 			                'ポートオープン        
	Catch ex As Exception  			'例外処理            
	  	MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK,MessageBoxIcon.Error)        
	End Try 

	SerialPort1.RtsEnable = True            		'RTSをON
End Sub
Private Sub Button2_Click(… → 切断ボタンが押されたときの処理
	If SerialPort1.IsOpen = True Then        'ポートオープン済み
 	   SerialPort1.Close()                           'ポートクローズ
	End If
End Sub
デリゲートの宣言を行います
	Delegate Sub DataDelegate(ByVal sdata As String)
Invokeメソッドによって呼び出されるメソッド(関数)を定義します
	Private Sub PrintData(ByVal sdata As String)
	 TextBox2.Text = sdata
	End Sub
Private Sub SerialPort1_DataReceived(ByVal・・ → 受信イベントが発生したときの処理を記述します
	Dim ReceivedData As String = " "      	'受信データ用変数を宣言します
	Try
		ReceivedData = SerialPort1.ReadLine 	'データを受信します
	Catch ex As Exception            
		ReceivedData = ex.Message	 	'例外処理を行います
	End Try
'Invokeメソッドにより実行されるメソッドへのデリゲートの宣言を行い、受信データを表示します
	Dim adre As New DataDelegate(AddressOf PrintData)
	Me.Invoke(adre, ReceivedData) 

End Sub