2017-05-12 13 views
0

J'ai une caméra IP et J'ai des problèmes pour lire les données d'image de cet appareil photo. Pour lire l'image que je dois envoyer la commande à la caméra et lire: 1) Longueur Télégramme 2) ID de réponse Obtenir l'image 3) Code erreur 4) Type image 5) Image Résultats 6) Nombre de lignes, colonnes 7) Données d'imageC# Lire toutes les données Caméra IP utilisant TCP

Pour lire le formulaire de données, les points 1 à 6 ne posent aucun problème car ce n'est que 14 octets. Au point 6, j'ai lu la taille de l'image. Par exemple laissez nombre de lignes et les colonnes seront 640x480 donc nous avons 307200 octets.

Pour lire l'image J'utilise Visual Studio 2010 et WindowsForm application et le bouton sous forme d'action:

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

} 

En butReadImage_Click je peux lire seulement 7000 octets de données d'image parce que l'appareil photo ne pas envoyer toutes les données d'image un paquet. Pour lire toutes les données activer minuterie (intervalle de 1 ms) en utilisant un butReadImage_Click puis

 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]); 
       } 
      } 
    } 

Je maintenant que cela est mauvais code en utilisant la minuterie. Est-ce que quelqu'un a une idée comment lire toutes les données envoyées dans plusieurs paquets ?.

+0

Vous pouvez 1) Bloquer le code en cours d'exécution jusqu'à ce que vous avez lu toutes les données 2) Lire les données de manière asynchrone. – fshauge

Répondre

0

Lire les données de manière asynchrone. Vous devrez déterminer ce que la boucle while conditionnelle devrait être pour boucler le nombre correct de fois pour une seule image, mais en attendant ReadAsync pour obtenir des données de votre flux, votre code attendra une transmission complète avant de continuer.

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 
    } 
}