2017-05-12 1 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 바이트를 읽을 수 있습니다

내가 비주얼 스튜디오 2010 WindowsForm 응용 프로그램 과 행동 양식 버튼을 사용하고 이미지를 읽으려면 하나의 패키지. 다음

 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에서 (1ms의 간격) 타이머 수 있도록 모든 데이터를 읽으려면 내가 지금이 타이머를 사용하여 나쁜 코드인지 확인하십시오. 누구나 여러 패키지에서 보낸 모든 데이터를 읽는 방법을 알고 있습니까?

+0

당신도 1) 모든 데이터 2를 읽을 때까지) 현재 실행중인 코드를 차단 비동기 적으로 데이터를 읽을 수 있습니다. – fshauge

답변

0

데이터를 비동기 적으로 읽습니다. 하나의 이미지에 대해 올바른 횟수의 루프를 반복하려면 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 
    } 
} 
관련 문제