私の質問は、Arduino Uno がソケットを介して別のクライアント アプリにデータを通信することに関連しています。[Jeopardy! 風のゲーム フロントエンドと通信するブザー システム] 目標は、「ロックアウト」イベントを発生させることです。
現在、Arduino は独自のスレッドで実行されており、Flask-SocketIO サーバーがメイン プロセスとして実行されています。「Emitting Socket」という print ステートメントを含むすべてのコードは機能しますが、ソケット データを後で放出する行は除きます。
これは単なるマルチスレッドの問題だと思いますが、マルチスレッドに関する私の経験は最小限です。
提案?
# https://pymotw.com/2/threading/
# https://flask-socketio.readthedocs.org/en/latest/
import serial, time, threading
from flask import Flask, render_template
from flask_socketio import SocketIO
ser = serial.Serial('/dev/tty.usbmodem3d11', 9600, dsrdtr=1)
PORT = 3000
# Needed b/c Macs & DTR
time.sleep(5)
def getSerialData():
while True:
stuff = str(ser.readline().decode("utf-8"))
doEmit(1)
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
def doEmit(pNo):
print("Emitting Socket")
socketio.emit('lockout', {'playerNo': 1})
serialThread = threading.Thread(name='serialThread', target=getSerialData)
serialThread.start()
@socketio.on("questionRead")
def on_questionRead(data):
print("-------Start-------")
ser.write(b'y\r')
@socketio.on("resetLockout")
def on_resetLockout(data):
resetLockout()
def resetLockout():
print("--------Reset--------")
ser.write(b'n\r')
if __name__ == '__main__':
socketio.run(app, '127.0.0.1', PORT)