Serial Read thread not running while flask thread is running python

huangapple go评论120阅读模式
英文:

Serial Read thread not running while flask thread is running python

问题

以下是您要翻译的内容:

"I am trying to read serial data on a raspberry pi and display it on a webpage within a Flask server

The issue that I am having is that when I run the code with both threads started, the thread that is listening for serial input is not running and only the flask server thread is running.

When running just the serial read thread, I can read what is being sent.

How can I allow both of these threads to run parallel, to allow the message to be displayed on the webpage?

Thanks"

  1. from flask import Flask, render_template, request, url_for, flash, redirect, Response
  2. from flask_socketio import SocketIO, emit
  3. from threading import Thread
  4. import time
  5. import serial
  6. global serialMessage
  7. serialMessage = ""
  8. class SerialReadProgram:
  9. def __init__(self):
  10. self._running = True
  11. def terminate(self):
  12. self._running = False
  13. def run(self):
  14. global serialMessage
  15. ser = serial.Serial("/dev/ttyS0", 9600)
  16. print("Serial Start")
  17. while self._running:
  18. serialMessage = ser.read() #read serial port
  19. time.sleep(0.03)
  20. data_left = ser.inWaiting() #check for remaining byte
  21. serialMessage += ser.read(data_left)
  22. print (serialMessage)
  23. class FlaskServer:
  24. app = Flask(__name__)
  25. socketio = SocketIO(app=app, cors_allowed_origins='*')
  26. def __init__(self):
  27. self._running = True
  28. def terminate(self):
  29. self._running = False
  30. @app.route('/', methods=('GET', 'POST'))
  31. def home():
  32. if request.method == 'POST':
  33. message = request.form['message']
  34. print(message)
  35. return render_template('index.html')
  36. # Handler for a message received over 'connect' channel
  37. @socketio.on('connect')
  38. def test_connect():
  39. emit('after connect', {'data':'Connected'})
  40. @socketio.on('Fetch For Data')
  41. def value_changed():
  42. global cycle
  43. emit('Updated Message', {'data': serialMessage}, broadcast=True)
  44. socketio.run(app, host='0.0.0.0', allow_unsafe_werkzeug=True)
  45. # 创建类
  46. SerialRead = SerialReadProgram()
  47. # 创建线程
  48. SerialReadThread = Thread(target=SerialRead.run)
  49. # 启动线程
  50. SerialReadThread.start()
  51. # 创建类
  52. Flask = FlaskServer()
  53. # 创建线程
  54. FlaskThread = Thread(target=Flask)
  55. # 启动线程
  56. FlaskThread.start()
英文:

I am trying to read serial data on a raspberry pi and display it on a webpage within a Flask server

The issue that I am having is that when I run the code with both threads started, the thread that is listening for serial input is not running and only the flask server thread is running.

When running just the serial read thread, I can read what is being sent.

How can I allow both of these threads to run parallel, to allow the message to be displayed on the webpage?

Thanks

  1. from flask import Flask, render_template, request, url_for, flash, redirect, Response
  2. from flask_socketio import SocketIO, emit
  3. from threading import Thread
  4. import time
  5. import serial
  6. global serialMessage
  7. serialMessage = ""
  8. class SerialReadProgram:
  9. def __init__(self):
  10. self._running = True
  11. def terminate(self):
  12. self._running = False
  13. def run(self):
  14. global serialMessage
  15. ser = serial.Serial ("/dev/ttyS0", 9600)
  16. print("Serial Start")
  17. while self._running:
  18. serialMessage = ser.read() #read serial port
  19. time.sleep(0.03)
  20. data_left = ser.inWaiting() #check for remaining byte
  21. serialMessage += ser.read(data_left)
  22. print (serialMessage)
  23. class FlaskServer:
  24. app = Flask(__name__)
  25. socketio = SocketIO(app=app, cors_allowed_origins='*')
  26. def __init__(self):
  27. self._running = True
  28. def terminate(self):
  29. self._running = False
  30. @app.route('/', methods=('GET', 'POST'))
  31. def home():
  32. if request.method == 'POST':
  33. message = request.form['message']
  34. print(message)
  35. return render_template('index.html')
  36. # Handler for a message recieved over 'connect' channel
  37. @socketio.on('connect')
  38. def test_connect():
  39. emit('after connect', {'data':'Connnected'})
  40. @socketio.on('Fetch For Data')
  41. def value_changed():
  42. global cycle
  43. emit('Updated Message', {'data': serialMessage}, broadcast=True)
  44. socketio.run(app, host='0.0.0.0', allow_unsafe_werkzeug=True)
  45. #Create Class
  46. SerialRead = SerialReadProgram()
  47. #Create Thread
  48. SerialReadThread = Thread(target=SerialRead.run)
  49. #Start Thread
  50. SerialReadThread.start()
  51. #Create Class
  52. Flask = FlaskServer()
  53. #Create Thread
  54. FlaskThread = Thread(target=Flask)
  55. #Start Thread
  56. FlaskThread.start()

