seltsame Zeichen von pyserial

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
stocki
User
Beiträge: 2
Registriert: Mittwoch 7. Mai 2014, 09:39

Hallo leutz,

ich habe folgendes python script gebaut mit dem man eine serielle Schnittstelle abhören und ausgeben kann,
das problem ist auf einem PC sieht die Ausgabe ziemlich seltstam aus, wie z.B Pfeile nach oben usw. also eher ascci zeichen.
Es ist aber nur bei einem PC bei einem anderen PC sieht alles gut aus.
anbei mein script:

Code: Alles auswählen

import Tkinter
from threading import Thread
import os
import sys
from serial import *
import win32clipboard, win32con
import time
import datetime


class PrintThread(Thread):
    def __init__(self,master,mainlabel):
        self.master=master
        self.label=mainlabel
        self.loop=False
        
        self.connection=""
        self.ser = Serial(port=0, baudrate=19200, bytesize=8, parity='N', stopbits=1, timeout=0, xonxoff=0, rtscts=0)        
        master.protocol("WM_DELETE_WINDOW", self.handler)
        Thread.__init__(self)

    
    def handler(self):
        self.loop=False
        print "Destoy root window."
        self.master.quit()
  
        
    def run(self):
            self.loop=True
            
            while self.loop==True:
                    read_value=self.ser.read(1)
                    if read_value:
                            try:    
                                    textstr =  read_value+self.ser.readline() #get it

                                    win32clipboard.OpenClipboard()
                                    #:if
                                        
                                    win32clipboard.EmptyClipboard()
                                    win32clipboard.SetClipboardText(textstr.decode('utf-8'))
                                    win32clipboard.CloseClipboard()                               
                    ###############################################
                                    print textstr
                                    self.label.config(text=textstr.decode('utf-8'))                                                                                        
                                        
                            except Exception:
                               print "Error in Scan barcode"
                                #loop=False
                                
                                
                    time.sleep(1)    
                        
       
             
           

            
    

cmd = os.popen("tasklist.exe /fo csv /nh")
x = cmd.readlines()
s=0
for y in x:
       p = y.find('WMT_LABEL.exe')
       if p >= 0: # process running
           
           s=s+1
if s<2:
        
    main= Tkinter.Tk()



    

    
    #main.configure(height=400,width=600)
     
    def callback():
        Printserv.loop=False
        main.destroy()
        print "Destoy root window."
        main.quit()
    
        
    main.configure(bg="grey")
    main.geometry('200x200')
    button =Tkinter.Button(main, text ="Close App", command = callback)
    button.pack()
    
  
    label = Tkinter.Label( main,text="Value")
    #var.set("Hey!? How are you doing?")
    label.pack()
    
    
    Printserv=PrintThread(main,label) 
    Printserv.start()    
     
     
    
    main.mainloop()
Zuletzt geändert von Anonymous am Mittwoch 7. Mai 2014, 10:28, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@stocki: Als erstes solltest Du das so umschreiben, dass die GUI nur vom Hauptthread aus verändert wird. Tkinter ist wie die meisten anderen GUI-Toolkits nicht „thread safe” und dementsprechend ist das Verhalten von dem Programm undefiniert. Im schlimmsten Fall kann es hart abstürzen.

Du könntest auch mal einen Blick in den Style Guide for Python Code werfen. Einrückung, Leerzeichensetzung und Namensschreibweise weichen davon teilweise ab.

Es sollte auch kein Code auf Modulebene existieren der nicht Konstanten, Funktionen, oder Klassen definiert. Das Hauptprogramm steckt üblicherweise in einer Funktion die `main()` heisst, und mit folgendem Idiom aufgerufen wird, damit man das Modul importieren kann ohne dass Hauptfunktion los läuft:

Code: Alles auswählen

if __name__ == '__main__':
    main()
Statt `os.popen()` würde man besser das `subprocess`-Modul verwenden. Für diesen speziellen Zweck würde ich das `psutil`-Modul installieren. Der Code der die Ausgabe auswertet ist mit diesen einbuchstabigen Namen sehr unschön.

Spricht etwas gegen die Clipboard-Methoden von `Tkinter.Tk`? Dann kann man sich diese spezielle windowsabhängigkeit sparen. Zusammen mit `psutil` wäre das Programm dann eventuell sogar schon unabhängig von Windows und könnte auch unter Linux oder MacOS verwendet werden.
stocki
User
Beiträge: 2
Registriert: Mittwoch 7. Mai 2014, 09:39

Hallo Black Jack,

geb ich Dir Recht ich werde es korrigieren :-)
ich hab mal in der Doku von Pyserial geguckt und die Funktion readln sieht wie folgt aus:


readline(size=None, eol='\n')
Parameters:

size – Max number of bytes to read, None -> no limit.
eol – The end of line character.

Read a line which is terminated with end-of-line (eol) character (\n by default) or until timeout.


heisst ich bekomme eine anzahl von bytes die werden wiederum als Ascii zeichen angezeigt hmmm
Ok was sagt mir das ?? :oops:
BlackJack

@stocki: Keine Ahnung was Dir das sagt. Du musst schon selber wissen was da für Daten über die Leitung kommen und wie man die interpretieren muss. Man kann halt nur Bytes über die serielle Schnittstelle übertragen, oder in Dateien speichern, oder über Sockets übertragen, und so weiter.
Antworten