目次

シリアルインタフェース処理

 VS2005、VS2008では、文字コードはUniCodeになっているため
 日本語環境で標準のShift-JISに変換しなければなりません。

 UniCodeとShift-JISの相互変換に関しては、別の章で説明します。

 シリアルインタフェース処理では、送信と受信に分けて処理を
 考えなければなりません。

 コマンドは、文字列を送信するだけで対応できますが、データ受信は
 割込みになるので、2つの処理を記述しなければなりません。

 Windowsでは割込みは、通常スレッドで処理するので、ソースコード
 の中に以下のステートメントが必要になります。
    using System.Threading;

 また、入出力が絡むので、IO関連のライブラリを利用することを
 指定します。以下のステートメントを書いておきます。
    using System.IO;

 受信に関しては、2つの処理を考えます。

 1つ目は受信処理、もう一方は受信エラー処理です。

受信エラー処理

 受信エラーには、次のような要因があります。  今回は、エラーが発生したことだけをユーザーに  報告するだけにします。 private void sciDTB_ErrorReceived(object sender, System.IO.Ports.SerialErrorReceivedEventArgs e) { MessageBox.Show("COM port error !"); }

受信処理

 受信はデータが到着したなら、受信バッファからデータを  取得してテキストボックスに表示します。  受信処理のシーケンスを決めます。
  1. 受信バッファに存在しているデータ数を確認する
  2. データが存在するときは、すべて読み出す
  3. データをバイト配列から、文字列に変換
  4. クラスメソッドを利用して、文字列をテキストボックスに表示
 受信処理は上のシーケンスでよいのですが、受信しているときに  エラーが発生することがあり得ます。ケーブルが抜かれただとか  クラスメソッドを実行中にエラーが発生した等です。  エラー処理を実行するには「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"); } }
目次

inserted by FC2 system