2016-05-07 17 views
0

Pyserialを使用してArduinoからのシリアル出力を表示するWebインターフェイスを作成しようとしています。私はHTML文字列を更新するためにAjax($ .getJSON)を使用しています。Flaskの.getJSONでリクエストしたときに一度だけコマンドを実行する

私の今の問題は、JSONデータをリクエストするたびに、ser = serial.Serial('/dev/cu.wchusbserialfa140',9600)が初期化されるため、クエリが遅くなり、シリアル出力のリアルタイム更新が禁止されます。

私のコードは次のとおりです。私は一度だけserial.Serial()を実行するために全力をしようとしています

@app.before_request 
def before_request(): 
    g.status = False 


@app.route('/') 
def template(): 
    return render_template('index.html') 


@app.route('/result') 
def serial_monitor(): 
    #connect to serial port for once 
    if g.status == False: 
     ser = serial.Serial('/dev/cu.wchusbserialfa140',9600) 
     g.status = True 
     result = str(ser.readline()) 
     voltage = {'value':result} 
    else: 
     result = str(ser.readline()) 
     voltage = {'value':result} 
    return jsonify(voltage) 

私のjavascript: 私はそれを自動的に繰り返すようにsetIntervalを使用しています。

$.getJSON($SCRIPT_ROOT + '/result', function(data) 
    {$('#voltage').text(data.value);}); 

は、私は私の小さなWebインターフェイスを作ることを学ぶしようとしているとStackOverflowのは、私には大きな助けとなっています。私はこの問題を捜索して解決しようと努力しましたが、今はそれを手に入れる価値があると思います。 ありがとうございました!


編集:私はそれは私が今のやりたい作ってそれを少しハッキングしている

。 しかし、serial.Serial行を実行する前に、ユーザーからポート値を取得するためにフォームを使用する予定です。私はまだsession/global variableを見ています。たぶん、あなたはそれを毎回開く必要はありません(あなたが複数のプロセスベースの労働者を使用する場合、これは問題になる可能性がありますが)グローバル変数としてserを保つだけseekまたは何が入るために必要とされる

global ser 
ser = serial.Serial('port',9600)  


@app.route('/') 
def template(): 
    return render_template('index.html') 


@app.route('/result') 
def serial_monitor(): 
    result = str(ser.readline()) 
    voltage = {'value':result} 
    return jsonify(voltage) 
+1

OK!問題ない。申し訳ありませんが、まだコミュニティにはかなり新しいです。 –

+0

素晴らしい!ありがとう。 – halfer

答えて

1

次の解決策が見つかりました。

(関数内で)グローバル変数ステータスを正しく設定することで、コードを一度だけ実行できるようになりました。

@app.route('/') 
def template(): 
    return render_template('index.html') 

status = False 
@app.route('/result') 
def serial_monitor(): 
    global status 
    #connect to serial port for once 
    if status== False: 
     ser = serial.Serial('/dev/cu.wchusbserialfa140',9600) 
     status = True 

    result = str(ser.readline()) 
    voltage = {'value':result} 
    return jsonify(voltage) 
0

正しい状態(私はserialについては何も知らないので意味がないかもしれません)。あるいは、voltageはグローバルになり、バックグラウンドスレッドで常に更新され、serial_monitor関数は変数の最新の値を読み取るだけです。

関連する問題