Hantek Protokoll DSO Serie mit Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sauterle
User
Beiträge: 87
Registriert: Mittwoch 27. Juli 2022, 21:33

Hallo
ich nutze Python 3.12 und habe ubuntu. Ich versuche seit ein paar tagen, die Daten von meinem DSO1062D Oszilloskop über dessen USB Schnittelle auf mein Computer zu bekommen. Leider gibt es nach meinen Recherchen keine funktionierende Software mit der man das unter linux/Windows direkt machen kann. Die mitgelieferte Software TTScope funktioniert schlecht und kann die kurven nur als Bilder exportieren. Diese mit opencv unn numpy umzuwandeln ist mir zu aufwändig und zu ungenau. aber ich habe diesen Artikel gefunden, indem das protokol von den hantek/tektronix/Voltkraft DSO Oszilloskopen erklärt ist https://www.mikrocontroller.net/article ... _Protokoll
darauf basierend habe ich mir dieses kleine python test Progrämmchen geschrieben, das die DSO Einstellungen lesen sollte:

Code: Alles auswählen

import usb.util

BULK_OUT = 0x02
BULK_IN  = 0x81

dev = usb.core.find(idVendor=0x049f, idProduct=0x505a)
if dev is None:
    raise ValueError("Device not found")

if dev.is_kernel_driver_active(0):
    dev.detach_kernel_driver(0)

dev.set_configuration()

cmd = [0x53, 0x02, 0x00, 0x01, 0x56]
dev.write(BULK_OUT, cmd)

