[PYTHON] Communication série avec Raspberry Pi + PySerial

introduction

Je voulais communiquer en série avec Raspberry Pi, j'ai donc essayé la communication en utilisant la conversion série USB. J'ai fait référence à "J'ai essayé la communication série avec Raspberry Pi". Un timeout de réception a été ajouté au traitement de réception en supposant que le traitement sera effectué dans l'ordre émission de commande → réception de commande.

environnement

Installation

$ pipenv install pyserial

Conversion série USB

J'ai utilisé le câble de conversion série USB FT232. S'il est équipé de la puce FT232, il semble être reconnu sans ajout de pilote.

Vérifiez la destination de la connexion avec la commande suivante.

$ ls -la /dev/ttyUSB*

S'il s'agit de la première unité, la destination de la connexion sera «/ dev / ttyUSB0».

Remarque: Lorsque vous communiquez avec Rasberry Pi sur un PC (Windows / Mac / Linux), utilisez un câble croisé. Comme Rasberry Pi est également un PC, il existe un câble croisé entre les PC et la connexion avec les appareils de communication est directe (souvent).

code

Classe de communication série

sample.py


# -*- coding: utf-8 -*-

import serial
import time
import threading

"""
Classe de communication série
"""
class SampleComm:
    #Initialisation
    def __init__(self):
        #Drapeau ouvert
        self.isPortOpen = False
        #données reçues
        self.recvData = bytearray()
        #Génération d'événements
        self.event = threading.Event()

    #En attente de réception des données(Avec timeout[sec])
    def recv(self, timeout=3):
        #Obtenez du temps pour le timeout
        time_start = time.time()
        time_end = time_start
        #Effacer l'événement de thread en attente
        self.event.clear()
        #Effacer les données reçues
        self.recvData.clear()
        #Résultat reçu Vrai:Succès Faux:Échec(temps libre)
        result = False

        #En attente de réception des données
        while not self.event.is_set():
            #Vérification du délai d'attente
            time_end = time.time()
            if (time_end - time_start > timeout):
                #La transmission / réception de données s'est arrêtée et a échoué(temps libre)À
                result = False
                self.stop()
                print("timeout:{0}sec".format(timeout))
                break

            #Lire les données reçues
            buff = self.comm.read()

            #Jugement des données reçues
            if len(buff) > 0:
                #Ajouter les données reçues
                self.recvData.extend(buff)
                # (Temporaire)Succès si \ n a été reçu
                if (self.recvData.find(b'\n')) >= 0:
                    #Arrêtez d'envoyer et de recevoir des données et réussissez
                    result = True
                    self.stop()
                    break

        #Renvoie le résultat
        return (result, self.recvData)

    #Transmission de données
    def send(self, data):
        self.comm.write(data)

    #Arrêter d'envoyer et de recevoir des données
    def stop(self):
        self.event.set()

    #Cyril port ouvert
    def open(self, tty, baud='115200'):
        try:
            self.comm = serial.Serial(tty, baud, timeout=0.1)
            self.isPortOpen = True
        except Exception as e:
            self.isPortOpen = False

        return self.isPortOpen

    #Port série fermé(Fermer explicitement)
    def close(self):
        self.stop()
        if (self.isPortOpen):
            self.comm.close()
        self.isPortOpen = False

if __name__ == "__main__":
    #Série ouverte
    comm = SampleComm()
    comm.open('/dev/ttyUSB0', '115200')

    #Transmission de données
    comm.send('test'.encode())
    #Réception de données(temps libre=10sec)
    result, data = comm.recv(10)
    print(result)
    print(data)

    #Fermer la série
    comm.close();

comment utiliser

Dans pySerial version 2.5 et supérieure, l'argument de write () est bytearray (). Si vous souhaitez envoyer une chaîne, effectuez l'encode () approprié. str.encode () vaut par défaut "utf-8".

#Série ouverte
comm = SampleComm()
comm.open('/dev/ttyUSB0', '115200')

#Transmission de données
comm.send('sample'.encode())
#Réception de données(temps libre=10sec)
result, data = comm.recv(10)
print(result)
print(data)

