从回调写入文件

时间:2014-10-14 15:01:29

标签: matlab file-io serial-port

我的串口上有一个设备,它在收到字符h后会吐出几行文字。我想使用Matlab将这些文本行放入文件中。

这是我的回调fromBox.m

function fromBox = intcon1(val1, obj, eventStruct, val2)              
s = evalin('base','s');
textFromBox = evalin('base','textFromBox');                           

thisLine = char(fgets(s));                                            

fprintf(textFromBox,thisLine);                                        
disp(thisLine);   

这是剧本:

path = '/dev/tty.usb*';

% log file
system('touch test.csv');
textFromBox = fopen('test.csv');

s = serial(strcat(ls(path)));
fopen(s);

% Serial port settings:
s.BytesAvailableFcnMode = 'terminator';
s.BytesAvailableFcn = @fromBox;

helpCmd = char('h');

% print the string to the serial port
fprintf(s,helpCmd);

我可以从disp看到我正在读行,但文件仍为空。如何让回调函数写入文件?

1 个答案:

答案 0 :(得分:1)

您没有关闭文件。你需要打电话

fclose( textFromBox  );

代码末尾的某个地方(当你完成写作时)。否则,新内容不适用于其他应用程序。

现在,您似乎想在每次收到串行端口上的字符时在文件中写入行。您可以将fclose指令放在主代码的末尾,但在收到串口回复之前,您可能会关闭该文件,因此无论如何您的回调都无法写入

处理它的最好方法是让回调处理所有文件管理 例如:

在主代码中,只需声明:

logFileName = 'test.csv' ;
%// ... some code ...
s.BytesAvailableFcn = { @fromBox , logFileName } ;

然后在你的回调中:

function fromBox( obj , eventStruct, logFile)              

thisLine = char( fgets(obj) );

fid = fopen( logFile , 'at' ) ;
fprintf( fid , '%s\n' , thisLine ) ;
fclose( fid ) ;

disp(thisLine); 

请注意,我更正了fromBox.m的声明方式。这样,内部的第一个参数就是调用对象,所以你已经有了对你的串口对象的引用(不需要调用evalin,如果你可以的话就避免使用)。

在回调函数s.BytesAvailableFcn = { @fromBox , logFileName } ;的定义中,我们还发送了一个附加参数(日志文件名),注意语法:包含函数句柄的单元格数组,然后是所有参数。这也消除了对evalin的最后一次调用。

每次收到打开/写入/关闭日志文件的字符串时,回调都会处理所有文件管理。