我的串口上有一个设备,它在收到字符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
看到我正在读行,但文件仍为空。如何让回调函数写入文件?
答案 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
的最后一次调用。
每次收到打开/写入/关闭日志文件的字符串时,回调都会处理所有文件管理。