mikrocontroller.net

Forum: Projekte & Code Screenshots von TDS4XX automatisch abspeichern, mit Python


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Hallo Zusammen,

Ich habe folgendes kleines Programm zum automatischen Abspeichern von 
TDS4XX Screenshots geschreiben.

Dabei wartet es auf den Empfang des Screenshots, speichert ihn nach dem 
Empfangen automatisch ab, zeigt ihn an und wartet auf den nächsten.

Die Sendeparameter sind dabei:
Bardrate=19200,
Bytesize=8
Parity='N'
Stopbits=1,
xonxoff=0,
rtscts=1

Beim abspeichern wird die BMP-Datei dabei zu PNG umgewandelt, dadurch 
werden aus 38KB nur noch ~5-8KB.

Zur Nutzung sind die Python-Libs Erweiterungen PIL und serial nötig.
from PIL import Image
import sys
import serial
import io
import os

flag = 0
cnt = 0
s = bytearray()
ser = serial.Serial('COM1', 19200, bytesize=8,parity='N', stopbits=1, timeout=1, xonxoff=0, rtscts=1)
durchl =0
Bytes1=0
Bytes2=0
fileformat = '.bmp'
while 1:
    while flag == 0:
        Bytes2=len(s)
        s = s + ser.read()     
        if Bytes2 == Bytes1 and Bytes2 > 0 :             #Wenn Inhalt drinn ist
            flag = 1
        Bytes1=Bytes2
    f = open('Screen' + str(cnt) + fileformat, 'w+b')
    binary_format = bytearray(s)
    f.write(binary_format)
    f.close()


    im=Image.open('Screen' + str(cnt) + fileformat)
    a=im.rotate(270,0,1)
    a.show()
    a.save('Screen' + str(cnt) + '.png')
    os.remove('Screen' + str(cnt) + fileformat) 
    flag=0
    Bytes1=0
    Bytes2=0
    s = bytearray()
    cnt=cnt+1

Nun möchte ich jedoch auch Farb-Plots im EPS-Format abspeichern können, 
so einen zeigt der EPS-Screen.

Dabei gibt es in Zeile 29 bei der Umwandlung/Drehen von EPS zu PNG ein 
problem.
"Unable to locate Ghostscript on paths"

Dabei habe ist Ghostscript 9.26 installiert und auch als 
PATH-Umgebungsvariable angegeben.

Wäre sehr schön wenn jemand wüsste wie man dass Problem löst?

Grüße und Vielen Dank,
Matthias

Autor: Walter T. (nicolas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias schrieb:
> Nun möchte ich jedoch auch Farb-Plots im EPS-Format abspeichern können

Schluß ins Blaue: Ich würde meinen Latex-Workflow von DVIPS mal langsam 
richtung PDFLatex umstellen. Es hat mittlerweile fast nur noch Vorteile.


Zu Deiner eigentlichen Frage: Funktioniert die Konvertierung mit 
Ghostscript denn in der normalen Kommandozeile?

Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Walter T. schrieb:
> Zu Deiner eigentlichen Frage: Funktioniert die Konvertierung mit
> Ghostscript denn in der normalen Kommandozeile?

Gute Frage, ich habe Ghostscript noch nie verwendet, wollte es auch nur 
in diesem Zusammenhang nutzen.

Aber nun hat sich dass Problem wohl von alleine gelöst, es funktioniert.
Warum?
Ich habe nun mindestens 2 mal neu Gestartet und als Path für den 
aktuellen benutzer ist:
C:\Program Files\gs\gs9.26\bin
eingetragen...

Nun spielt es auch keine Rolle ob das Oszi EPS oder BMP sendet, in 
beiden Fällen wird ein PNG erzeugt und abgespeichert.

Auch dass aus EPS erzeugte PNG ist somit nur ~7KB groß und ermöglicht 
eine bessere Unterscheidbarkeit von Kanälen und MATH-Funktionen.

Hier nochmal der endgültige Code:
from PIL import Image
import sys
import serial
import io
import os

flag = 0
cnt = 0
s = bytearray()
ser = serial.Serial('COM1', 19200, bytesize=8,parity='N', stopbits=1, timeout=3, xonxoff=0, rtscts=1)
durchl =0
Bytes1=0
Bytes2=0
fileformat = '.bmp'
while 1:
    while flag == 0:
        Bytes2=len(s)
        s = s + ser.read()     # read up to one hundred bytes
        if Bytes2 == Bytes1 and Bytes2 > 0 :             #Wenn Inhalt drinn ist
            flag = 1
        Bytes1=Bytes2
    f = open('Screen' + str(cnt) + fileformat, 'w+b')
    binary_format = bytearray(s)
    f.write(binary_format)
    f.close()


    im=Image.open('Screen' + str(cnt) + fileformat)
    a=im.rotate(270,0,1)
    a.show()
    a.save('Screen' + str(cnt) + '.png')
    im.close()
    os.remove('Screen' + str(cnt) + fileformat) 
    flag=0
    Bytes1=0
    Bytes2=0
    s = bytearray()
    cnt=cnt+1

Grüße, vielen Dank und manchem vielleicht noch einigen Spass damit :)
Matthias

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.