答案1

得分: 1

将我的评论转换为答案

socketio.run创建了自己的线程,所以不需要在线程中运行它,只需正常运行socketio服务器和serial在不同的线程中。

所以你的代码将会是这样的

  1. from flask import Flask, render_template, request
  2. from flask_socketio import SocketIO, emit
  3. from threading import Thread
  4. import time
  5. import serial
  6. app = Flask(__name__)
  7. socketio = SocketIO(app=app, cors_allowed_origins='*')
  8. serial_message = ""
  9. class SerialReadProgram:
  10. def __init__(self):
  11. self._running = True
  12. def terminate(self):
  13. self._running = False
  14. def run(self):
  15. global serial_message
  16. ser = serial.Serial("/dev/ttyS0", 9600)
  17. print("Serial Start")
  18. while self._running:
  19. serial_message = ser.readline().decode().strip() # 读取串口
  20. print(serial_message)
  21. time.sleep(0.03)
  22. @app.route('/', methods=['GET', 'POST'])
  23. def home():
  24. if request.method == 'POST':
  25. message = request.form['message']
  26. print(message)
  27. return render_template('index.html')
  28. @socketio.on('connect')
  29. def test_connect():
  30. emit('after connect', {'data': 'Connected'})
  31. @socketio.on('Fetch For Data')
  32. def value_changed():
  33. global serial_message
  34. emit('Updated Message', {'data': serial_message}, broadcast=True)
  35. if __name__ == '__main__':
  36. serial_read = SerialReadProgram()
  37. serial_read_thread = Thread(target=serial_read.run)
  38. serial_read_thread.start()
  39. socketio.run(app, host='0.0.0.0', debug=True)
英文:

Converting my comment as an answer

socketio.run creates it's own thread so don't need to run it in thread just run normal socketio server and serial in diffrent thread.

So your code will look like this

  1. from flask import Flask, render_template, request
  2. from flask_socketio import SocketIO, emit
  3. from threading import Thread
  4. import time
  5. import serial
  6. app = Flask(__name__)
  7. socketio = SocketIO(app=app, cors_allowed_origins='*')
  8. serial_message = ""
  9. class SerialReadProgram:
  10. def __init__(self):
  11. self._running = True
  12. def terminate(self):
  13. self._running = False
  14. def run(self):
  15. global serial_message
  16. ser = serial.Serial("/dev/ttyS0", 9600)
  17. print("Serial Start")
  18. while self._running:
  19. serial_message = ser.readline().decode().strip() # read serial port
  20. print(serial_message)
  21. time.sleep(0.03)
  22. @app.route('/', methods=['GET', 'POST'])
  23. def home():
  24. if request.method == 'POST':
  25. message = request.form['message']
  26. print(message)
  27. return render_template('index.html')
  28. @socketio.on('connect')
  29. def test_connect():
  30. emit('after connect', {'data': 'Connected'})
  31. @socketio.on('Fetch For Data')
  32. def value_changed():
  33. global serial_message
  34. emit('Updated Message', {'data': serial_message}, broadcast=True)
  35. if __name__ == '__main__':
  36. serial_read = SerialReadProgram()
  37. serial_read_thread = Thread(target=serial_read.run)
  38. serial_read_thread.start()
  39. socketio.run(app, host='0.0.0.0', debug=True)

huangapple
  • 本文由 发表于 2023年5月21日 12:03:04
  • 转载请务必保留本文链接:https://go.coder-hub.com/76298253.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定