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)
非常に多くのグローバル変数を使用しないでください – CoryKramer
完全なトレースバックを投稿してください。この質問は不完全です。 –
あなたはエラーを投稿できますか? –