binäre Daten loggen mit Raspberry Pi

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Somnus
User
Beiträge: 3
Registriert: Dienstag 13. März 2018, 09:56

Hallo,
ich versuche binäre Daten von einem Messinstrument mit einem Pi 3 zu loggen. Dazu habe ich schon folgendes Script gefunden, welches den ASCII-Header perfekt in eine Datei schreibt, die binären Messdaten allerdings nicht. Wie muss ich das Script umschreiben, um auch die binären Daten zu bekommen?

Danke schonmal

#!/usr/bin/env python
# Log data from serial port

# Author: Diego Herranz

import argparse
import serial
import datetime
import time
import os

parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("-d", "--device", help="device to read from", default="/dev/ttyUSB0")
parser.add_argument("-s", "--speed", help="speed in bps", default=9600, type=int)
args = parser.parse_args()

outputFilePath = os.path.join(os.path.dirname(__file__),
datetime.datetime.now().strftime("%Y-%m-%dT%H.%M.%S") + ".bin")

with serial.Serial(args.device, args.speed) as ser, open(outputFilePath, mode='wb') as outputFile:
print("Logging started. Ctrl-C to stop.")
try:
while True:
time.sleep(1)
outputFile.write((ser.read(ser.inWaiting())))
outputFile.flush()
except KeyboardInterrupt:
print("Logging stopped")
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte benutze die Code Tags zur Formatierung deines Codes. Sonst ist der nicht zu entziffern, da die in Python wichtigen Einrückungen verloren gehen.

Und das Skript schreibt binäre Daten. Denn es schreibt ALLE Daten. Wenn da etwas fehlt, hat das mit was anderem zu tun. Zb das man das Gerät erst in einen Modus zur Produktion der Daten bringen muss. Oder das du die binären Daten nicht angezeigt bekommst, weil die nicht druckbare Zeichen sind.
Somnus
User
Beiträge: 3
Registriert: Dienstag 13. März 2018, 09:56

Danke dir. Ich hab den Code mal in eine Codebox getan, hoffe jetzt ist er besser verständlich. Gut, dann werde ich mal weitersuchen.
Gibt es für mich eine Möglichkeit, Stopbits und Parität einzustellen, so wie das bei der Baudrate schon passiert ist?

Code: Alles auswählen

#!/usr/bin/env python
# Log data from serial port

# Author: Diego Herranz

import argparse
import serial
import datetime
import time
import os

parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("-d", "--device", help="device to read from", default="/dev/ttyUSB0")
parser.add_argument("-s", "--speed", help="speed in bps", default=9600, type=int)
args = parser.parse_args()

outputFilePath = os.path.join(os.path.dirname(__file__),
                         datetime.datetime.now().strftime("%Y-%m-%dT%H.%M.%S") + ".bin")

with serial.Serial(args.device, args.speed) as ser, open(outputFilePath, mode='wb') as outputFile:
      print("Logging started. Ctrl-C to stop.")
      try:
           while True:
                         time.sleep(1)
                         outputFile.write((ser.read(ser.inWaiting())))
                         outputFile.flush()
      except KeyboardInterrupt:
             print("Logging stopped")
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Natürlich. Steht alles in der serial Dokumentation. Mir persönlich ist außer 8N1 niemals was anderes begegnet. Und das ist der default. Außerdem würdest du auch keine lesbaren ASCII Daten bekommen, wenn das nicht stimmt.
Somnus
User
Beiträge: 3
Registriert: Dienstag 13. März 2018, 09:56

Danke, ja das passt. Ich bekomme auch ein File, das mit der Zeit größer wird. Werde mir das mal in einem Hex-Editor anschauen.
Antworten