RS-232C Hex表示モニタの作成
RS-232Cの相手のポートからどの様なデータが送信されて来たか、ダンプ(書き出す)したいことが有る。
ここではRS-232CのDataReceivedでデータを受け取り其のデータをHex(16進)でテキストボックス
に書き出すプログラムを作ってみる。
注意することは、serialPortクラスのDataReceivedは別スレッドで呼ばれる為に、
メインスレッドに有るテキストボックスに書き込むためにはデリゲートを使う必要が有ると言う点です。
これに関しては、
「マルチスレッドの基礎」
「デリゲート入門」
「RS-232Cのピンチェンジ表示」
を参考にして下さい。
仕様
先ず画像を御覧下さい。
1、データがHex(ヘキサ)で表示出来ること。
2、一行が16データで、頭に表番号が付くこと。
先ずForm1にlabel1(Label1)、textBox1(TextBOx1)一つずつ置き、それぞれのFontを
「MS ゴシック, 12pt」としておきます。
又テキストボックスのクリアー用のbutton1(Button1)も一つ置きます。
serialPort1(SrialPort1)の設定はコードがみにくくなる為、デフォルトのままにしておきますが、設定が必要なら
ご自分で実装してください。
プログラムをスタートすると直ちにポートがオープンされます、これもオープン クローズが必要な場合は
実装して下さい。
C#のコード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace rs232cTextBox
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//seriapPort1をopenする
serialPort1.Open();
textBox1.Text = "0001:";
}
///
/// テキストボックスにHEX表示を行う
///
/// 表示するデータ
/// 一行の長さの計算
/// 行の番号--5文字、データの長さ 3 x 16 = 48文字、改行--2文字 合計55文字
private void addTextHex(int ivalue)
{
//数値データを大文字2文字のHEXデータに変換する
string strData = Convert.ToString(ivalue, 16).ToUpper();
//2文字の長さにあわせる、一文字の場合は0Aの様に0を加える
strData = strData.PadLeft(2 , '0') +" ";
//テキストボックスに追加
textBox1.AppendText(strData);
//一行の長さが53文字になったら改行を加え
//行の先頭に行番号を加える
if (textBox1.Text.Length % 55 == 53)
{
//改行を加える
textBox1.AppendText(Environment.NewLine);
//**行の先頭に行番号を加える***
//行番号の計算 一行は55文字であるから
int intRno = textBox1.Text.Length / 55 + 1;
//行番号をHEXに直す
string strRno = Convert.ToString(intRno, 16).ToUpper();
//行の番号を4桁に揃え、行番号の最後に「:」を加える
strRno = strRno.PadLeft(4 , '0')+":" ;
//テキストボックスに追加する
textBox1.AppendText(strRno);
}
}
//引数にIntegerを持つデリゲートを宣言する
public delegate void myDelegate(int intdata);
///
/// serialPort1のDataReceivedイベント
///
///
///
private void serialPort1_DataReceived(object sender,
System.IO.Ports.SerialDataReceivedEventArgs e)
{
//メインスレッドのtextBox1にデリゲートを使って書き込む
//デリゲートのインスタンスを作成して、addTextHexの参照を設定する
myDelegate dlgByte=new myDelegate(addTextHex);
//読み取るバイトバッファを設定
byte[] byteRead = new byte[serialPort1.BytesToRead];
//データを読み取る
serialPort1.Read(byteRead,0,serialPort1.BytesToRead);
//デリゲートを使って書き込む
for(int i=0 ;i < byteRead.Length ; i++)
this.Invoke(dlgByte, (Int32)byteRead[i]);
}
//テキストボックスをクリアします
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = "0001:";
}
}
}
VB2005のコード
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Load
'//ポートをオープンする
SerialPort1.Open()
TextBox1.Text = "0001:"
End Sub
'///
'/// テキストボックスにHEX表示を行う
'///
'/// 表示するデータ
'/// 一行の長さの計算
'/// 行の番号--5文字、データの長さ3 x 16 = 48文字、改行--2文字 合計文字
Private Sub AddTextHex(ByVal ivalue As Integer)
'//数値データを大文字2文字のHEXデータに変換する
Dim strData As String = Convert.ToString(ivalue, 16).ToUpper()
'//2文字の長さにあわせる、一文字の場合はAの様に0を加える
strData = strData.PadLeft(2 , "0") & " "
'//テキストボックスに追加
TextBox1.AppendText(strData)
'//一行の長さが文字になったら改行を加え
'//行の先頭に行番号を加える
If TextBox1.Text.Length Mod 55 = 53 Then
'//改行を加える
TextBox1.AppendText(Environment.NewLine)
'//**行の先頭に行番号を加える***
'//行番号の計算 一行は文字であるから
Dim intRno As Integer = TextBox1.Text.Length / 55 + 1
'//行番号をHEXに直す
Dim strRno As String = Convert.ToString(intRno, 16).ToUpper()
'//行の番号を4桁に揃え「:」を加える
strRno = strRno.PadLeft(4 , "0") + ":"
'//行番号の最後に「:」を加える
TextBox1.AppendText(strRno)
End If
End Sub
'//デリゲートの宣言
Public Delegate Sub MyDelegate(ByVal intData As Integer)
'serialPort1のDataReceivedイベント
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, _
ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
Handles SerialPort1.DataReceived
'//メインスレッドのtextBox1にデリゲートを使って書き込む
'//デリゲートのインスタンスを作成して、addTextHexの参照を設定する
Dim dlgByte As MyDelegate = New MyDelegate(AddressOf AddTextHex)
' //読み取るバイトバッファを設定
Dim ByteRead(SerialPort1.BytesToRead - 1) As Byte
'//データを読み取る
SerialPort1.Read(ByteRead, 0, SerialPort1.BytesToRead)
'//デリゲートを使って書き込む
For i As Integer = 0 To byteRead.Length - 1
Me.Invoke(dlgByte, CInt(byteRead(i)))
Next
End Sub
'//テキストボックスをクリアーします
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
TextBox1.Text = "0001:"
End Sub
End Class
|