2016-04-01 1 views
0

J'ai écrit une fonction de rappel dans Matlab. Mon ordinateur portable communique avec un autre ordinateur portable qui lui envoie des octets toutes les quelques secondes qui sont enregistrées dans un fichier texte. Par exemple l'ordinateur portable envoie "66" et mon ordinateur portable écrit dans le fichier Event_Markers.txt "66" en continu jusqu'à ce que l'autre ordinateur portable envoie quelque chose d'autre. Le code est ci-dessous. Le problème que je suis actuellement confronté est que dans ma fonction de rappel (ci-dessous) j'utilise une boucle while pour écrire continuellement la même "information" (par exemple "66") dans le fichier texte jusqu'à ce que l'autre ordinateur portable envoie autre chose . Mais cette boucle est bloquée. Cette partie est d'un script plus grand qui acquiert des données à partir d'un spectromètre et l'ajoute à mon script et provoque tout coincé et le reste du script n'est pas exécuté. J'ai essayé d'utiliser une boucle if au lieu de while et il écrit seulement deux fois "66" au lieu de l'écrire en continu. Il est, cependant, d'écrire dans le fichier texte comme je le veux.Pendant que la boucle est bloquée

Est-ce que quelqu'un sait si j'ai besoin d'ajouter une autre ligne de code pour l'empêcher de se bloquer?

Merci!

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

Ce serait bien si vous pouvez afficher recevoir octets sur la fenêtre de commande pour vous assurer que vous êtes obtenir des informations attendues ou non. – User1551892

+0

Je ne suis pas familier avec la communication série dans matlab mais vous n'avez pas besoin de lire le port série encore et encore dans la boucle while. – User1551892

+0

@ User1551892 thats ce que fait la fonction de rappel, il lit en permanence. –

Répondre

0

Vous devez sortir de la boucle lorsque « quelque chose d'autre est envoyé », quelque chose comme:

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

J'ai essayé d'ajouter dans ce 'break' mais cela a le même effet que la boucle' if', il n'enregistre que "66" deux fois au lieu de continuellement ... –

+0

Vous devez déboguer et vérifier ce qui est en cours de lecture. – matlabgui