Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MATLAB中从文本文件中绘制实时数据_Matlab_Plot_Text Files_Real Time_Real Time Data - Fatal编程技术网

如何在MATLAB中从文本文件中绘制实时数据

如何在MATLAB中从文本文件中绘制实时数据,matlab,plot,text-files,real-time,real-time-data,Matlab,Plot,Text Files,Real Time,Real Time Data,我是新的matlab编码,所以我仍然试图让我的头周围的事情。 我和interia传感器一起工作,每10毫秒输出一次传感器方位数据。我能够将这些数据存储到一个不断更新的文本文件中 我现在的任务是实时绘制这些数据。这涉及到连续访问和读取文本文件(如有可能,每10毫秒一次),并根据时间将这些数据绘制成图表。 你们中有谁能给我一些指导,告诉我什么是最有效的方法 此时,文本文件仅存储关于一个参数(传感器的x坐标)的数据。我可以用两种方式存储此数据: 方法1:每10ms更新一次数据。每个都存储在一个新行中。

我是新的matlab编码,所以我仍然试图让我的头周围的事情。 我和interia传感器一起工作,每10毫秒输出一次传感器方位数据。我能够将这些数据存储到一个不断更新的文本文件中

我现在的任务是实时绘制这些数据。这涉及到连续访问和读取文本文件(如有可能,每10毫秒一次),并根据时间将这些数据绘制成图表。 你们中有谁能给我一些指导,告诉我什么是最有效的方法

此时,文本文件仅存储关于一个参数(传感器的x坐标)的数据。我可以用两种方式存储此数据: 方法1:每10ms更新一次数据。每个都存储在一个新行中。 方法2:我可以使文本文件只包含最新的数据(删除以前的数据) 我能用这两种方法中的任何一种。。不管你们怎么想都会容易些

我曾尝试使用其他第三方软件从文本文件中绘制这些数据,但它们看起来都非常紧张,无法足够快地从文本文件中读取数据


谢谢。

您无法使用硬实时条件进行绘图,因此matlab总是会错过10毫秒的时间段。您必须使用选项2来获取所有数据


开始:编写一个函数,只读取自上次调用以来写入的新数据。为此,请不要关闭文件句柄。它存储位置。

MATLAB定时器对象将有所帮助。例如,请参见此链接

对于同时写入(其他进程)和读取(MATLAB)单个文件,可能会有一些担心。您的情况可能更适合管道而不是文件:但我将继续使用基于MATLAB的解决方案,用于定时文件读取和打印更新

我模仿了你的情况,学到了一些东西:

  • MATLAB文件句柄存储当前位置。但是,如果为文件id设置了文件结束标志,则在随后调用
    fread
    时,MATLAB不会查找新数据。请参阅下面的
    readFile
    功能中使用
    fseek
    的解决方法
  • 10毫秒是乐观的。MATLAB不会漏掉数据点,但每次更新通常会添加四个或更多数据点,而不仅仅是一个
  • 如果数据源使用缓冲文件写入,则在缓冲区刷新到磁盘之前,MATLAB不会看到新数据。下面的python代码用于模拟数据源。文件在没有缓冲的情况下被打开写入:
    fobj=open('test.dat','wb',0)
MATLAB代码如下:

function [t] = livePlot(period, filename)
    //%   inputs : period : update rate in seconds
    //%            filename : name of the file to get data from
    //%
    //%   outputs: t      : the timer object
    //%                     >> stop(t) 
    //%                     ends streaming
    //%%

    close all;        
    t = timer('StartDelay', 1, 'Period', period, ...
              'ExecutionMode', 'fixedRate');
    //%% timer object callback functions
    t.StopFcn  = {@stopFigure};
    t.TimerFcn = {@updateFigure};
    //%% initialize timer object user data
    d = get(t, 'UserData');
    d.data = []; % array for the data to plot
    axes('Position', [0 0 1 1], 'Visible', 'off');
    d.axes_handle = axes('Position', [.2 .1 .7 .8]);
    d.line_handle = plot(NaN,NaN);
    d.fid = fopen(filename, 'r');    
    set(t, 'UserData', d);    
    start(t);
end

function stopFigure(obj, event)
    //% close function handle
    d = get(obj, 'UserData');
    fclose(d.fid);
end

function updateFigure(obj, event)
    d = get(obj, 'UserData');        
    //% read new data from file
    tmp = readFile(obj);
    //% append to array in user data
    d.data = [d.data transpose(tmp)];
    //% update the plot 
    set(gcf, 'CurrentAxes', d.axes_handle);
    set(d.line_handle, 'XData', 1:length(d.data), 'YData', d.data);
    //% store the timer object user-data
    set(obj, 'UserData', d);
end

function [tmp] = readFile(obj)
    //% read binary data. file-ID is in the timer user-data
    d = get(obj, 'UserData');
    tmp = fread(d.fid);
    fprintf('Current file location : %d \n', ftell(d.fid));
    //% fprintf('End of file indicator : %d \n', feof(d.fid));
    //% reset the end-of-file indicator
    fseek(d.fid, -1, 0);
    fseek(d.fid, 1, 0);
    //% fprintf('End of file indicator : %d \n', feof(d.fid));
    set(obj, 'UserData', d); 
end
每10毫秒将数据写入文件的Python代码:

#!/anaconda/bin/python
import numpy as np
from time import sleep
sleep_time = 0.01
sigma = 5
fobj = open('test.dat', 'wb', 0)
for i in range(5000):
    sleep(sleep_time)
    x = int(np.random.normal(sigma))
    fobj.write('%c' % x)
fobj.close()

很抱歉迟了答复。使用上面的python代码:打开文本文件,每隔10毫秒连续写入数据,然后关闭文件。或者它打开文件>写入数据>关闭文件并每隔10毫秒重复一次。因为我的印象是它必须使用第二种方法,因为我认为文件在关闭之前不会更新。(因此,在关闭文件之前,matlab将无法访问新数据)同样感谢您的回答,这真的很有帮助。这也是我在这个解决方案中遇到的另一个问题,它似乎能够实时访问数据,尽管它没有正确绘制结果。整个绘图窗口似乎在y轴上从9到56->57随机绘制直线。生成的文本文件具有以下格式,例如:70 75 78 82 77 76等。。(其中每个数字位于新行上)因此为单列文本文件。但正如我们所解释的,它似乎并没有绘制出这些值与时间的关系。任何帮助都会大有帮助。谢谢。python数据生成代码实现了两种可能方法中的第一种。python代码是打开的,因此在写入磁盘之前没有缓冲区(“0”第三个参数为“open”)。关于第二个注释:您是否混合了二进制读取和文本文件?我上面使用的MATLAB命令
fread
从文件中读取二进制数据。使用文本编辑器时,此文件不应是人类可读的。如果希望MATLAB读取文本文件,请将
fread
替换为
fscanf
.Sweet。谢谢,现在一切正常如果我现在向文本文件输出两组值,我将如何绘制此图。我将仍然使用fscanf,还是需要使用另一个read-in函数,它可能可以将数据存储到数组中。fscanf似乎无法区分每列数据之间的差异。目前,我正在使用“tmp=fscanf(d.fid,'%f',inf);”,但这只是从文件的开头到结尾读取数据,而不考虑txt文件格式。目前,我正在将这两组数据保存到不同的txt文件中,并分别读取它们。但这似乎并不有效。