初心者です。ご質問です。
ビジュアルスタジオ2015でC#を使っています。Windows Formsです。
シリアル通信でパソコンからデータを送って豆電球を光らすということをやっているのですが、
テキストボックスに"a1"と入力して送信したときに
豆電球1を光らせてcheckBox1を自動チェックする、
テキストボックスに"b1"と入力して送信したときに
豆電球2にデータを送ってcheckBox2を自動でチェックさせたいのですが、
どなたかご教授お願いいたします。
データの送信と、テキストボックスの文字を判定してチェックボックスをチェックさせるやり方はできます。
データが豆電球に送られたら自動でcheckBoxをチェックさせるという風にしたいです。
よろしくお願いいたします。
private void richTextBox2_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
//! シリアルポートをオープンしていない場合、処理を行わない if (serialPort1.IsOpen == false) { return; } //! テキストボックスから、送信するテキストを取り出す String data = richTextBox2.Text; //! 送信するテキストがない場合、データ送信は行わない if (string.IsNullOrEmpty(data) == true) { return; } try { //! シリアルポートからテキストを送信する. serialPort1.Write(data +"\n"); //入力された16進数文字列を数値に変換 int value = Convert.ToInt32(data, 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); } //! 送信データを入力するテキストボックスをクリアする. richTextBox2.Clear(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } }
デバックして16進数の文字"ffff"と入力して送信すると、
豆電球16個はつくのですけど、
認識できる数値が見つかりませんでした
と表示されてしまいます。対処法をご教授ください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/22 05:48
2016/07/26 06:05
2016/07/26 06:23
回答5件
0
掲示の質問内容では、ハードウェア(物)が絡む場合は、
掲示不足です。以下の内容でも足りない位です。
(回答者は、貴方の隣に居て、横から一緒に看ている分けではありません、
掲示板に書かれた事から、推測するだけです。)
Text
1PC:シリアル通信 <--------> シリアル通信端末:豆電球1、豆電球2 2 :VS2015/C#、Windows Formプロジェクト 3 :画面上のコントロール 4 : CheckBox1 / CheckBox2 5 : 他には?、 6 : 豆電球1、豆電球2、(機能があれば):点灯、消灯、全消灯 7 : 実行、終了 8PCと、端末側のコマンド、レスポンス 9 10 コマンド:a1 --------> シリアル通信端末:豆電球1-ON 、豆電球2-OFF? 11 <-------- レスポンス:不明、掲示が無い。 12 コマンド:a2 --------> シリアル通信端末:豆電球1-OFF?、豆電球2-ON 13 <-------- レスポンス:不明、掲示が無い。 14 コマンド:消灯 --------> シリアル通信端末:豆電球1-OFF 、豆電球2-OFF 15 <-------- レスポンス:不明、掲示が無い。 16 17端末のレスポンスの有無、 18別なコマンドに、状態のレスポンスが有るか、 19レスポンスの内容に、操作結果があるかどうか 20 無の場合:コマンド送付時に、コマンド出したよ、点灯した筈。というプログラム 21有りの場合では、何が返って来るかで、 22 有り&状態がある。状態によりPC側の画面書換可能 23 有り&別コマンドで状態取得可能:状態により、チェックを付ける。 24 有り&状態がない、コマンドも無い。無の場合と同様 25 26PC側で行う事、出来る事が変わります。 27
コード
↑の様な書式は、投稿時の、</>:コードを押して、「ここに言語を入力:Text」として下さい。
3分でわかるteratail:シンタックスハイライト・マークダウン
投稿2016/07/25 02:36
編集2016/07/25 02:46総合スコア2028
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Windows Formsを使うのですから、イベント(例えば「ボタン1をクリックした」という操作によって起動されるプログラム)を利用する事になります。
mainから始まって順に実行されていくスタイルとは少し雰囲気が違います。
以下のような要素を含むフォーム FormLamp を想定します。
ボタン:
onButton1 : 豆電球1を点灯するボタン。クリックするとonButton1_clickが起動。
onButton2 : 豆電球2を点灯するボタン。クリックするとonButton2_clickが起動。
offButton1 : 豆電球1を消灯するボタン。クリックするとoffButton1_clickが起動。
offButton2 : 豆電球2を消灯するボタン。クリックするとoffButton2_clickが起動。
チェックボックス:
checkBox1
checkBox2
シリアル通信:
serialPort1
===
動作のシナリオ:
<FormLamp>
onButton1がクリックされたら、シリアル通信で"a1"を送信する。そして、checkbox1にマークする。
onButton2だと"a2"を送信する。そしてcheckbox2にマークする
offButon1がクリックされたら、シリアル通信で"b1"を送信する。そして、checkbox1のマークを消す。
onButton2だと"b2"を送信する。そしてcheckbox2にマークを消す。
<相手装置>以下のような動作をするものと想定
シリアル通信で、"a1"を受信したら、豆電球1を点灯。"a2"だと豆電球2を点灯。"b1"を受信したら、豆電球1を消灯。"b2"だと豆電球2を消灯。
そうすると、コードは以下のような感じになります。
本筋でないところは、適宜省略しています。略した箇所は、コメントで(略)と書きます。
public partial class FormLamp : Form { private void FormLamp_Load( object sender, EventArgs e) //フォームが読み込まれる際のイベントです。初期化のコードを書きます。 { // シリアルポートのオープン serialPort1.PortName = "COM11"; // ここにシリアルポートの設定(通信速度指定、ストップビット等々)のコードを書きます(略) // シリアルポートのオープン serialPort1.Open(); } private void FormLamp_FormClosed( object sender, FormClosedEventArgs e) // Formが閉じられる際のイベントです。後始末のコードを書きます。 { // シリアルポートのクローズ serialPort1.Close(); } private void onButton1_Click( object sender, EventArgs e) { // シリアルポートに豆電球1点灯のコマンドを送信 Byte[] dat = = System.Text.Encoding.ASCII.GetBytes("a1"); serialPort1.Write(dat, 0, dat.GetLength(0)); //シリアル通信で"a1"を送信 checkbox1.checked = True; //checkbox1をマークする } // onButton2_Click,offButton1_Click,offButton2_Clickも同様。シリアル通信で送る文字列と、チェックボックスの操作が違うだけです。(略) }
投稿2016/07/23 00:26
総合スコア6915
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/24 13:39
2016/07/25 01:45
2016/07/25 02:01
0
プログラムは1行も作っていないのですか?
何か作っているのでしたら、動かなくてもいいので開示して下さい。
投稿2016/07/22 11:02
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/24 13:27
退会済みユーザー
2016/07/24 15:22 編集
2016/07/25 00:49
退会済みユーザー
2016/07/25 01:47 編集
2016/07/25 02:42
退会済みユーザー
2016/07/25 05:22 編集
2016/07/25 12:53
0
豆電球1にデータを送って光らせた時はcheckBox1を自動チェックする、
豆電球2にデータを送って光らせた時はcheckBox2を自動でチェックさせたいのですが、
そもそもで申し訳ないのですが、
「「豆電球Xを光らせる処理」で、豆電球Xにデータを送り、checkBoxXをチェックする。」
で良いのでは?
C#
1try { 2 //! シリアルポートからテキストを送信する. 3 serialPort1.Write( data ); 4 // ここにdataが"a1"だったらcheckbox1をチェックする処理。 5}
投稿2016/07/22 08:00
編集2016/07/24 14:01総合スコア13521
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/22 08:03
2016/07/22 08:10
2016/07/24 13:48
2016/07/24 14:16 編集
2016/07/25 00:56
2016/07/25 01:08 編集
2016/07/25 01:31
2016/07/25 01:54
2016/07/25 12:53
0
ベストアンサー
チェックボックスをONにするだけなら
c#
1//豆電球1を光らせた 2this.checkBox1.Checked = true; 3 4//豆電球2を光らせた 5this.checkBox2.Checked = true; 6
と書くだけです
恐らく、豆電球1を点灯するコマンド、豆電球2を点灯するコマンド、があって、相手装置はそれらコマンドを受信したら自身のいずれかのランプをONにする仕組みがあるのでしょう
具体的にプログラムのどの部分にどう書けばよいかまでアドバイスが欲しいようでしたら、ソースを開示ください
(追記)
「シリアルポートからテキストを送信する」の処理の後に、テキストボックスの中身を判定して、該当するチェックボックス側をオンにすればよいと思います
こんな感じに
c#
1try { 2 //! シリアルポートからテキストを送信する. 3 serialPort1.Write( data ); 4 switch( data ) { 5 case "a1": 6 //豆電球1を光らせた 7 this.checkBox1.Checked = true; 8 break; 9 case "a2": 10 //豆電球2を光らせた 11 this.checkBox2.Checked = true; 12 break; 13 default: 14 break; 15 } 16 }
ただし、これだとオフにするタイミング
が無いですね
それは大丈夫でしょうか?
ケース1:豆電球は手動で何かをするまで消えないようにできている(電源をオフにする、リセットボタンを押すなど)
→ アプリ側で豆電球の状態を知る方法が無ければ、チェックボックスも手動でオフにするしかないでしょう
ケース2:豆電球はどちらか一方しか点灯しないようにできている(たとえば豆電球1を点灯後、豆電球2をつづけて点灯させると、豆電球1が自動で消える)
→ チェックボックスのオンオフ状態も合わせた方がよいかもしれませんね
具体的には、片方のチェックボックスをオン(true)にしたタイミングにもう片方のチェックボックスをオフ(false)にしてあげればよいでしょう
(追記2)
やること
・エディットボックスに入力される16進数値からビットパターンを抽出
・ビットごとに割り当てられた16個のチェックボックスのON/OFF処理をする
前提
・エディットボックスに入力される文字は 0000 ~ ffff とします(f の場合は 000f と扱います)
・チェックボックスの名前は「checkBox1~checkBox16」と想定します
ざっくりとこんな感じに書けます
c#
1try { 2 //! シリアルポートからテキストを送信する. 3 serialPort1.Write( data ); 4 5 //入力された16進数文字列を数値に変換 6 int value = Convert.ToInt32(data, 16); 7 //1ビット目~16ビット目まで処理 8 for( int i = 1; i <= 16; i++) { 9 //画面上の処理対象チェックボックスコントロールを特定 10 Control[] cs = this.Controls.Find("CheckBox" + i.ToString(), true); 11 //チェック対象ビットに1が立っていればチェックオン、0ならチェックオフ 12 ((CheckBox)cs[0]).Checked = ((value & (1 << (i - 1))) > 0); 13 } 14}
正常ルートだけならこれで動くと思います
必要なら、異常判定処理を追加してください
投稿2016/07/22 07:25
編集2016/07/26 01:31総合スコア3111
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/22 07:51
2016/07/22 08:06
2016/07/24 13:20
2016/07/25 01:28
2016/07/25 01:46
2016/07/25 02:21
2016/07/25 03:17
2016/07/25 05:14
2016/07/25 06:36
2016/07/25 13:01
2016/07/26 01:31
2016/07/26 02:08
2016/07/26 02:19
2016/07/26 02:59
2016/07/26 04:16
2016/07/26 07:16 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。