2017-07-21 8 views
-2

1秒ごとに変数をインクリメントするスレッドタイマーを作成しようとしています。変数は、コールバック関数内にあり、所定の時間内にデータが受信されない場合にタイムアウトを設定するために、シリアル受信関数で照会されます。コールバック関数と受信関数の両方には、グローバルとして宣言された変数と、変数がタイマークラスの外で宣言されています。コールバックがトリガーされるたびに、割り当てエラーが表示されます。このエラーを修正するために私が間違っていることを確認できません。あなたは本当にこのようなグローバル変数を使用しないでください、と述べPythonの代入エラーの前に参照されるローカル変数の取得

# python27 Serial Interface Prototype - MH 20170711 
__author__ = 'MHammersley' 

from serial import * 
import threading 

gRdTimeout = 0 
t = None 

class Cmd_Resp(object): 

    # opens a usb-to-serial com port session at the specified baud rate 
    def __init__(self, serial_port, baud, delimiter = '/n'): 
     #ensure non-blocking 
     self.serial_port = serial_port 
     self.baud = baud 
     self.delimiter = delimiter 
     self.port = Serial(serial_port, baud, timeout = 0, writeTimeout=0) 
     global t 
     self.t = threading.Timer(1.0, self.UpdateTimer).start() 

    # this function updates the timer variable in 1 second increments 
    def UpdateTimer(self): 
     global gRdTimeout 
     gRdTimeOut += 1 
     print('Count: ', gRdTimeout) 

    def start(self): 
     global t 
     self.t.start() # start the timer 

    # write only command, no read response 
    def send(self, cmd): 
     #Write command to com port 
     self.port.write(cmd+self.delimiter) 

    # read only until the expected response string is received 
    def receive(self, exp_resp, timeout): 
     #Read device response from com port. 
     global gRdTimeout, t 
     gRdTimeOut = 0 # set the timeout count to 0 
     serBuffer = "" # empty the buffer 
     tflag = True 
     self.t.start() # start the timer 
     loop = True 
     while (loop != False): 
      c = self.port.read() 
      if c == '\n': 
       serBuffer += "\n" # add the newline to the buffer 
      else: 
       serBuffer += C# add to the buffer 
      if exp_resp in serBuffer: 
       loop = False 
      if gRdTimeout >= timeout: 
       break 
     self.t.cancel() # stop the timer 
     return serBuffer 

    # sends a command to the uut and reads until the expected response is received 
    def request(self, cmd, exp_resp): 
     self.send(cmd) 
     self.exp_resp = exp_resp 
     return self.receive(exp_resp) 
+4

非常に多くのグローバル変数を使用しないでください – CoryKramer

+1

完全なトレースバックを投稿してください。この質問は不完全です。 –

+1

あなたはエラーを投稿できますか? –

答えて

1
def UpdateTimer(self): 
    global gRdTimeout # lowercase O 
    gRdTimeOut += 1 # capital O 
    print('Count: ', gRdTimeout) 

。特にこれをクラスにカプセル化するという問題に既に直面しているように。 datetime.datetime.now() + datetime.timedelta(seconds=timeout)に基づいてreceiveに電話をかけたときにタイムアウトを最大に設定し、すべてのチェックで、datetime.datetime.now()がカットオフより早いか遅いかを確認します。

def receive(self, exp_resp, timeout): 
    cutoff = datetime.datetime.now() + datetime.timedelta(seconds=timeout) 
    serBuffer = "" 
    tflag = True # doesn't seem to be used here -- what is this for?? 
    while datetime.datetime.now() <= cutoff: 
     c = self.port.read() 
     serBuffer += C# add to the buffer 
     if exp_resp in serBuffer: 
      return serBuffer 
    return None # or do you want a partial buffer return after timeout expires? 
+1

アダムに感謝します。あなたの提案は大きな助けとなり、私がやろうとしていることに対して非常に簡単な解決策を提供しました。私はあなたのソリューションを自分のコードに実装し、意図した通りに動作します。繰り返しますが、素早く対応していただきありがとうございます! – Mikeehamm

+0

@Mikeehammがうれしかった!これで問題が解決した場合は、投票ボタンの下にある緑色のチェックマークをクリックしてください。これは、私の答えをこの質問の「受け入れられた」回答として選択します。また、あなたと私の評判の両方を表彰します。あなたの質問へのより直接的な回答をすることをお望みなら、自由に行ってください。「受け入れ」のチェックマークは、質問者が任意に指定したものです。 –

関連する問題