python3 flask pyserial脚本只能工作一次

时间:2017-10-11 17:30:25

标签: python ajax flask pyserial

我想编写一个脚本来打开现金抽屉,使用串行设备(带USB),而不是每次打印机打印时打开它(例如,在信用卡付款时,不需要打开现金抽屉)。

它应该通过Ajax调用基于Flask的网站(整个网站将充当ajax接收器来执行python脚本)。

Flask网站正在运行,其他脚本运行没有问题,这就是为什么我在这里只显示主脚本的有趣部分:

...
@app.route("/cashdrawer")
def cashdrawer():
        import cash_drawer_open
        return "open ?"   # website output
...

现金抽屉开启者cash_drawer_open.py看起来像那样

#!/usr/bin/python3
import serial

ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate=300,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    xonxoff=serial.XOFF,
    rtscts=False,
    dsrdtr=False
)

ser.write(bytes([0, 4]))

ser.flush()        # something
ser.flushInput()   # I played
ser.flushOutput()  # around
ser.close()        # with
# exit()           # etc.
# quit()           # etc.

print ("open ?")   # terminal output

问题是,在Flask服务器启动并且第一次调用脚本后,抽屉只打开一次。同一网站的每次进一步调用都不会在终端返回open ?,抽屉保持冷静。唯一的问题是终端响应

192.168.178.29 - - [11/Oct/2017 18:31:56] "GET /cashdrawer HTTP/1.1" 200 -
192.168.178.29 - - [11/Oct/2017 18:31:58] "GET /cashdrawer HTTP/1.1" 200 -
192.168.178.29 - - [11/Oct/2017 18:32:03] "GET /cashdrawer HTTP/1.1" 200 -

一次又一次。

我还尝试过使用诸如更改时间戳

之类的参数来调用它
http://myserver/cashdrawer?t=12765435664543

但没有成功。

我每次拨打地址时如何与USB设备通话?感谢

1 个答案:

答案 0 :(得分:1)

你的错误是假设导入正在执行代码。它只是第一次,之后一个import语句只给你一个缓存的模块实例。

通过三个简单的步骤重构您的代码:

  1. 将实际逻辑(除了导入之外的任何内容)放在cash_drawer_open中 进入功能
  2. 将您的网络应用中的cash_drawer_open导入到其所属模块的顶部
  3. 在当前导入的位置,而不是调用步骤1中定义的函数