2016-07-01 53 views
3

私は一般的にPythonとプログラミングには初めてです。私はpyserialを使用してデバイスドライバを作成しようとしています。私は、デバイスからデータを読み込み、std outに送信するスレッドをオープンしました。私のメインループでは、stdの命令を文字列として読み込み、辞書を使ってデバイスに書き込む関数を使用しました。PySerialオブジェクトを使ったPythonマルチスレッド

私のプログラムは自分の指示を読んでいますが、デバイスから出てくるはずのデータは表示していません。辞書にない命令を使用するとクラッシュするため、デバイスへの書き込みがわかります。私のコードがどのように構成されているのですか?

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) 

マルチスレッドプログラミングでシリアルオブジェクトを扱う適切な方法は何ですか?

+0

それはあなたが 'て、readData(SER)'で行うことをしようとしているかを知るために役立つだろう。私はあなたのスレッドがデータを取得する前に完了しているのだろうかと思います。 'writeInstruction(ser)'もこれらの関数からより多くのコードを提供できますか? –

+0

writeInstruction(ser)はデバイスのデータ収集(医療機器)をオンにしますreadData(ser)はデバイスから個々のパケットを読み取り、チェックサムを返します –

+1

投稿されたコードでは問題を診断するには不十分です。可能であれば[MCVE](http://stackoverflow.com/help/mcve)を投稿してください。 – Aya

答えて

1

あなたはこのようにそれを行うことができます。

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

私はthread.error:新しいスレッドを開始できませんトレースバック:writeInstr(ser)、func_h1.start() –

+0

スレッドのインポートスレッド - このようにする必要があります – dmitryro

+0

あなたが宣言し、必要とする関数には@run_asyncを使用してください非同期でなければなりません。ループ内で実行するかどうかわからない – dmitryro

関連する問題