2016-07-01 7 views
3

Ich bin neu in Python und Programmierung im Allgemeinen. Ich versuche einen Gerätetreiber mit Pyserial zu schreiben. Ich öffnete einen Thread, der Daten von dem Gerät lesen und an std out senden würde. In meiner Hauptschleife verwendete ich eine Funktion, die Anweisungen von std als Strings lesen und sie mit einem Wörterbuch auf das Gerät schreiben würde.Python Multithreading mit PySerial Objekt

Mein Programm liest meine Anweisungen, zeigt aber keine Daten an, die aus dem Gerät kommen sollten - ich weiß, dass es auf dem Gerät geschrieben wurde, weil es abstürzt, wenn ich eine Anweisung nicht in meinem Wörterbuch verwende. Hier ist, wie mein Code strukturiert ist:

import serial 
import threading 
#ser is my serial object 

def writeInstruction(ser): 
#reads an instruction string from stdin and writes the corresponding instruction to the device 
    instruction = raw_input('cmd> ') 
    if instr == 'disable_all': defaultMode(ser) 
    else: ser.write(dictionaryOfInstructions[instruction]) 
    time.sleep(.5) 

def readData(ser): 
# - Reads one package from the device, calculates the checksum and outputs through stdout 
# - the package content (excludes the Package head, length, and checksum) as a string 
    while True: 
      packetHead = binascii.hexlify(ser.read(2)) 
      packetLength = binascii.hexlify(ser.read(1)) 
      packetContent = binascii.hexlify(ser.read(int(packetLength, 16) - 1)) 

      if checkSum(packetHead + packetLength + packetContent): 
      print packetContent 

readThread = threading.Thread (target = readData, args = ser) 
readThread.start() 

while True: 
     writeInstr(ser) 

Was ist der richtige Weg, serielle Objekte in Multithread-Programmierung zu behandeln?

+0

Es würde helfen zu wissen, was Sie in 'readdata (ser) zu tun versuchen,'. Ich frage mich, ob Ihr Thread fertig ist, bevor Sie irgendwelche Daten erhalten. und 'writeInstruction (ser)' können Sie mehr Code von diesen Funktionen zur Verfügung stellen? –

+0

writeInstruction (ser) schaltet die Datenerfassung des Geräts ein (medizinisches Gerät) readData (ser) liest einzelne Pakete vom Gerät und überprüft sie. –

+1

Der angegebene Code reicht zur Diagnose des Problems nicht aus. Versuchen Sie, möglichst einen [MCVE] (http://stackoverflow.com/help/mcve) zu veröffentlichen. – Aya

Antwort

1

Sie können es wie folgt tun:

import serial 
from threading import Thread 
from functools import wraps 


# decorate the function - start another thread 
def run_async(func): 

     @wraps(func) 
     def async_func(*args, **kwargs): 
       func_hl = Thread(target = func, args = args, kwargs = kwargs) 
       func_hl.start() 
       return func_hl 

     return async_func 

@run_async      #use asyncronously 
def writeInstruction(ser): 
    #reads command from stdin 
    #Writes the command to the device (enabling data output) 


@run_async      #use asynchronously 
def readData(ser): 
    #reads the packets coming from the device 
    #prints it through std out 

your_arg = 'test' 
writeInstruction(your_arg) 
+0

Ich bekomme eine thread.error: kann neuen Thread nicht starten Traceback: writeInstr (ser), func_h1.start() –

+0

von Threading importieren Thread - muss so sein – dmitryro

+0

Verwenden Sie einfach @ run_async für jede Funktion, die Sie erklären und müssen asynchron sein - und es wird funktionieren. Ich weiß nicht, ob es in einer Schleife laufen soll – dmitryro