こんにちは。ビジュアルスタジオでC#を使ってWindows Formsアプリを作成しています。質問なんですが、
シリアル通信で豆電球を点灯させたり、消灯させたりしています。
フォームには 送信テキストボックスと受信テキストボックス、送信ボタンとチェックボックス16個あります。
豆電球が16個ついている装置をUSBとつないでます。
チェックボックス1をチェックすると豆電球1が点灯します。チェックを外すと消灯します。
装置とアプリの関係は
・アプリでコマンド値(16進数)をテキストぼっくすに入力して送信ボタンを押すとシリアル通信でそのコマンドを送出する
・コマンド値は豆電球のオンオフをビットパターンで表していて、0x0001=豆電球1~0x8000=豆電球16に対応している。
・コマンド送信を実行すると、コマンド値でビットが1になっている豆電球について、アプリ側ではチェックボックスがオンになり装置側では豆電球が点灯する(ビットが0ならチェックがオフ、豆電球が消灯)
やりたいことは
デバックしてテキストボックスに16進数"mh,ffff"と入力して送信すると豆電球は全部点灯して、フォームのチェックボックスもチェックされた状態になります。
一個の豆電球を点灯させたいときは"aa,1"と送信すれば、豆電球1が点灯しチェックボックス1が自動チェックされます。
そして "?MH" と入力して送信すると
"インデックスの範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。"
パラメータ名:startIndex
と出てきてしまいます。
なんか対処法はないでしょうか?ご教授お願いいたします。
コードは次のようになります。
try
{
//! シリアルポートからテキストを送信する.
serialPort1.Write(data +"\n");
int startIndex = data.IndexOf(",") + 1; // 開始位置","の次の文字
string tValue = data.Substring(startIndex);
//入力された16進数文字列を数値に変換
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);
}
}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/27 01:56
2016/07/27 02:00
2016/07/27 02:29
2016/07/27 02:58