ich hoffe sehr auf Hilfe von jemandem der sich mit Python2.7 auskennt.
Um ein kleines Spektrometer aus zu lesen habe ich mir eine GUI und den entsprechenden Code zum Abfragen der RS232 erstellt (das Spektrometer ist schon älter und hat nur eine RS232).
Das funktioniert soweit auch sehr gut, ist allerdings mit einer Ausleserate von 1Hz recht langsam, da es die Daten komplett aus der CCD-Zeile ausliest und überträgt.
Das Gerät bietet auch einen komprimierten Datenmodus, bei dem nach folgendem Algorithmus Bytes übertragen werden:
Every scan transmitted by the BTC110S will then be compressed. The compression
algorithm is as follows:
1. The first pixel data (a 16-bit unsigned integer) is compared to
• If the data different >=128,then send 3 Byte as follow
0x80
Data High
Data Low
• If the data different <128,Then send 1 Byte as follow
Data Different
2. The next pixel data is compared to previous pixel data.
• If the data different >=128,Then send 3 Byte as follow
0x80
Data High
Data Low
• If the data different <128,Then send 1 Byte as follow
Data Different
3. Repeat step 2 until all pixels have been read.
Damit überträgt das Gerät dann deutlich weniger Bytes und es klappt in 350 ms einmal alle Pixelwerte zu übertragen.
Ds Format ist wie folgt:
Pixel value----Value difference-----Transmitted bytes
185-------------0----------------------0x80 0x00 0xb9
2151-----------1966------------------0x80 0x08 0x67
836----------- -1315----------------- 0x80 0x03 0x44
118----------- -92-------------------- 0xa4
90------------ -28-------------------- 0xe4
......
(Die Striche sind nur als Platzhalter für etwas tabellenartiges.)
Das würde mir auch reichen, wenn ich denn die Daten auslesen könnte.
Mein Code, den ich zum Testen von Hand starte sieht wie folgt aus:
Code: Alles auswählen
# ...
def oneValue(self):
file = open('G:\\datentest.txt', 'w')
if ser.isOpen():
global daten
try:
n = 0
daten = []
ser.flushInput()
time.sleep(0.05)
ser.write("S\n")
time.sleep(0.05)
S = ser.readline()
ACK = ser.readline()
# read 3 Byte and remove start flag \x80 from string
pix0 = int((ser.read(3)).replace("\x80", "").encode('hex'), 16) #### funktioniert gut ##########
print 'pix0 = ', pix0
daten.append(pix0)
while n <= 2046:
#if ser.inWaiting():
pixstr = repr(ser.read(1))
print 'pixstr =', pixstr
if pixstr == repr("\x80"):
print 'hallo'
pix1 = int((ser.read(2)).encode('hex'), 16) ##### test#######
print 'pix1 = ', pix1
else:
pix1 = int(ser.read(1).encode('hex'), 16) ##### test #######
print 'pix1 = ', pix1
n +=1
except:
pass
finally:
file.close()
anderen Werten zeigt mir zumindest, daß Werte kommen und wie sie aussehen.
Ich bin aber nicht in der Lage '0x80' zu erkennen, obwohl ich es beim ersten Pixel problemlos aus den 3 Bytes entfernen kann.
Seit 2 Wochen durchsuche ich die greifbaren Doku's aber entweder verstehe ich es falsch oder ich habe einen Denkfehler.
Kann mir jemand zeigen wie man die Daten korrekt auslesen kann und wie man mit den negativen Daten in Python umgeht?
Im Prinzip weiß ich es bei den negativen Werten:
Wenn 8 bit-Wert > 127 dann ziehe von Wert 256 ab. Aber soweit komme ich ganicht erst.
Die mit ##### test ####### markierten Zeilen sind nur die letzten kläglichen Versuche aus reiner Verzweifelung, um wenigstens mal eine Zahl zu sehen. Aber .... .
Wenn auch der Teil in der while-Schleife noch nicht korrekt ist, den bekomme ich problemlos hin, wenn ich zumindest die Werte irgendwie
korrekt gewandelt bekomme.
Könnte mir jemand helfen?
Vielen Dank
Jens