2016-09-06 4 views
1

シリアルポートを使用して私の "GS#"文字列を返すデバイスを接続しました。長い検査の後、私は問題が スイッチの状態であることをほとんど確信しています。つまり、私のプログラムは決してケースに入りませんし、常にデフォルトになります。受け取った文字列をテキストボックスに印刷したところ、 ":GS#"でした!私は混乱しています。私のミスはどこですか?文字列型のswitch文を書くには?

は、ここに私のコードです:

それはあなたが読み取りバイトを保存するあなたの char配列は8文字の長さコメントで指摘されたとおり
char[] lxCMD = new char[8]; 
. 
. 
. 

private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
{ 
    serialPort.Read(lxCMD, 0, lxCMD.Length); 
    this.Invoke(new EventHandler(UpdateVar)); 
     } 

private void UpdateVar(object sender, EventArgs e) 
{ 
    string strRecieved = "Ack"; 
    if (lxCMD[0] != 0x6) 
    { 
    strRecieved = new string(lxCMD); 
    } 
    textBox1.AppendText(strRecieved); // This line prints :GS# correctly! 
    textBox1.AppendText(Environment.NewLine); 
    switch(strRecieved) 
    { 
     case ":GS#": 
      serialPort.Write("20:08:18#"); 
      textBox1.AppendText("1:"); 
      textBox1.AppendText(Environment.NewLine); 
       break; 
     case "Ack": 
      serialPort.Write("1"); 
      textBox1.AppendText("2:"); 
      textBox1.AppendText(Environment.NewLine); 
       break; 
     default: 
      textBox1.AppendText("Nothing"); 
       break; 

      } 

     } 
+0

あなたの文字列に制御文字が追加されていますか?多分あなたはそれを切る前に消毒するべきです。 –

+0

文字列の最後にスペースや印字不能な文字がありますか?あなたの 'char []'が8文字であれば、文字列もその長さになる可能性があります。 –

+3

GS#を正確に受け取っていないかぎり、それがうまくいかない理由はありません。文字列の長さのように、印刷されていない文字をチェックしてください。 –

答えて

1

textBox1.AppendText(strRecieved); // This line prints :GS# correctly!   
textBox1.AppendText(Environment.NewLine); 
Console.Out.WriteLine(strRecieved.Length); //or any other means of output - will output 8 

これはによってヌル(一部非印字可能文字が文字列であることを意味:あなたはそれが8の長さの文字列を作成し、文字列にその配列を変換するときに、あなたは、例えばstrRecieved.Lengthを呼び出していることを確認することができますASCIIテーブル)。したがって、ケースは一致しません!

シリアルポートのReadメソッドは、正しい部分文字列を取得するために、それを使用して読み取るバイト数を返します。例えば、(私はこれが機能すべきだと思う):

char[] lxCMD = new char[8]; 
var bytesRead = 0; 
. 
. 
. 

private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
{ 
    bytesRead = serialPort.Read(lxCMD, 0, lxCMD.Length); 
    this.Invoke(new EventHandler(UpdateVar)); 
     } 

private void UpdateVar(object sender, EventArgs e) 
{ 
    string strRecieved = "Ack"; 
    if (lxCMD[0] != 0x6) 
    { 
    strRecieved = new string(lxCMD); 
    strRecieved = strRecieved.SubString(0, bytesRead) 
    } 
    textBox1.AppendText(strRecieved); // This line prints :GS# correctly! 
    textBox1.AppendText(Environment.NewLine); 
    switch(strRecieved) 
    { 
     case ":GS#": 
      serialPort.Write("20:08:18#"); 
      textBox1.AppendText("1:"); 
      textBox1.AppendText(Environment.NewLine); 
       break; 
     case "Ack": 
      serialPort.Write("1"); 
      textBox1.AppendText("2:"); 
      textBox1.AppendText(Environment.NewLine); 
       break; 
     default: 
      textBox1.AppendText("Nothing"); 
       break; 

      } 

     } 
+0

それは今作動する!しかし、 'bytesRead'の値が1で' strRecieved'が ': 'で、' bytesRead = 3'と 'strRecieved = GS#'となることがあります。なぜ時々割り込みがあるのですか?割り込みを避けるためシリアルポートに設定するいくつかのパラメータはありますか? – GntS

1

変更はif文で、あなたの文字列strRecieved初期化がために:

strRecieved = new string(chars.TakeWhile(c => c != '\0').ToArray()); 

問題をchar配列がで複数の\ 0文字を保持しているということですエンド入力は長さでない場合8.

以下の試験がこれを実証する:

[Test] 
    public void stringConstructor_CharArrayWithSomeEmptyValues_StringWithoutEmptyValues() 
    { 
     var expected = "test"; 
     var chars = new char[expected.Length+42]; 
     chars[0] = expected[0]; 
     chars[1] = expected[1]; 
     chars[2] = expected[2]; 
     chars[3] = expected[3]; 
     var str = new string(chars.TakeWhile(c => c != '\0').ToArray()); 

     Assert.AreEqual(expected, str); 
     str = new string(chars,0,chars.Length); 
     Assert.AreNotEqual(expected, str); 
    } 
+0

1回のテストで2つのアサートを申し訳ありません... – silver

関連する問題