こんにちは。ビジュアルスタジオでC#を使ってWindows Formsアプリを作成しています。質問なんですが、
シリアル通信で豆電球を点灯させたり、消灯させたりしています。
フォームには 送信テキストボックスと受信テキストボックス、送信ボタンとチェックボックス16個あります。
豆電球が16個ついている装置をUSBとつないでます。
チェックボックス1をチェックすると豆電球1が点灯します。チェックを外すと消灯します。
装置とアプリの関係は
・アプリでコマンド値(16進数)をテキストぼっくすに入力して送信ボタンを押すとシリアル通信でそのコマンドを送出する
・コマンド値は豆電球のオンオフをビットパターンで表していて、0x0001=豆電球1~0x8000=豆電球16に対応している。
・コマンド送信を実行すると、コマンド値でビットが1になっている豆電球について、アプリ側ではチェックボックスがオンになり装置側では豆電球が点灯する(ビットが0ならチェックがオフ、豆電球が消灯)
やりたいことは
デバックしてテキストボックスに16進数"mh,ffff"と入力して送信すると豆電球は全部点灯して、フォームのチェックボックスもチェックされた状態になります。
16進数を入力して送信して狙った豆電球を点灯できるのですが、
テキスト送信で "ms,1" と入力し送信したらで豆電球1だけをを点灯し、"mr,1" で消灯する、同じく"ms,2"で豆電球2が点灯し、"mr,2"で消灯する
という風にできていたのですが、16進数に変換されて送信されて"ms,1"入力で豆電球1だけを点滅させるのが他の豆電球も点灯してしまいます。
ms,1 やmr,1などの文字は16進数に変換せずにそのまま送信したいのです。
なんか対処法はないでしょうか?下手な説明で申し訳ないのですがご教授お願いいたします。
コードは次のようになります。
public void sndTextBox_KeyDown(Object sender, KeyEventArgs e)
{
// エンターを押したらテキストが送信される
if (e.KeyCode == Keys.Enter)
{
switch (this.sndTextBox.Text.Trim())
{
case "MS,1":
case "Ms,1":
case "mS,1":
case "ms,1":
this.checkBox1.Checked = true;
break;
case "MR,1":
case "Mr,1":
case "mR,1":
case "mr,1":
this.checkBox1.Checked = false;
break;
case "MS,2":
case "Ms,2":
case "mS,2":
case "ms,2":
this.checkBox2.Checked = true;
break;
case "MR,2":
case "Mr,2":
case "mR,2":
case "mr,2":
this.checkBox2.Checked = false;
break;
}
//! シリアルポートをオープンしていない場合、処理を行わない
if (serialPort1.IsOpen == false)
{
return;
}
//! テキストボックスから、送信するテキストを取り出す
String data = sndTextBox.Text;
//! 送信するテキストがない場合、データ送信は行わない
if (string.IsNullOrEmpty(data) == true)
{
return;
}
try
{
//! シリアルポートからテキストを送信する.
serialPort1.Write(data + "\n");
int startIndex = data.IndexOf(",");
if (startIndex > -1)
{
startIndex = startIndex + 1; // 開始位置","の次の文字
string tValue = data.Substring(startIndex);
int value = Convert.ToInt32(tValue, 16);
for (int i = 1; i <= 16; i++)
{
//画面上の処理対象チェックボックスコントロールを特定
Control[] cs = this.Controls.Find("CheckBox" + i.ToString(), true);
//チェック対象ビットに1が立っていればチェックオン、0ならチェックオフ
((CheckBox)cs[0]).Checked = ((value & (1 << (i - 1))) > 0);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
回答2件
あなたの回答
tips
プレビュー