2016-04-01 6 views
0

Я написал функцию обратного вызова в Matlab. Мой ноутбук общается с другим ноутбуком, который отправляет его байты каждые несколько секунд, которые записаны в текстовом файле. Напр. ноутбук отправляет «66», и мой ноутбук непрерывно записывает файл Event_Markers.txt «66», пока другой ноутбук не отправит что-то еще. Код ниже.Пока петля застряла

Проблема, с которой я столкнулся сейчас, заключается в том, что в моей функции обратного вызова (ниже) я использую цикл while для непрерывной записи той же «информации» (например, «66») в текстовый файл, пока другой ноутбук не отправит что-то еще , Но этот цикл зацикливается. Эта часть имеет более крупный скрипт, который получает данные с спектрометра и добавляет его в мой скрипт и заставляет все застревать, а остальная часть скрипта не выполняется. Я пытался использовать цикл if вместо while, и он записывает только «66» дважды, вместо того, чтобы писать его непрерывно. Это, однако, запись в текстовый файл, как я хочу.

Кто-нибудь знает, нужно ли мне добавить другую строку кода, чтобы остановить ее застревание?

Спасибо!

appenderFile=fopen('Event_Markers.txt','a+t'); 
s=serial('COM3'); 
set(s,'BytesAvailable',{@myCallback,appenderFile}); 
set(s,'BytesAvailableFcnCount',1); 
set(s,'BytesAvailableFcnMode','byte'); 
fopen(s); 

function myCallback(s,~,appenderFile) 
    bytes=(s,'BytesAvailable') 

    if(bytes==1) 
     [data count msg] = fread(s,bytes); 
    end 

    fprintf(appenderFile,'%d \n',data); 
    bytes=(s,'BytesAvailable'); 

    while bytes==0 
     fprintf(appenderFile,'%d \n',data); 
     bytes=get(s,'BytesAvailable'); 
    end 
end 
+0

Было бы хорошо, если бы вы могли отображать получить байты в командном окне, чтобы убедиться, что вы получение ожидаемой информации или нет. – User1551892

+0

Я не знаком с последовательной связью в Matlab, но вам не нужно снова и снова считывать последовательный порт внутри цикла while. – User1551892

+0

@ User1551892 это функция обратного вызова, она непрерывно читает. –

ответ

0

Вы должны выйти из цикла, когда «что-то еще послал», что-то вроде:

while bytes==0 
    fprintf(appenderFile,'%d \n',data); 
    bytes=get(s,'BytesAvailable'); 
    if s ~= 66 
    break 
    end 
end 
+0

Я попытался добавить в этот 'break', но он имеет тот же эффект, что и цикл' if', он записывает только «66» дважды, а не непрерывно ... –

+0

Вам нужно отладить и проверить, что читается. – matlabgui