質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.76%

テキスト入力で16進数に変換されてしまう

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,952

ncncup

score 13

こんにちは。ビジュアルスタジオで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);
}

}

}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Zuishin

    2016/07/27 12:33

    インデントが外れていますよ。読みにくいので直してください。

    キャンセル

  • KIYOSHI

    2016/07/27 13:03

    ちょっと質問がちがうんですが、連投されていますね。
    色々ためされているんでしょうが、
    もう他の質問と同じようなないようですのでどちらかに絞った方がいいと思います。

    キャンセル

  • KoichiSugiyama

    2016/07/27 13:14

    「変な感じに点灯しています」とはどんな状態でしょうか?"MS,1"を送った場合、どの豆電球が点灯するのでしょうか?現象が安定しないのなら安定しない、と書いてもらわないと、状況が把握できません。
    あと勘違いしていたら申し訳ないのですが、送信データが"MS,ffff"だとうまくいくが、"MS,1”だとうまくいかないとのことですが、使用しているのがSystem.IO.Ports.SerialPortだとすると、単純にWrite()で文字列を書き込んで送信しているだけのはずですので、受信側で”MS,1"を自動で"MS,0001"と解釈してくれないと上手くいかないと思いますが、そのあたりの仕様はどうなっていますか?

    キャンセル

回答 2

checkベストアンサー

+2

"MS,1"の1が16進数に変換されて送られてはないと思います。
[追加情報依頼]に書かれているかたもいらっしゃいますが、
MS,0001と送らないと認識しないのではないでしょうか?


追記  

コメントにともない、"MS,"で始まる場合は、
","以降を10進数としてBit変換し、16進数に置き換える

// dataの先頭がMSなら。数字を10進数から
            // Bit変換(5なら5Bit目を1)して
            if (data.ToUpper().StartsWith("MS,") == true)
            {
                int iLampNo = 0;

                string sLampNo = data.Substring(3);
                if (int.TryParse(sLampNo, out iLampNo) == false)
                {
                    // MS,の後が数字ではない
                    MessageBox.Show("MS,の後が数字ではない");
                    return;
                }

                if (iLampNo >16)
                {
                    // 16より大きいのでエラー
                    MessageBox.Show("16まで");
                    return;
                }

                // Bit変換
                int bitLamp = 1 << (iLampNo-1);

                // 16進数に変換
                string hLamp = Convert.ToString(bitLamp, 16);

                // 送信用文字列
                data = "MS," + hLamp;
            }

            serialPort1.Write(data + "\n");

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/27 17:45 編集

    MSの場合、単に16進数ではなく、Bit変換(5なら5Bit目を1)して16進数表示となりますので、変更しました。

    キャンセル

  • 2016/07/28 11:08

    昨晩の修正でソースがBit操作してないソースのままでしたので、差し替えました。

    キャンセル

  • 2016/07/28 11:15

    本当にありがとうございます。
    無事解決できましした。ほんとに助かりました。
    コードのなどもご教授本当にありがとうございます。

    キャンセル

+2

完全に蛇足ですが、
ビット配列の操作が伴う時は、
BitArrayクラスを用いるとコードをすっきりさせれるかと思います。
BitArrayクラス-MSDN

ちなみに整数値からBitArrayを生成する場合は、

// ビット値0101
BitArray b = new BitArray(new int[] { 5 });


という感じで初期化できます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/28 11:39

    BitArrayは、
    送信後のChackBoxをOn/Offする際に活用できそうですよね。

    キャンセル

  • 2016/07/28 12:04 編集

    コメントありがとうございます。
    BitArray自体が各要素をboolで管理してくれるのでチェックボックスとの相性は良さそうですね^^

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る