2014-10-14 2 views
0

У меня есть устройство на моем последовательном порту, который выплескивает несколько строк текста после получения символа 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

Вы не закрыли файл. Вам необходимо позвонить по телефону

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.

Обратный вызов заботится обо всем управлении файлами каждый раз, когда он получает строку, которую он открывает/записывает/закрывает файл журнала.