シリアル接続を介してデータを送受信する重要なプログラム(2スレッド)を変更しています。多くの場合、予期しないエラー(または私の側の悪いコーディング:))のために、プログラムは終了し、COMポートは開いたままになります。次の実行時に、COMポートを開こうとするとエラーが発生します。私はこれを完全に軽減し、エラーが発生した場所に関係なく、フェイルセーフコードの一部が実行され、COMポートを閉じようとすることを確認したいと思います。
プログラム全体を1回の試行/例外/最終ブロックでラップすることを回避できますか、それとも各スレッド/クラスを細かく管理する必要がありますか?サイモンに関して
それが役立つ場合は編集されたコード
#usual python imports etc
...
board = pyfirmata.Arduino("COM26", baudrate=57600) # Replace COM26 with your Arduino port
...
#vairable initilistation
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
class ScratchSender(threading.Thread):
#one of the threads
class ScratchListener(threading.Thread):
#the other thread
#bit of code
def cleanup_threads(threads):
for thread in threads:
thread.stop()
for thread in threads:
thread.join()
if __name__ == '__main__':
if len(sys.argv) > 1:
host = sys.argv[1]
else:
host = DEFAULT_HOST
cycle_trace = 'start'
while True:
if (cycle_trace == 'disconnected'):
cleanup_threads((listener, sender))
time.sleep(1)
cycle_trace = 'start'
if (cycle_trace == 'start'):
listener = ScratchListener(the_socket)
sender = ScratchSender(the_socket)
cycle_trace = 'running'
listener.start()
sender.start()
# wait for ctrl+c
try:
#bit of code
#print "motorA val:" , motorA
if ((motorA > 0) or (motorB > 0)):
#do something
else:
#just let the threads do their stuff in the background
time.sleep(0.1)
except KeyboardInterrupt:
cleanup_threads((listener,sender))
board.exit()
sys.exit()