2017-10-11 67 views
0

我想编写一个脚本来打开一个钱箱,使用串行设备(使用USB),而不是每次打印机打印时打开它(例如在信用卡付款上不需要钱箱)开放)。python3烧瓶pyserial脚本只能工作一次

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

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

... 
@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

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

所以用三个简单的步骤重构代码:

  1. 把实际的逻辑(除了进口)在cash_drawer_open功能
  2. 地方cash_drawer_open在您的web应用程序导入到它所属模块的顶部
  3. 在您当前导入的位置,改为调用第1步中定义的功能
+0

好了,现在我有'高清import_cashdrawer():主脚本的顶部和'@ app.route( “/ cashdrawer”) 高清cashdrawer() 进口cash_drawer_open': import_cashdrawer() 回报“现在打开?“'在路由功能中,但结果相同,它只能工作一次。我不在这里? – ddlab

+0

啊......我明白了......那一刻。 – ddlab

+0

是是的。你是对的,它的工作,谢谢。 1+ – ddlab