data = dev.read(BULK_IN, 1024)
print(data)
Wenn man es ausführt bekommt man manchmal die angefragten daten auch geprinted. Meistens gibt es aber diese Fehlermeldung aus:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/lsauter/PycharmProjects/DSO_Software/test1,5.py", line 101, in <module>
    _ = read_bulk(dev)  # Ignore, but should parse for real application
        ^^^^^^^^^^^^^^
  File "/home/lsauter/PycharmProjects/DSO_Software/test1,5.py", line 28, in read_bulk
    return dev.read(BULK_IN, length, timeout=TIMEOUT)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/lsauter/PycharmProjects/DSO_Software/.venv/lib/python3.12/site-packages/usb/core.py", line 1043, in read
    ret = fn(
          ^^^
  File "/home/lsauter/PycharmProjects/DSO_Software/.venv/lib/python3.12/site-packages/usb/backend/libusb1.py", line 850, in bulk_read
    return self.__read(self.lib.libusb_bulk_transfer,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/lsauter/PycharmProjects/DSO_Software/.venv/lib/python3.12/site-packages/usb/backend/libusb1.py", line 958, in __read
    _check(retval)
  File "/home/lsauter/PycharmProjects/DSO_Software/.venv/lib/python3.12/site-packages/usb/backend/libusb1.py", line 602, in _check
    raise USBTimeoutError(_strerror(ret), ret, _libusb_errno[ret])
usb.core.USBTimeoutError: [Errno 110] Operation timed out
Das programm funktionirt meistens immer ein paar mal hintereinander und dann wieder etwas länger nicht. Ich hatte auch mal ein testprogramm dass sich immer zwei mal ausführen lassen hat und dann beim dritte mal die Fehlermeldung ausgespuckt hat. Bei den meisten anderen Komandos verhählt sich mein Programm/Oszilloskop ähnlich
Ich würde mich sehr über ein feedback,mwas ich falschgemacht haben könnte, oder was ich noch testen könnte freuen
LG sauterle
Benutzeravatar
grubenfox
User
Beiträge: 609
Registriert: Freitag 2. Dezember 2022, 15:49

sauterle hat geschrieben: Dienstag 8. Juli 2025, 21:17 Ich würde mich sehr über ein feedback,mwas ich falschgemacht haben könnte, oder was ich noch testen könnte freuen
Den Programmcode und die Fehlermeldung verwechselt. Das passt nämlich nicht zusammen. Also vielleicht mal die Fehlermeldung, die beim ausführen des obigen Codes entsteht, posten bzw. die Datei File "/home/lsauter/PycharmProjects/DSO_Software/test1,5.py" posten...
sauterle
User
Beiträge: 87
Registriert: Mittwoch 27. Juli 2022, 21:33

ups tatsächlich.
hier die richtige fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/lsauter/PycharmProjects/DSO_Software/testForum.py", line 18, in <module>
    data = dev.read(BULK_IN, 1024)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/lsauter/PycharmProjects/DSO_Software/.venv/lib/python3.12/site-packages/usb/core.py", line 1043, in read
    ret = fn(
          ^^^
  File "/home/lsauter/PycharmProjects/DSO_Software/.venv/lib/python3.12/site-packages/usb/backend/libusb1.py", line 850, in bulk_read
    return self.__read(self.lib.libusb_bulk_transfer,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/lsauter/PycharmProjects/DSO_Software/.venv/lib/python3.12/site-packages/usb/backend/libusb1.py", line 958, in __read
    _check(retval)
  File "/home/lsauter/PycharmProjects/DSO_Software/.venv/lib/python3.12/site-packages/usb/backend/libusb1.py", line 602, in _check
    raise USBTimeoutError(_strerror(ret), ret, _libusb_errno[ret])
usb.core.USBTimeoutError: [Errno 110] Operation timed out
sauterle
User
Beiträge: 87
Registriert: Mittwoch 27. Juli 2022, 21:33

hallo
ich habe noch ein paar mehr Merkwürdigkeiten gefunden. bitte sagt mir ob ihr denk, dass das Problem an meinem Code, falschen Informationen über das Protokoll oder an dem Oszilloskop liegt.
mit[0x53, 0x04, 0x00, 0x12, 0x01, 0x01, 0x6b] kann man die bedienoberfläche des Osziloskopes sperren. als antwort sollte man nach dem sperren [0x53, 0x04, 0x00, 0x92, 0x01, 0x00, 0xea] bekommen. Man entsperrt sie mit t[0x53, 0x04, 0x00, 0x12, 0x01, 0x00, 0x6b], und bekommt dann [0x53, 0x04, 0x00, 0x92, 0x00, 0x00, 0xea] als antwort. mit 0x53, 0x02, 0x00, 0x01, 0x56 kann man die aktuellen einstellungen ablesen.

führt man diesen Programmschnipsel aus (natürlich, mus man dev wie oben erst erstellen) gibt es eine fehlermeldung(dieselbe wie oben gepostet), dass das erste dev.read in ein timeout gelaufen ist, was wohl bedeuted, dass der pc keine antwort vom Oszilloskop bekommen hat.

Code: Alles auswählen

dev.write(BULK_OUT, [0x53, 0x04, 0x00, 0x12, 0x01, 0x01, 0x6b])
data = dev.read(BULK_IN, 1024, timeout=2000)
print(data)

time.sleep(1)

dev.write(BULK_OUT, [0x53, 0x02, 0x00, 0x01, 0x56])
data = dev.read(BULK_IN, 1024, timeout=2000)
print(data)

time.sleep(1)

dev.write(BULK_OUT, [0x53, 0x04, 0x00, 0x12, 0x01, 0x00, 0x6a])
data = dev.read(BULK_IN, 1024, timeout=2000)
print(data)
sendet man das stop komando aber zweimal verschwindet die fehlermeldung meistens und die bedieoberfläche ist tatsächlich für ca 10s gesperrt:

Code: Alles auswählen

dev.write(BULK_OUT, [0x53, 0x04, 0x00, 0x12, 0x01, 0x01, 0x6b])
dev.write(BULK_OUT, [0x53, 0x04, 0x00, 0x12, 0x01, 0x01, 0x6b])

data = dev.read(BULK_IN, 1024, timeout=2000)
print(data)

time.sleep(10)

dev.write(BULK_OUT, [0x53, 0x02, 0x00, 0x01, 0x56])
data = dev.read(BULK_IN, 1024, timeout=2000)
print(data)

time.sleep(1)

dev.write(BULK_OUT, [0x53, 0x04, 0x00, 0x12, 0x01, 0x00, 0x6a])
data = dev.read(BULK_IN, 1024, timeout=2000)
print(data)

Code: Alles auswählen

/home/lsauter/PycharmProjects/DSO_Software/.venv/bin/python /home/lsauter/PycharmProjects/DSO_Software/testForum3.py 
array('B', [83, 4, 0, 146, 1, 1, 235])
array('B', [83, 210, 0, 129, 1, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 134, 1, 0, 0, 0, 0, 0, 0, 160, 114, 78, 24, 9, 0, 0, 160, 134, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 32, 161, 7, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 206, 255, 32, 161, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 32, 161, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 161, 7, 0, 0, 0, 0, 0, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 0, 8, 15, 0, 5, 15, 0, 2, 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 6, 0, 7, 0, 10, 0, 8, 12, 41, 1, 218])
array('B', [83, 4, 0, 146, 1, 0, 234])

Process finished with exit code 0
ich hatte auch schon öfter den fall, das das sich die antwort des Oszilloskopes nicht auf den letzten sondern immer auf den vorletzten befehl beziehen zu schien. Oft konnte ich aber auch gar kein Muster feststellen.

LG sauterle
Benutzeravatar
__blackjack__
User
Beiträge: 14023
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich persönlich würde ja erst einmal anfangen mit dem Echo-Kommando zu experimentieren. Bietet sich auch an um allgemeinere Funktionen zum senden und empfangen von Paketen zu schreiben, statt mit festen Bytefolgen zu arbeiten.

Ist sichergestellt, dass nicht noch ein anderes Programm mit dem Gerät ”gleichzeitig” kommuniziert?
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten