目次
前
次
シリアルインタフェース処理
VS2005、VS2008では、文字コードはUniCodeになっているため
日本語環境で標準のShift-JISに変換しなければなりません。
UniCodeとShift-JISの相互変換に関しては、別の章で説明します。
シリアルインタフェース処理では、送信と受信に分けて処理を
考えなければなりません。
コマンドは、文字列を送信するだけで対応できますが、データ受信は
割込みになるので、2つの処理を記述しなければなりません。
Windowsでは割込みは、通常スレッドで処理するので、ソースコード
の中に以下のステートメントが必要になります。
using System.Threading;
また、入出力が絡むので、IO関連のライブラリを利用することを
指定します。以下のステートメントを書いておきます。
using System.IO;
受信に関しては、2つの処理を考えます。
1つ目は受信処理、もう一方は受信エラー処理です。
受信エラー処理
受信エラーには、次のような要因があります。
- オーバーランエラー
- フレーミングエラー
- バッファオーバーフロー
- RTS-CTS制御エラー
- DTE-DTR制御エラー
- フロー制御エラー
今回は、エラーが発生したことだけをユーザーに
報告するだけにします。
private void sciDTB_ErrorReceived(object sender, System.IO.Ports.SerialErrorReceivedEventArgs e)
{
MessageBox.Show("COM port error !");
}
受信処理
受信はデータが到着したなら、受信バッファからデータを
取得してテキストボックスに表示します。
受信処理のシーケンスを決めます。
- 受信バッファに存在しているデータ数を確認する
- データが存在するときは、すべて読み出す
- データをバイト配列から、文字列に変換
- クラスメソッドを利用して、文字列をテキストボックスに表示
受信処理は上のシーケンスでよいのですが、受信しているときに
エラーが発生することがあり得ます。ケーブルが抜かれただとか
クラスメソッドを実行中にエラーが発生した等です。
エラー処理を実行するには「try catch」を利用します。
ケーブルが抜かれたような場合には、System.IO.IOExceptionの
例外(エラー)が発生します。これをcatchで掴まえて、エラー
処理します。
また、それ以外の例外(エラー)をcatchで掴まえて、エラー
処理します。
まとめると、以下です。
private void sciDTB_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
int length;
string result;
// clear result
result = "";
// get buffer size
length = sciDTB.ReadBufferSize;
if (length > 0)
{
// malloc
char[] rcvData = new char[length + 1];
// get context from receive buffer
sciDTB.Read(rcvData, 0, length + 1);
// copy
for (int i = 0; i < length; i++)
{
result += rcvData[i].ToString();
}
// MessageBox.Show(result);
Invoke(new TextSet(rMyTextBox.SetText), new object[] { result });
}
}
catch (System.IO.IOException myIOe)
{
MessageBox.Show(myIOe.ToString(), "ERROR:IOException");
}
catch (Exception myEx)
{
MessageBox.Show(myEx.ToString(), "ERROR:OTHER ERROR");
}
}
目次
前
次