Python web应用 - 同步串口访问

3 投票
1 回答
1003 浏览
提问于 2025-04-16 23:07

我是一名中级Java开发者,刚开始学习Python,对网络服务也很陌生。为了学习,我正在尝试用Python实现一个RESTful网络服务,通过一个RS232转USB的继电器板远程控制一个简单的开关灯。我已经掌握了web.py和pyserial库的一些基础知识。

我使用的这个继电器板需要一个ASCII字节作为输入来控制继电器的开关,并且每次发送输入时都会返回一个ASCII字节作为反馈。单个请求的响应是正确的,但当web.py的代理类发出多个请求时,反馈有时会混淆。我猜这可能是线程同步的问题。

那么,如何才能正确地同步对串口的读写访问,以便将反馈准确地发送给相应的web.py线程呢?像下面这样的解决方案是否可以被认为是正确的?

from threading import RLock
import serial   # pyserial library

lock = RLock()
ser = serial.Serial("/dev/ttyACM0", 9600, 1)

def serialOut(self, string):
    lock.acquire()
    data = ''
    try:
        ser.open()
        ser.write(string)
        data = ser.readall()
        ser.flushOutput()
    finally:
        lock.release()
        return data

1 个回答

1

如果你的网页应用是在同一个Python实例下运行的(也就是在web.py的开发服务器里运行),那么你的解决方案看起来没问题。

但是,如果你想在多个Python进程下运行它,就需要使用fcntl模块来对文件本身加锁。

撰写回答