MATLAB: читать данные в режиме реального времени - PullRequest
1 голос
/ 24 июня 2019

У меня есть приложение A, которое пишет в файл. Я хочу использовать MATLAB для чтения N строк в реальном времени из этого файла.

Мой вопрос связан с этой записью: Как отображать данные в реальном времени из текстового файла в MATLAB

Автор одного из ответов упоминает следующий подход:

Вы не можете строить графики, используя жесткие условия реального времени, поэтому всегда может случиться так, что matlab пропустит временной интервал 10 мс. Вы должны использовать вариант 2, чтобы получить все данные.

Для начала: напишите функцию, которая считывает только новые данные, которые были записаны после последнего вызова. Для этого не закрывайте дескриптор файла. Сохраняет позицию.

Таким образом, вот мой код:

myfile_fid=fopen(filePath, 'rt')
waitForFileToHaveData(filePath, 10);

for readingIdx = 1:10
    fgetl(myfile_fid)
end

Моя waitForFileToHaveData функция, определяется следующим образом:

function waitForFileToHaveData(filePath, desired_length)
    if (getNumLinesOfFile(filePath) < desired_length)
        disp('###### not enough data in the file');
        pause(0.02);
        waitForFileToHaveData(filePath, desired_length);
    end
end


function num = getNumLinesOfFile(file_to_read)
    [status, result] = system( ['wc -l ', file_to_read] );
    if(status~=1)
        scanCell = textscan(result,'%u %s');
        num = scanCell{1} - 2;
    else
        num = 0;
    end
end

Результат:

Когда я попадаю в цикл for, myfile_fid оценивается в 3, а fgetl(myfile_fid) оценивается в -1. Если я распечатываю результаты getNumLinesOfFile(filePath), я вижу 20. Странная часть заключается в том, что если я подожду, скажем, файл будет иметь 40 строк, и выполню приведенный выше код, я не получу ошибку. Я попытался просмотреть документацию, чтобы понять, почему fgetl возвращает обратно -1, но я не могу найти его в документации MATLAB 2018b. Есть упоминание о том, что myfile_fid может вернуть -1, но это только если файл не может быть открыт. Однако во время выполнения myfile_id оценивается как 3.

Можно ли с помощью MATLAB прочитать N строк с момента последнего чтения в файле, в который записывается другое приложение?

1 Ответ

2 голосов
/ 24 июня 2019

fgetl возвращает -1, когда fileID достигает маркера конца файла , см. Документация Matlab fgetl . Это означает, что если первый результат из fgetl равен -1, тогда файл пуст .

Я не уверен, почему вы получаете -1, если getNumLinesOfFile возвращает 20, внимательно проверьте код, если вы читаете тот же файл. Может быть, файл изменился?

Я написал здесь код MATLAB, который проверяет, были ли добавлены 10 новых строк, а затем получает их с помощью fgetl:

myfile_fid = fopen(filePath, 'rt');

newLines = 10;
linesRead = 0;
while(waitForFileToHaveData(filePath, linesRead + newLines))
    linesRead = linesRead + newLines;
    for readingIdx = 1:newLines
        line = fgetl(myfile_fid)
    end
end

fclose(myfile_fid);

Я обновил функцию waitForFileToHaveData для возврата 1:

function ready = waitForFileToHaveData(filePath, desired_length)
    while (getNumLinesOfFile(filePath) < desired_length)
        disp('###### not enough data in the file');
        pause(0.02);
    end
    ready = 1;
end

Примечание:

Если в файле ровно 10 строк без маркера конца строки в строке 10, и вы их прочитали, то были добавлены еще 10 строк, fileID теперь указывает на конец строки 10 и первую строку fgetl вернет конец строки в строке 10, но поскольку fgetl удаляет конец строки, он возвращает пустой массив.

Примечание:

функция waitForFileToHaveData использует рекурсию, которая неэффективна. Вы можете легко использовать цикл while.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...