画像ファイル
画像ファイル  C#,VB2005でRS-232Cのループテスト
C# コード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace Rs232cLoopBack
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
SetPortsName();//ポート名を自動的に読み込み

}

//DSR CTSのラベルの色を変えるデリゲート
delegate void dlgChangeLabelColor(Label Lbl,Color Col);

//受信データをテキストボックスに書き込むデリゲート
delegate void dlgsetText(TextBox Tbx,string text);

//エラーログを書き込む
delegate void myDelegate(string str);

//文字を変換するクラスを宣言
Encoding encSjis = Encoding.GetEncoding("shift-jis");
//Encoding encUTF8 = Encoding.GetEncoding("utf-8");
Encoding encUni = Encoding.GetEncoding("unicode");


//起動時にポート名をマシンから取得し、テキストに書き出す
private void SetPortsName()
{
//ポート名を読み込みます
string[] ports = SerialPort.GetPortNames();

//利用出来るポートが2つ有る場合と、1つの場合を分ける。
if (ports.Length >= 2)
{
//ポートが2つ以上有る場合
textBoxPortName1.Text = ports[0];//ポート1をセット
textBoxPortName2.Text = ports[1];//ポート2をセット
groupBox1.Text = ports[0];
groupBox2.Text = ports[1];
}
else if (ports.Length == 1)
{
//ポートが一つの場合
textBoxPortName1.Text = ports[0];
serialPort1.PortName = ports[0];
groupBox1.Text = ports[0];
}
}

//ラベルのバックカラーを変更します
//デリゲートから呼ばれる
private void changeLblColor(Label Lbl, Color Col)
{
Lbl.BackColor = Col;
}



//テキストボックスのテキストを変更しま
//デリゲートから呼ばれる
private void setReadText(TextBox Tbx ,string text)
{
Tbx.AppendText(text);
}

//受信文字を保持するジェネリクス
//Byte配列で受信文字を読み込んだ後、Byte配列からListに1Byteづつ移し替え
//改行が現れたらSift-JisからUnicodeに変換して、デリゲートでメインのTextBox
//に書き込み、書き込み後Listをクリアして次の文字を読み込む。
List<int> lstInt1 =new List<int>() ;
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
dlgsetText dlgTxt = new dlgsetText(setReadText);
//受信文字
byte[] byteRead = new byte[serialPort1.BytesToRead];
//読み込み
serialPort1.Read(byteRead, 0, serialPort1.BytesToRead);

//読み込んだデータをlistで保持
for (int i = 0; i < byteRead.Length ; i++)
{
//Listに追加
lstInt1.Add(byteRead[i]);

//改行が出てきたらListをByte配列に移し替えてテキストボックスに書き込む
if (lstInt1.Count >= 2 && lstInt1[lstInt1.Count - 2] == 13 &&
lstInt1[lstInt1.Count - 1] == 10)
{
//Byte配列に移し替える
byte[] byteTmp = new byte[lstInt1.Count];
for (int j = 0; j < lstInt1.Count; j++)
byteTmp[j] = (byte)lstInt1[j];

//shift-jis からunicodeに変換する
byte[] byteUni = Encoding.Convert(encSjis, encUni, byteTmp);
string strUni = encUni.GetString(byteUni);

//メインスレッドのテキストボックスに書き込む
this.Invoke(new dlgsetText(setReadText), new object[] { textBoxRead1, strUni });
//この書き方でも良い
// dlgsetText dlgset = new dlgsetText(setReadText);
//this.Invoke(dlgset, textBoxRead1, strUni);

//Listをクリアーする
lstInt1.Clear();
}
}
}


List<int> lstInt2 = new List<int>();
private void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
dlgsetText dT = new dlgsetText(setReadText);
//受信文字
byte[] byteRead = new byte[serialPort2.BytesToRead];
//読み込み
serialPort2.Read(byteRead, 0, serialPort2.BytesToRead);

//読み込んだデータをlistで保持
for (int i = 0; i < byteRead.Length; i++)
{
lstInt2.Add(byteRead[i]);
if (lstInt2.Count >= 2 && lstInt2[lstInt2.Count - 2] == 13 && lstInt2[lstInt2.Count - 1] == 10)
{
byte[] byteTmp = new byte[lstInt2.Count];
for (int j = 0; j < lstInt2.Count; j++)
byteTmp[j] = (byte)lstInt2[j];
byte[] byteUni = Encoding.Convert(encSjis, encUni, byteTmp);
string strUni = encUni.GetString(byteUni);

this.Invoke(new dlgsetText(setReadText), new object[] { textBoxRead2, strUni });
//dlgsetText dlgset = new dlgsetText(setReadText);
//this.Invoke(dlgset, textBoxRead2, strUni);
lstInt2.Clear();
}
}
}

