[PYTHON] Serielle Kommunikation mit Raspberry Pi + PySerial

Einführung

Ich wollte seriell mit Raspberry Pi kommunizieren, also habe ich versucht, über die serielle USB-Konvertierung zu kommunizieren. Ich bezog mich auf "Ich habe versucht, serielle Kommunikation mit Raspberry Pi". Der Empfangsverarbeitung wurde ein Empfangszeitlimit hinzugefügt, unter der Annahme, dass die Verarbeitung in der Reihenfolge Befehlsübertragung → Befehlsempfang ausgeführt wird.

Umgebung

Installation

$ pipenv install pyserial

USB serielle Konvertierung

Ich habe [serielles FT232-USB-Konvertierungskabel] verwendet (http://akizukidenshi.com/catalog/g/gM-08343/). Wenn es mit dem FT232-Chip ausgestattet ist, scheint es ohne Hinzufügen eines Treibers erkannt zu werden.

Überprüfen Sie das Verbindungsziel mit dem folgenden Befehl.

$ ls -la /dev/ttyUSB*

Wenn es sich um die erste Einheit handelt, lautet das Verbindungsziel '/ dev / ttyUSB0'.

Hinweis: Verwenden Sie für die Kommunikation mit Rasberry Pi auf einem PC (Windows / Mac / Linux) ein Querkabel. Da Rasberry Pi auch ein PC ist, gibt es ein Querkabel zwischen PCs, und die Verbindung zu Kommunikationsgeräten ist (häufig) gerade.

Code

Serielle Kommunikationsklasse

sample.py


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

import serial
import time
import threading

"""
Serielle Kommunikationsklasse
"""
class SampleComm:
    #Initialisieren
    def __init__(self):
        #Flagge öffnen
        self.isPortOpen = False
        #empfangene Daten
        self.recvData = bytearray()
        #Ereignisgenerierung
        self.event = threading.Event()

    #Warten auf Datenempfang(Mit Timeout[sec])
    def recv(self, timeout=3):
        #Holen Sie sich Zeit für eine Auszeit
        time_start = time.time()
        time_end = time_start
        #Ereignis "Thread warten" löschen
        self.event.clear()
        #Empfangene Daten löschen
        self.recvData.clear()
        #Erhaltenes Ergebnis True:Erfolg falsch:Fehler(Auszeit)
        result = False

        #Warten auf Datenempfang
        while not self.event.is_set():
            #Timeout-Prüfung
            time_end = time.time()
            if (time_end - time_start > timeout):
                #Datenübertragung / -empfang gestoppt und fehlgeschlagen(Auszeit)Zu
                result = False
                self.stop()
                print("timeout:{0}sec".format(timeout))
                break

            #Empfangene Daten lesen
            buff = self.comm.read()

            #Erhaltene Datenbeurteilung
            if len(buff) > 0:
                #Empfangene Daten hinzufügen
                self.recvData.extend(buff)
                # (Temporär)Erfolg, wenn \ n empfangen wurde
                if (self.recvData.find(b'\n')) >= 0:
                    #Stoppen Sie das Senden und Empfangen von Daten und machen Sie es erfolgreich
                    result = True
                    self.stop()
                    break

        #Gibt das Ergebnis zurück
        return (result, self.recvData)

    #Datenübertragung
    def send(self, data):
        self.comm.write(data)

    #Stoppen Sie das Senden und Empfangen von Daten
    def stop(self):
        self.event.set()

    #Cyril Port offen
    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

    #Serielle Schnittstelle geschlossen(Explizit schließen)
    def close(self):
        self.stop()
        if (self.isPortOpen):
            self.comm.close()
        self.isPortOpen = False

if __name__ == "__main__":
    #Seriennummer öffnen
    comm = SampleComm()
    comm.open('/dev/ttyUSB0', '115200')

    #Datenübertragung
    comm.send('test'.encode())
    #Datenempfang(Auszeit=10sec)
    result, data = comm.recv(10)
    print(result)
    print(data)

    #Seriennummer schließen
    comm.close();

wie benutzt man

In pySerial Version 2.5 und höher lautet das Argument von write () bytearray (). Wenn Sie eine Zeichenfolge senden möchten, führen Sie die entsprechende Codierung () aus. str.encode () ist standardmäßig 'utf-8'.

#Seriennummer öffnen
comm = SampleComm()
comm.open('/dev/ttyUSB0', '115200')

#Datenübertragung
comm.send('sample'.encode())
#Datenempfang(Auszeit=10sec)
result, data = comm.recv(10)
print(result)
print(data)

#Seriennummer schließen
comm.close();

Sie können den Vorgang auch überprüfen, indem Sie sample.py ausführen.

$ python sample.py

abschließend

Die Kommunikation mit dem Gerät wird häufig in der Reihenfolge Befehlsübertragung → Befehlsempfang verarbeitet, und ich habe es gemacht, weil ich den Empfangsprozess mit einer Zeitüberschreitung ausführen wollte. Es ist notwendig, das Urteil über den Abschluss des Empfangs entsprechend zu ändern. Ich hoffe, dass es für ähnliche Fälle in der seriellen Kommunikation hilfreich sein wird.

Recommended Posts

Serielle Kommunikation mit Raspberry Pi + PySerial
Aktivieren Sie die serielle UART + -Kommunikation mit Raspberry Pi
Serielle Kommunikation mit Python
GPGPU mit Raspberry Pi
DigitalSignage mit Raspberry Pi
Serielle Kommunikation zwischen Raspberry pi - Arduino Uno (Python)
Mutter pflanzt mit Raspberry Pi
[Raspberry Pi] Schrittmotorsteuerung mit Raspberry Pi
Testen der Kommunikation mit Raspberry Pi
Servomotorsteuerung mit Raspberry Pi
Betriebssystem-Setup mit Raspberry Pi Imager
Probieren Sie L Chika mit Himbeerpi
Überprüfen Sie einfach die serielle Kommunikation mit tk
Aufbau eines VPN-Servers mit Raspberry Pie
Versuchen Sie, 3 Servos mit Raspeye zu bewegen
Verwenden einer Webkamera mit Raspberry Pi
Messen Sie die SIM-Signalstärke mit Raspberry Pi
Hallo Welt mit Raspberry Pi + Minecraft Pi Edition
Erstellen Sie eine Tensorflow-Umgebung mit Raspberry Pi [2020]
Versuchen Sie, mit Raspberry Pi nach Wakasagi zu fischen
Normal programmieren mit Node-RED-Programmierung mit Raspberry Pi 3
Verbesserter menschlicher Sensor mit Raspberry Pi
Versuchen Sie die Objekterkennung mit Raspberry Pi 4 + Coral
Den Servomotor SG-90 mit Himbeer-Pi betreiben
Arbeiten mit Sensoren in Mathematica auf Raspberry Pi
Verwenden Sie einen PIR-Bewegungssensor mit Himbeer-Pi
Machen Sie einen Waschtrocknungs-Timer mit Raspberry Pi
Infer Custom Vision Modell mit Raspeye
Bedienen Sie das Oszilloskop mit dem Raspberry Pi
Erstellen Sie eine Auto-Anzeige mit Himbeer-Pi
Protokollieren des Werts von Inkbird IBS-TH1 mit Raspberry Pi
Arbeiten mit GPS in Python für Raspberry Pi 3
Discord Bot Himbeere Pi Null mit Python [Hinweis]
Ich habe L-Chika mit Razpai 4 (Python Edition) ausprobiert.
Genießen Sie die elektronische Arbeit mit GPIO von Raspberry Pi
MQTT Radicon Car mit Arduino und Himbeere
Schalten Sie Ihren PC mit Himbeer-Pi ein / aus
CSV-Ausgabe von Impulsdaten mit Raspberry Pi (CSV-Ausgabe)
Beobachten Sie die Futago-Meteorgruppe mit Raspberry Pi4
Holen Sie sich CPU-Informationen von Raspberry Pi mit Python
Holen Sie sich Temperatur und Luftfeuchtigkeit mit DHT11 und Raspberry Pi
Aktieninvestitionsanalyse-App mit Himbeerkuchen gemacht
Protokollieren des Werts von Inkbird IBS-TH1 mini mit Raspberry Pi
Stellen Sie mit Python auf Raspberry Pi eine Verbindung zu MySQL her
GPS-Tracking mit Raspeye 4B + BU-353S4 (Python)
Messen Sie die CPU-Temperatur von Raspeye mit Python
Notieren Sie Temperatur und Luftfeuchtigkeit mit systemd auf Raspberry Pi
Socket-Kommunikation mit Python
Maschinelles Lernen mit Raspberry Pi 4 und Coral USB Accelerator
Führen Sie die LED-Matrix interaktiv mit Raspberry Pi 3B + auf Slackbot aus
Verwendung des digitalen Beleuchtungsstärkesensors TSL2561 mit Raspberry Pi
Was ist Raspberry Pi?
Einfaches IoT, um mit Raspeye und MESH zu beginnen
Mit Akizuki Denshis 4WD Auto FT-MC-004 mit Raspberry Pi
Stellen wir uns den Raum mit Raspeltorte vor, Teil 1
Pigpio auf Himbeer-Pi