2016-07-28 11 views
0

Ich lese Daten über TCP von einer Kamera, ich sende zuerst einen Auslöser über TCP, um ein Bild zu machen, als nächstes lese ich das Bild der Kamera. Alles funktioniert, bis 296 Trigger ausgeführt werden, ab diesem Moment wird das Programm beim ersten TCP-Lesen blockiert.Lesen von TCP-Daten von der Kamera stoppt nach einer bestimmten Anzahl von Bildern

Ich kann vorübergehend beheben, indem Sie erneut einen Trigger (von einem anderen Programm) senden. Ich glaube in diesem Moment wird die Kamera 2 mal ausgelöst (möglicherweise die blockierte und der neue Auslöser (zu beheben)).

Jeder hat eine Idee was könnte schief gehen? Vielen Dank!

'Code in Timer 
    'Trigger 
    Dim tcpClient As New System.Net.Sockets.TcpClient() 
    tcpClient.Connect("ip", port) 
    Dim networkStream As NetworkStream = tcpClient.GetStream() 
    If networkStream.CanWrite Then 
     networkStream.Write(dataTrigger, 0, n) 
     tcpClient.Close() 
    Else 

     If Not networkStream.CanWrite Then 
      Console.WriteLine("cannot read data from this stream") 
      tcpClient.Close() 
     End If 
    End If 
    networkStream.Close() 

    'Read images 
    Dim tcpClient As New System.Net.Sockets.TcpClient() 
    tcpClient.Connect("ip", port) 
    Dim networkStream As NetworkStream = tcpClient.GetStream() 
    If networkStream.CanRead Then 
     ' Reading data length 
     Dim dataLength(15) As Byte 
     networkStream.Read(dataLength, 0, 16) 

     ' Reading all data 
     Dim bytesReaded, bytesLeft, bytesCounter As Integer 
     bytesCounter = 0 
     bytesLeft = dataLength 
     Do While bytesLeft > 0 
      bytesReaded = networkStream.Read(dataImages, bytesCounter, bytesLeft) 
      bytesCounter = bytesCounter + bytesReaded 
      bytesLeft = dataLengthInt - bytesCounter 
     Loop 
     tcpClient.Close() 
    Else 
     If Not networkStream.CanRead Then 
      Console.WriteLine("cannot not write data to this stream") 
      tcpClient.Close() 
     End If 
    End If 
    networkStream.Close() 

Antwort

0

networkStream.Read(dataLength, 0, 16) nicht garantiert werden alle Daten in einer einzigen Lese zu lesen. Sie müssen eine Schleife durchlaufen, bis Sie 16 Bytes haben, genau wie bei Ihrer Hauptschleife.

Auch Sie tun bytesLeft = dataLengthInt - bytesCounter aber no wo in Sie Code zuweisen Sie dataLengthInt einen Wert.

Ich weiß nicht, ob Sie andere Fehler haben, (ich weiß VB.NET nicht gut), aber diese beiden, wo die größten herausgesprungen sind.

+0

Vielen Dank, dies kann ein Grund sein, obwohl ich denke, dies würde die Funktion nicht blockieren. Die dataLengthInt-Konvertierung wird weggelassen. –