2017-10-11 69 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