画像ファイル
画像ファイル RS-232C Hex表示モニタ
RS-232C関係
1RS-232Cの基礎
2RS-232Cの何が変わった..
3SerialPortクラス
4Unicode(ユニコード)の壁
5マルチスレッドの壁
6RS-232C サンプルコード
7RS-232CのHEXモニタ
8RS-232C 送信モジュール
9RS-232Cのループテスト
10RS-232Cのピンチェンジ..

VB.NET C#全般
1羊の皮を着た狼 VB.NET
2Form1、Form2の相互参照
3Form1、Form2の相互参照 2
4VB.NET C# データ型の基本
5VB.NET C# 文字列
6VB.NET タイマー精度
7BackgroundWorkerの魅力1..
8BackgroundWorkerの魅力2..
9VB6のタイマー
10コントロールの配列をインデクサ..
11コントロールの配列はジェネリク..
12インデクサ(C#、VB.NET)
13インデクサでBit操作
14Unicode 入門
15デリゲート入門
16マルチスレッド入門
17イベント入門
18デリゲートとイベント
18インターフェースの基本

RichTextBox関係
1RichTextBoxの不思議
2テキスト色付け高速化計画
3VB.NET RichTextBox1
4VB.NET RichTextBox 2

Socket通信
1C#、VB2005 でSocket通信
2サーバー 複数接続

プロセス間通信
1プロセス間通信(送信側)
2プロセス間通信(受信側)


質問、意見はこちらに
画像ファイル


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

画像ファイル