2013-04-21 80 views
2

我試圖找到一個很好的方法將數據從NetworkStream(通過C#)寫入文本文件,而「準「同時」從文本文件中將新寫入的數據讀入Matlab。如何優化「實時」C#寫入文件和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=0; 

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

當我看着讀入Matlab的有實際數據之間的零大片的數據,而最令人不安的部分是連續的數據點,這個數字再這些「虛假零」延伸之間的廣告變化很大。我試圖插入一些延遲(Thread.sleep和等待(timerObject))到C#和Matlab,分別,但即使如此,我不覺得有信心,這將保證我總是獲得收到的數據網絡流,這是勢在必行的。

任何意見/建議將不勝感激。

回答

1

看起來好像fscanf正在Matlab的閱讀器中使用的問題。

閱讀器代碼看起來像是每次通過循環時都要重讀整個文件,因爲它在循環中的每次傳遞都重新打開它。這是故意的嗎?如果您想跟蹤文件的結尾,您可能希望保持文件句柄處於打開狀態,並且只需要繼續檢查是否可以通過在同一個打開的文件句柄上重複調用fscanf調用來從中讀取更多數據。

此外,fscanf調用看起來像它可能總是返回一個零填充的1000個元素的數組,無論它讀取的文件有多大。也許這就是你的「假零」來自哪裏。有多少會隨着文件中實際數據的多少以及Matlab代碼在寫入之間讀取的頻率而變化。抓住fscanf的第二個參數來查看它實際讀取的元素數量。

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

檢查doc page for fscanf。在「輸出參數」部分中:「如果輸入包含的元素少於sizeA,則MATLAB®填充零。」

然後你可能想看看這個問題: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 2013-04-22 04:23:27

+0

好的,這意味着它不是像我在第一段中想到的那樣的轉換問題;也許只是一個'fscanf'使用問題。 – 2013-04-22 05:09:20

+0

@Voo:刪除了關於字節 - > int32與char轉換的內容。 – 2013-04-22 05:12:08