2013-04-21 7 views
2

"C#을 통해 NetworkStream에서 데이터를 쓰는 좋은 방법을 찾고 텍스트 파일에"quasi 동시에 텍스트 파일에서 새로 작성된 데이터를 Matlab으로 읽어들입니다."실시간"C# write-to-file 및 MATLAB 읽기 - 파일 작업을 최적화하는 방법

기본적으로 읽기 작업이 쓰기 작업을 차단하지 않으며 그 반대의 경우 쓰기 및 읽기 작업을 조정하는 좋은 방법이나 기술이 있으며 (그 반대의 경우) 연속 쓰기/읽기 간의 지연은 최소화 된?

현재 네트워크 스트림의 데이터를 WriteLine 루프를 통해 텍스트 파일에 쓰는 중입니다 (추가). 마지막 요소를 읽은 Matlab의 fscanf 함수를 반복하여 데이터를 읽고 해당 파일 포인터를 다시 배치합니다. 자리. C# 코드의

관련 부분 :

(참고 :. 내가 사용 루프 조건이 난 그냥 지금 당장 작동을 확인하기 위해 노력하고있어, 임의적)

NetworkStream network_stream = tcp_client.GetStream(); 

string path = @"C:\Matlab\serial_data.txt"; 
      FileInfo file_info = new FileInfo(path); 
      using (StreamWriter writer = file_info.CreateText()) 
      { 
       string foo = ""; 
       writer.WriteLine(foo); 
      } 

      using (StreamWriter writer = File.AppendText(path)) 
      { 
       byte[] buffer = new byte[1]; 
       int maxlines = 100000; 
       int lines = 0; 
       while (lines <= maxlines) 
       { 
        network_stream.Read(buffer, 0, buffer.Length); 
        byte byte2string = buffer[0]; 
        writer.WriteLine(byte2string); 
        lines++; 
       } 
      } 

관련 matlab에 코드 : I 실제 데이터 사이의 제로의 큰 뻗어 거기에 matlab에 판독 된 데이터를 보면, 언제

i=0; 

while i<100; 
    a = fopen('serial_data.txt'); 
    b = fscanf(a, '%g', [1000 1]); 
    fclose(a); 
    i=i+1; 
end 

가장 안좋은 부분은 연속적인 데이터 포인트의 수는 재 이 "거짓 제로"뻗기 사이의 광고는 크게 다릅니다.

나는 C#과 Matlab에 약간의 지연 (Thread.sleep과 wait (timerObject))을 넣으려는 생각을하고 있었지만, 그때도 나는 항상 데이터를 얻는 것을 보장 할 것이라고 확신하지 못한다. 네트워크 스트림, 필수적입니다.

어떤 조언이나 제안을 주시면 감사하겠습니다.

답변

1

fscanf이 Matlab 측의 독자에서 사용되는 방식에 문제가있는 것처럼 보입니다.

리더 코드는 루프를 통과 할 때마다 파일을 다시 열 때마다 루프를 통해 파일 전체를 다시 읽는 것처럼 보입니다. 이것은 의도적입니까? 파일의 끝을 추적하려면 파일 핸들을 열린 상태로 유지하고 동일한 열린 파일 핸들에서 fscanf 호출을 반복하여 추가 데이터를 읽을 수 있는지 계속 확인해야합니다.

또한 fscanf 호출은 읽은 파일의 크기에 관계없이 항상 0 요소의 1000 요소 배열을 반환하는 것처럼 보입니다. 어쩌면 그것은 당신의 "거짓 제로"가 나오는 곳 일 것입니다. 얼마나 많은 파일이 실제로 파일에 얼마나 많은지, 얼마나 자주 Matlab 코드가 쓰기간에 그것을 읽는지에 따라 달라집니다. fscanf의 두 번째 argout을 실제로 읽은 요소 수를 확인하십시오.

[b,nRead] = fscanf(a, '%g', [1000 1]); 
fprintf('Read %d numbers\n', nRead); 
b = b(1:nRead); 

doc page for fscanf을 확인하십시오. "출력 인수"섹션에서 : "입력에 sizeA보다 작은 요소가 포함되어 있으면 MATLAB®은 A에 0을 채 웁니다."

그리고이 질문을 보길 원할 수 있습니다 : How can I do an atomic write/append in C#, or how do I get files opened with the FILE_APPEND_DATA flag?. 출력 스트림의 버퍼보다 ​​짧은 쓰기를 유지하면 (현재처럼) 원 자성을 갖게되고 각 쓰기 후에 플러시가 발생하면 적시에 독자가 볼 수있게됩니다.

+0

char 형식으로의 암시 적 변환은 없지만 byte에서 int 사이의 변환이 있습니다.테스트되지는 않았지만 해당 논리에 따라 WriteLine (Int32) 호출을 얻을 수 있습니다. – Voo

+0

좋아, 그건 내가 처음 단락에서 생각한 것처럼 변환 문제가 아니라는 것을 의미한다. 아마도'fscanf '사용 문제 일 것입니다. –

+0

@Voo : 바이트 -> int32 대 char 변환에 관한 내용을 제거했습니다. –