2017-11-13 11 views
0

私はシリアルポートを使用する方法を学ぶために使用している単純なプログラムから奇妙な動作を得ています。フォームにはシリアルポートコントロールとTextBoxが1つしかありません。それは単なるテストプログラムなので、スレッドコールチェックを無効にしました。 私はマイクロコントローラを使用して1000バイトのデータを送信していることを忘れています(EEPROMを読んでください)。 奇妙なことに、データを読み込んで、DataReceivedイベントのテキストボックスに直接追加すると、すべてが問題ありませんが、最初に値をint []配列に渡してからループを使用して変換しますそれらをHEX形式の文字列に変換してTextBoxに追加すると、値の間にいくつかのゼロがあります。奇妙な動作のフォームC#のシリアルポート

いくつかのコードには結果があります。

ケース1:(...私は受け取るために1000のバイトがある言ったように、それのほか、一部)のデータを読み込み、直接テキストボックスに

private void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     while (sp1.BytesToRead > 0) 
     { 
      textBox1.AppendText(sp1.ReadByte().ToString("X")+ " "); 
     } 

    } 

を追加し、結果が

0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C..... and so on 

ケース2:最初に、私はLOを取得し、配列をintに値を格納し、それらを文字列に変換よりも、およびテキストボックス

private void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     int[] buffer = new int[1000]; 
     int i = 0; 
     while (sp1.BytesToRead > 0) 
     { 
      //textBox1.AppendText(sp1.ReadByte().ToString("X")+ " "); 
      buffer[i] = sp1.ReadByte(); 
      i++; 
     } 
     int j = 0; 
     while (j < 1000) 
     { 
      textBox1.AppendText(buffer[j].ToString("X")); 
      j++; 
     } 

に追加ランダムな場所で0のtは、それがこの奇妙な行動の理由かもしれませんどのようなループ

ABCDEF101112131415161718191A1B1C1D1E1F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFFABCDEF101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFFABCDEF101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFFABCDEF101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 

1000よりも、4-5倍以上のデータを読み込みますか? ありがとうございます。

答えて

1

sp1_DataReceivedは、通常1回しか呼び出されません。通常、コンピュータは受信したデータを受信したデータより速く処理します。これは、ある時点でループを意味します。

while (sp1.BytesToRead > 0) 

は、すべての1000バイトが受信される前に残ります。ちょうど少し後に、sp1_DataReceivedがもう一度呼び出されました。これ以上の1000バイトが利用可能になったからです。あなたの最初の実装はそれが重要ではないバイトだけを追加するので。しかし、2番目の実装は、テキストに常に1000文字を追加するために異なります。これにより、1000文字の倍数にゼロが付加された結果になる可能性があります。

問題を解決するには、複数のイベントのバイトを結合する必要があります。一つの解決策は

private List<byte> buffer = new List<byte>(); 
private void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    while (sp1.BytesToRead > 0) 
    { 
     buffer.Add(sp1.ReadByte()); 
    } 

    //Print if all bytes are available 
    if (buffer.Count >= 1000) 
    { 
     //Join the bytes to a string using LINQ 
     textBox1.Text = String.Join("", buffer.Select(b => b.ToString("X"))); 
     buffer.Clear(); 
    } 
} 

か、これはいくつかのアイデアと実装例のみであることを

private byte[] buffer = new byte[1000]; 
private int bufferIndex = 0; 
private void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    while (sp1.BytesToRead > 0 && bufferIndex < 1000) 
    { 
     buffer[bufferIndex ] = sp1.ReadByte(); 
     bufferIndex ++; 
    } 

    //Print if all bytes are available 
    if (bufferIndex >= 1000) 
    { 
     //Join the bytes to a string using LINQ 
     textBox1.Text = String.Join("", buffer.Select(b => b.ToString("X"))); 
     bufferIndex = 0; 
    } 
} 

ノートのような配列のようなリストを使用することができます。あなたはまた、ポートで他のメッセージを受信して​​いるかどうかわからないので、問題を解決するための完璧な適切なソリューションを提供することはできません。

+0

Fruchtzwerg、ありがとうございます、今はうまくいきます:)シリアルポートが本当に難しいと思われます。 – user8934499