CodeZine(コードジン)

特集ページ一覧

C#で学ぶインターネット時代のシリアル通信(後編)

C#によるシリアル通信を使ったより実践的なアプリケーション作成

  • LINEで送る
  • このエントリーをはてなブックマークに追加
目次

当選発表用ソフト

 立ち上げで、ソフトは通信待ちの状態に入ります。 抽選中コマンド「9」を受け取ると、タイマー割り込みで「抽選中」の画像を表示させます。

 コマンド「0、1、2、3、8」がくると、それぞれの当選番号を表示して、また通信コマンド待ちに入ります。

 このとき、画面右上の[×]ボタンが押されたら、通信待ちを止めて終了させます。

(1)タイマー割り込み

 こちらもタイマー割り込みを使用します。200ms割り込みで使用しています

 具体的なコードは、次のとおりです。

[リスト5]Form1.cs(dispプロジェクト)
private void timer1_Tick(object sender, EventArgs e)
{
  if (dispf == 1)
  {
      this.pictureBox1.Visible = true;
      this.label1.Visible = false;
      this.pictureBox1.Image = Image.FromFile(Application.StartupPath + "\\img\\抽選中01.bmp");
      dispf = 2;
      return;
  }
  if (dispf == 2)
  {
      this.pictureBox1.Visible = true;
      this.label1.Visible = false;
      this.pictureBox1.Image = Image.FromFile(Application.StartupPath + "\\img\\抽選中02.bmp");
      dispf = 1;
  }
  if (dispf == 3)
  {
      this.pictureBox1.Visible = false;
      if (tyuusen == 0)
      {
          this.label1.Text = "特等賞";
          this.label1.ForeColor = Color.Red;
      }
      if (tyuusen == 1)
      {
          this.label1.Text = "一等賞";
          this.label1.ForeColor = Color.Blue;
      }
      if (tyuusen == 2
      {
          this.label1.Text = "二等賞";
          this.label1.ForeColor = Color.Green;
      }
      if (tyuusen == 3)
      {
          this.label1.Text = "三等賞";
          this.label1.ForeColor = Color.Yellow;
      }
      if (tyuusen == 8)
      {
          this.label1.Text = "四等賞";
          this.label1.ForeColor = Color.Black;
      }
      this.label1.Visible = true;
  }
}

 会話のためのdispf変数を作りました。通常は0をセットしています。

 開始処理ルーチンが「9」を受け取ると dispfを1にします。タイマー割り込みでは「抽選中01.BMP」(dispf=1)と「抽選中02.BMP」(dispf=2)を交互に表示しています。これで、見た目は回っているように見えます。結果をもらうとdispfは3が設定されます。タイマー割り込み処理ではdisp=3の時は、受け取ったデータtyuusen変数の内容により、特等賞や一等賞を表示します。

図6 表示画像とファイル名
図6 表示画像とファイル名

(2)処理開始

 Form1_Loadでは自動で画面を出して、外部通信待ちに入ることはできません。「Form1_Activated」を使用しています。ここで、開始処理のサブルーチンを呼んでいます。

 立ち上がってForm1_Activatedイベントハンドラでkaisiサブルーチンを呼びます。この中でRS232Cをオープンします。

受信
受信

 具体的なコードは、次のとおりです。

[リスト6]Form1.cs(dispプロジェクト)
private void Form1_Activated(object sender, EventArgs e)
{
  kaisi();

}
//開始
private void kaisi()
{
  //RS232C OPEN
  SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
  port.DtrEnable = true;
  port.RtsEnable = true;
  port.Open();
  //受信バッファクリア
  port.DiscardInBuffer();

  while (true)
  {
      Application.DoEvents();
      if (endf == 1) break;
      //抽選中確認
      while (true)
      {
          Application.DoEvents();
          if (endf == 1) break;
          if (port.BytesToRead != 0)
          {
              port.Read(data, 0, port.BytesToRead);
              if (data[0] == '9')
              {
                  dispf = 1;
                  //受信バッフアクリア
                  port.DiscardInBuffer();
                  break;        //抽選中
              }
          }
      }
      //当選確認
      while (true)
      {
          Application.DoEvents();
          if (endf == 1) break;
          if (port.BytesToRead != 0)
          {
              port.Read(data, 0, port.BytesToRead);
              if (data[0] == '0') { tyuusen = 0; dispf = 3; break; }
              if (data[0] == '1') { tyuusen = 1; dispf = 3; break; }
              if (data[0] == '2') { tyuusen = 2; dispf = 3; break; }
              if (data[0] == '3') { tyuusen = 3; dispf = 3; break; }
              if (data[0] == '8') { tyuusen = 8; dispf = 3; break; }
          }
      }
  }

  port.Close();
}
//Window右上の[×]を押すとここに来る
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
  endf = 1;
}

 抽選会ソフトと同じようにwhile文でループし、通信を待ちます。

 「9」が受信されると dispfを1にしてwhile文を抜けます。次に結果待ちです。結果の受信によりdispfを3にして、結果をtyuusen変数に設定します。処理はこの2つのwhile文の繰り返しとなります。

 そこで、この2つのwhile文を大きくwhile文で囲んでいます。これで、永久に、抽選中→結果表示を行うことができます。

 これで、少し困ることがあります。終わりたいときどうしよう? ということです。解決策としてApplication.DoEventsメソッドを入れています。Application.DoEventsメソッドで他のキーも受け付けることができるようになっています。Windowの右上の[×]を押したときにForm1_FormClosedイベントハンドラに制御が移ります。ここでendfを1にします。

 whileループのなかでこの変数を見て大きなループからぬけ、RS232Cをクローズします。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:C#で学ぶインターネット時代のシリアル通信

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

  • WINGSプロジェクト 横塚 利津子(ヨコツカ リツコ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5