//セリアルポートのピンチェンジを検知して、ラベルの色を変える
private void serialPort1_PinChanged(object sender, SerialPinChangedEventArgs e)
{
try
{
//デリゲートのインスタンスを作成
dlgChangeLabelColor aLc = new dlgChangeLabelColor(changeLblColor);
if (e.EventType == SerialPinChange.DsrChanged)
//イベントがDsrChangedだったら
if (serialPort1.DsrHolding == true)
//DSRラベルのバックカラーを変える
this.Invoke(aLc, lblDSR1, Color.LightGreen);
else
this.Invoke(aLc, lblDSR1, Color.Green);
else if (e.EventType == SerialPinChange.CtsChanged)
//イベントがCtsChangeだったら
if (serialPort1.CtsHolding == true)
//CTSラベルのバックカラーを変える
this.Invoke(aLc, lblCTS1, Color.LightGreen);
else
this.Invoke(aLc, lblCTS1, Color.Green);
}
catch { }
}

private void serialPort2_PinChanged(object sender, SerialPinChangedEventArgs e)
{
try
{
dlgChangeLabelColor aLc = new dlgChangeLabelColor(changeLblColor);
if (e.EventType == SerialPinChange.DsrChanged)
if (serialPort2.DsrHolding == true)
this.Invoke(aLc, lblDSR2, Color.LightGreen);
else
this.Invoke(aLc, lblDSR2, Color.Green);
else if (e.EventType == SerialPinChange.CtsChanged)
if (serialPort2.CtsHolding == true)
this.Invoke(aLc, lblCTS2, Color.LightGreen);
else
this.Invoke(aLc, lblCTS2, Color.Green);
}
catch { }

}

//DtrEnableを設定
private void chkDTR1_CheckedChanged(object sender, EventArgs e)
{
serialPort1.DtrEnable =chkDTR1.Checked;
}
//RtsEnableを設定
private void chkRTS1_CheckedChanged(object sender, EventArgs e)
{
serialPort1.RtsEnable = chkRTS1.Checked;
}

private void chkDTR2_CheckedChanged(object sender, EventArgs e)
{
serialPort2.DtrEnable = chkDTR2.Checked;
}

private void chkRTS2_CheckedChanged(object sender, EventArgs e)
{
serialPort2.RtsEnable = chkRTS2.Checked;
}

//送信ボタン押下
private void butSend1_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
string strSend = textBoxWrite1.Text;
//改行が無かったら付け足す
if (!strSend.EndsWith("\r\n"))
strSend += "\r\n";
//'送信文字をShift-jisに変化してをByte配列に格納
Byte[] byteArry = encSjis.GetBytes(strSend);

//送信
serialPort1.Write(byteArry, 0, byteArry.Length);
}
}
//送信ボタン押下
private void butSend2_Click(object sender, EventArgs e)
{
if (serialPort2.IsOpen)
{
string strSend = textBoxWrite2.Text;
//改行が無かったら付け足す
if (!strSend.EndsWith("\r\n"))
strSend += "\r\n";
Byte[] byteArry = encSjis.GetBytes(strSend);

//送信
serialPort2.Write(byteArry, 0, byteArry.Length);

//ログに書き込むテスト
//myDelegate dlg = new myDelegate(setText);
//this.Invoke(dlg, "送信" + textBoxWrite2.Text);
}

}
//テキストボックスクリア
private void butClsWrite1_Click(object sender, EventArgs e)
{
textBoxWrite1.Clear();
}

private void butClsRead1_Click(object sender, EventArgs e)
{
textBoxRead1.Clear();
}

private void butClsWrite2_Click(object sender, EventArgs e)
{
textBoxWrite2.Clear();
}

private void butClsRead2_Click(object sender, EventArgs e)
{
textBoxRead2.Clear();
}

private void button1_Click(object sender, EventArgs e)
{
textBoxErr.Clear();
}
//ポートのオープン
private void butOpen1_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{

serialPort1.Close();
groupBox1.Enabled = false;
butOpen1.Text = "Open";

}
else
{
serialPort1.PortName = textBoxPortName1.Text;
serialPort1.Open();
groupBox1.Enabled = true;
butOpen1.Text = "Close";

}
}
//ポートのオープン
private void butOpen2_Click(object sender, EventArgs e)
{
if (serialPort2.IsOpen)
{
serialPort2.Close();
groupBox2.Enabled = false;
butOpen2.Text = "Open";
}
else
{
serialPort2.PortName = textBoxPortName2.Text;
serialPort2.Open();
groupBox2.Enabled = true;
butOpen2.Text = "Close";
}
}
//エラー又はログの書き込み用
private void setText(string str)
{
textBoxErr.AppendText(str + "\r\n");
}

private void serialPort1_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
{
myDelegate md = new myDelegate(setText);
string se = "エラーserialPort1:" + e.ToString();
this.Invoke(md, se);
}

private void serialPort2_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
{
myDelegate md = new myDelegate(setText);
string se = "エラーserialPort2:" + e.ToString();
this.Invoke(md, se);
}
}
}
画像ファイル    ←  RS-232C ループテスト