0

シリアル接続を介してデータを送受信する重要なプログラム(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()
4

0 に答える 0