#Fermer la série
comm.close();

Vous pouvez également vérifier l'opération en exécutant sample.py.

$ python sample.py

en conclusion

La communication avec l'appareil est souvent traitée dans l'ordre de transmission de commande → réception de commande, et je l'ai faite parce que je voulais exécuter le processus de réception avec un timeout. Il est nécessaire de modifier le jugement d'achèvement de la réception, le cas échéant. J'espère que cela sera utile pour des cas similaires dans la communication série.

Recommended Posts

Communication série avec Raspberry Pi + PySerial
Activer la communication série UART + avec Raspberry Pi
Communication série avec Python
GPGPU avec Raspberry Pi
DigitalSignage avec Raspberry Pi
Communication série entre Raspberry pi --Arduino Uno (Python)
Plantes Mutter avec Raspberry Pi
[Raspberry Pi] Contrôle du moteur pas à pas avec Raspberry Pi
Test de la communication UART avec Raspberry Pi
Commande de servomoteur avec Raspberry Pi
Configuration du système d'exploitation avec Raspberry Pi Imager
Essayez L Chika avec raspberrypi
Vérifiez simplement la communication série avec tk
Construire un serveur VPN avec Raspberry Pie
Essayez de déplacer 3 servos avec Raspeye
Utiliser une webcam avec Raspberry Pi
Mesurer la force du signal SIM avec Raspberry Pi
Bonjour le monde avec Raspberry Pi + Minecraft Pi Edition
Créer un environnement Tensorflow avec Raspberry Pi [2020]
Essayez de pêcher le Wakasagi avec Raspberry Pi
Programmation normale avec la programmation Node-RED avec Raspberry Pi 3
Capteur humain amélioré fabriqué avec Raspberry Pi
Essayez la détection d'objets avec Raspberry Pi 4 + Coral
Exécuter le servomoteur SG-90 avec Raspberry Pi
Travailler avec des capteurs dans Mathematica sur Raspberry Pi
Utiliser le capteur de mouvement PIR avec Raspberry Pi
Faire une minuterie de lavage-séchage avec Raspberry Pi
Modèle Infer Custom Vision avec Raspeye
Faites fonctionner l'oscilloscope avec le Raspberry Pi
Créez un compteur de voiture avec Raspberry Pi
Enregistrement de la valeur d'Inkbird IBS-TH1 avec Raspberry Pi
Travailler avec le GPS en Python pour Raspberry Pi 3
Discord bot raspberry pi zéro avec python [Note]
J'ai essayé L-Chika avec Razpai 4 (édition Python)
Profitez du travail électronique avec GPIO de Raspberry Pi
MQTT Radicon Car avec Arduino et Raspberry
Allumez / éteignez votre PC avec Raspberry Pi
Sortie CSV des données d'impulsion avec Raspberry Pi (sortie CSV)
Observez le groupe de météores Futago avec RaspberryPi4
Obtenez des informations sur le processeur de Raspberry Pi avec Python
Obtenez la température et l'humidité avec DHT11 et Raspberry Pi
Application d'analyse des investissements boursiers avec tarte aux framboises
Enregistrement de la valeur d'Inkbird IBS-TH1 mini avec Raspberry Pi
Connectez-vous à MySQL avec Python sur Raspberry Pi
Suivi GPS avec Raspeye 4B + BU-353S4 (Python)
Mesurer la température du processeur de Raspeye avec Python
Enregistrez la température et l'humidité avec systemd sur Raspberry Pi
Communication de socket avec Python
Apprentissage automatique avec Raspberry Pi 4 et Coral USB Accelerator
Exécutez la matrice LED de manière interactive avec Raspberry Pi 3B + sur Slackbot
Utilisez le capteur d'éclairement numérique TSL2561 avec Raspberry Pi
Qu'est-ce que Raspberry Pi?
IoT facile pour démarrer avec Raspeye et MESH
Utilisation de la voiture 4RM FT-MC-004 d'Akizuki Denshi avec Raspberry Pi
Visualisons la pièce avec tarte aux râpes, partie 1
pigpio sur Raspberry pi