Peut-être que je suis mal compris votre question, mais comme il est une ligne série, vous devrez lire tout envoyé de la séquence Arduino - il va tamponner dans l'Arduino jusqu'à ce que vous lisez il. Si vous voulez avoir un affichage d'état qui montre la dernière chose envoyée - utilisez un fil qui incorpore le code dans votre question (moins le sommeil), et gardez la dernière ligne complète lue comme la dernière ligne de l'Arduino.
Mise à jour: exemple de code de mtasic
est assez bonne, mais si l'Arduino a envoyé une ligne partielle lorsque inWaiting()
est appelée, vous obtiendrez une ligne tronquée. Au lieu de cela, ce que vous voulez faire est de mettre la dernière ligne complète dans last_received
, et gardez la ligne partielle dans buffer
afin qu'il puisse être ajouté à la prochaine fois autour de la boucle. Quelque chose comme ceci:
def receiving(ser):
global last_received
buffer_string = ''
while True:
buffer_string = buffer_string + ser.read(ser.inWaiting())
if '\n' in buffer_string:
lines = buffer_string.split('\n') # Guaranteed to have at least 2 entries
last_received = lines[-2]
#If the Arduino sends lots of empty lines, you'll lose the
#last filled line, so you could make the above statement conditional
#like so: if lines[-2]: last_received = lines[-2]
buffer_string = lines[-1]
En ce qui concerne l'utilisation de readline()
: Voici ce que la documentation pyserial a à dire (légèrement modifié pour plus de clarté et une mention à readlines()):
Soyez prudent lorsque vous utilisez " readline ". Ne spécifier un délai d'attente lors de l'ouverture du port série , sinon il pourrait bloquer pour toujours si aucun caractère de nouvelle ligne est reçu. Notez également que "readlines()" ne fonctionne qu'avec un délai d'expiration. Il dépend d'avoir un délai et interprète cela comme EOF (fin de fichier).
ce qui me semble assez raisonnable!
bien qui se lit dans le total de la somme de ce qui est dans le tampon de réception. Mon impression est que le demandeur est en train de délimiter ce que l'Arduino envoie par les nouvelles lignes, donc il ne correspondra probablement pas à la taille du tampon de réception. – JosefAssad
Donc, last_received aura toujours ce dont j'ai besoin? Y a-t-il un moyen de le faire avec readline? – Greg
ce droit, selon votre question – mtasic85