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.
$ pipenv install pyserial
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.
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();
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
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