SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

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

当選発表用ソフト

 立ち上げで、ソフトは通信待ちの状態に入ります。 抽選中コマンド「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をクローズします。

次のページ
シリアル通信の応用

この記事は参考になりましたか?

C#で学ぶインターネット時代のシリアル通信連載記事一覧
この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3788 2009/04/20 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー