当選発表用ソフト
立ち上げで、ソフトは通信待ちの状態に入ります。 抽選中コマンド「9」を受け取ると、タイマー割り込みで「抽選中」の画像を表示させます。
コマンド「0、1、2、3、8」がくると、それぞれの当選番号を表示して、また通信コマンド待ちに入ります。
このとき、画面右上の[×]ボタンが押されたら、通信待ちを止めて終了させます。
(1)タイマー割り込み
こちらもタイマー割り込みを使用します。200ms割り込みで使用しています
具体的なコードは、次のとおりです。
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変数の内容により、特等賞や一等賞を表示します。

(2)処理開始
Form1_Loadでは自動で画面を出して、外部通信待ちに入ることはできません。「Form1_Activated」を使用しています。ここで、開始処理のサブルーチンを呼んでいます。
立ち上がってForm1_Activatedイベントハンドラでkaisiサブルーチンを呼びます。この中でRS232Cをオープンします。

具体的なコードは、次のとおりです。
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をクローズします。
