如何“实时”优化c#写入文件&MATLAB从文件读取操作

本文关键字:文件 MATLAB 操作 读取 实时 优化 如何 | 更新日期: 2023-09-27 18:10:19

我正试图找到一种好方法,将数据从NetworkStream(通过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中的数据时,在实际数据之间有大量的零延伸,最令人不安的是在这些"假零"延伸之间读取的连续数据点的数量变化很大。

我正在考虑尝试插入一些延迟(线程。sleep和wait(timerObject))分别转换为c#和Matlab,但即使这样,我也不相信这将保证我总是获得通过网络流接收的数据,这是必要的。

如何“实时”优化c#写入文件&MATLAB从文件读取操作

看起来fscanf在Matlab侧的读者中如何使用存在问题。

读取器代码看起来好像每次通过循环都要重新读取整个文件,因为它在每次通过循环时都重新打开它。这是故意的吗?如果你想跟踪一个文件的结尾,你可能想保持文件句柄打开,只是不断检查,看看你是否可以从它读取更多的数据,在同一个打开的文件句柄上重复fscanf调用。

此外,fscanf调用看起来可能总是返回一个填零的1000元素数组,无论它读取的文件有多大。也许这就是你的"假零"的来源。有多少会随着文件中实际有多少数据以及Matlab代码在写入之间读取数据的频率而变化。获取fscanf的第二个参数,看看它实际读取了多少个元素。

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

查看fscanf的文档页面。在"输出参数"部分:"如果输入包含少于sizeA的元素,MATLAB®用零填充A。"

然后你可能想看看这个问题:我如何在c#中做一个原子写/追加,或者我如何用FILE_APPEND_DATA标志打开文件?保持写操作比输出流的缓冲区短(就像现在一样)将使它们原子化,并且在每次写操作后刷新将使它们及时地对读取器可见。