Question

J'ai un script Python qui écrit des paquets de données à une carte Arduino par pyserial . Parfois, en écrivant le code à la carte pyserial déclenche une erreur d'entrée / sortie avec errno 5.

Certaines recherches dit que cela indique une erreur lors de l'écriture dans le fichier représentant la connexion à la carte Arduino.

Le code qui envoie, envoie uniquement des paquets d'octets unique:

try:
    # Check if it's already a single byte
    if isinstance(byte, str):
        if len(byte) == 1: # It is. Send it.
            self.serial.write(byte)
        else: # It's not
            raise PacketException
    # Check if it's an integer
    elif isinstance(byte, int):
        self.serial.write(chr(byte)) # It is; convert it to a byte and send it
    else: raise PacketException # I don't know what this is.
except Exception as ex:
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__())

L'erreur imprimée par ce code est:

  

Erreur système d'entrée / sortie d'erreur Errno 5

Y at-il quelque chose de mal dans mon code lors de l'envoi? Ai-je besoin de vérifier si la connexion série est prêt à envoyer quelque chose ou devrait-il y avoir un retard après l'envoi? Ou pourrait-il y avoir un problème avec le matériel ou la connexion avec le matériel?

Modifier : J'ai regardé dans la mise en œuvre de Linux pyserial et la mise en œuvre ne fait que passer l'erreur à mon code. Donc, pas de nouvelles perspectives réelles de là. Yat-il un bon moyen de tester ce qui se passe dans le programme?

Était-ce utile?

La solution

Désolé de vous avoir dérangé mais je suis bien sûr que l'erreur est provoquée par la remise à zéro et se arduino donc fermer la connexion à l'ordinateur.

Autres conseils

Le seul problème que je peux voir tout de suite dans votre code est un problème d'indentation - changer votre code comme suit:

try:
    # Check if it's already a single byte
    if isinstance(byte, str):
        if len(byte) == 1: # It is. Send it.
            self.serial.write(byte)
        else: # It's not
            raise PacketException
    # else, check if it's an integer
    elif isinstance(byte, int): 
        self.serial.write(chr(byte)) # It is; convert it to a byte and send it 
    else: 
        raise PacketException # I don't know what this is.
except Exception as ex:
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__())

Je doute votre erreur vient de cela, mais essayez de cette façon et laissez-nous savoir! Vous vérifiaient si byte est un int que dans le cas où il est un str, de sorte que le elif toujours a échoué par définition. Mais je pense que si vous réel indentation du code avait été comme ça, vous auriez obtenu un SyntaxError, donc je pense que vous venez a fait erreur en affichage et votre vrai problème reste caché.

Si vous utilisez ce sous Windows, vous ne pouvez pas avoir l'Arduino IDE ouvert avec une connexion série en même temps que vous exécutez votre script Python. Cela jette la même erreur.

Permettez-moi de faire quelques observations qui pourraient être utiles pour vous et d'autres personnes avec des problèmes similaires. Tout d'abord, essayez d'exécuter votre croquis Arduino avec le moniteur de série quelques fois. Vous pouvez trouver le Serial Monitor sous les outils dans le menu IDE. Vous pouvez également taper Ctrl-Shift-M pour appeler le moniteur série.

Le moniteur série affiche ce que le sketch Arduino renvoie à vous. Cependant, il vous permet également de taper des données qui est envoyé à l'esquisse Arduino. En d'autres termes, vous tester et déboguer les deux côtés du flux de données série, juste en utilisant le moniteur de série.

Regardez ce qui apparaît. Il sera souvent très utile en supposant que votre croquis tente d'envoyer des données via Serial.print (). Quelques notes. Absolument sûr que la vitesse de transmission réglée à l'intérieur du moniteur série correspond exactement à la vitesse de transmission dans votre dessin (9600 est un bon choix dans presque tous les cas).

La deuxième note est critique. Apporter le moniteur série oblige une remise à zéro sur la carte Arduino. Votre croquis commence sur (toujours). Ceci est une bonne chose, car il vous donne une nouvelle course à chaque fois. Notez que vous pouvez forcer une réinitialisation, juste en réglant la vitesse de transmission à 9600 (même si elle est déjà 9600). Cela vous permet d'exécuter de nombreux tests à l'intérieur du moniteur série sans avoir à redémarrer le moniteur série à chaque fois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top