2017-05-12 5 views
0

IPカメラを持っていて、 このカメラから画像データを読み取る際に問題があります。 は、私がカメラにコマンドを送信して読まなければならない画像を読み込むには:電報 2)のうち 1)の長さは、応答IDは、イメージを取得 3)エラーコード 4)画像タイプ 5)画像は 6)行数、列の結果 7)画像データC#TCPを使用しているすべてのデータ形式のIPカメラを読み取る

データ形式を読み取るには、ポイント1〜6は問題ありません。これはわずか14バイトです。 ポイント6で画像の大きさを読みました。たとえば、行の数を とし、列のサイズを640x480とすると、307200バイトになります。内のすべての画像データを送信しない カメラためbutReadImage_Click

private void butReadImage_Click(object sender, EventArgs e) 
{ 
    // code to read data from point 1 to 6 
    // start read data image (point 7) 

} 

私は画像データのみ7000バイトを読むことができます:

は、私は、Visual Studio 2010とWindowsFormのアプリケーション とアクションフォームのボタンを使用していた画像を読み込むには1つのパッケージ。私はその後、私は今、これはタイマーを使用して不正なコードであることを

 private void timReadImage_Tick(object sender, EventArgs e) 
    { 
      // read rest data form camera, about two data packets 
      int numberOfBytesRead; 
      while (rwSensorStream.DataAvailable) 
      { 
       numberOfBytesRead = rwSensorStream.Read(BinaryImageData_Byte_14_n, 0, BinaryImageData_Byte_14_n.Length); 
       tempRC = tempRC + numberOfBytesRead; 

       for (int i = 0; i < numberOfBytesRead; i++) 
       { 
        image.Add(BinaryImageData_Byte_14_n[i]); 
       } 
      } 
    } 

を使用してbutReadImage_Clickにタイマー(1ミリ秒間隔)を有効にすべてのデータを読み取ることが 。誰もがいくつかのパッケージで送られたすべてのデータを読む方法を考えていますか?

+0

あなたはどちらか 1)あなたはすべてのデータ 2を読んだまで)現在実行中のコードをブロック非同期でデータを読むことができます。 – fshauge

答えて

0

データを非同期で読み取ります。 1つのイメージの正しい回数をループするためにはwhileループの条件を理解する必要がありますが、ストリームからデータを取得するためにReadAsyncを待っていると、コードは完全な送信を待ってから続行します。

public async Task getData(NetworkStream rwSensorStream) { 
    while (true) { 
     byte[ ] buffer = new byte[numberOfBytesAtOnce]; 
     int read = await rwSensorStream.ReadAsync(buffer, 0, buffer.Length); 
     //wait for next package 

     if (read > 0) { 
      // data received, process it 
     } 
     else break; // will occur when connection is broken 
    } 
} 
関連する問題