我正在尝试制作一个Web界面,以使用Pyserial显示我的Arduino的串行输出。我正在使用Ajax($ .getJSON)更新我的HTML字符串。

我现在遇到的问题是,每当我请求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);});


我一直在尝试学习制作我的小网络界面,而Stackoverflow对我有很大的帮助。我已经搜索并努力解决此问题,但是我认为现在值得一试。
谢谢大家 !!



编辑:

我已经对其进行了一些修改,以使其能够立即完成我想做的事情。
但是,我计划在运行serial.Serial行之前使用一种形式从用户获取端口值。我仍在寻找session/global variable路线。

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)

最佳答案

以下是我找到的解决方案。

通过正确设置全局变量状态(在函数内部),我现在可以一次运行任何代码。

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

关于javascript - 在Flask中使用.getJSON请求时仅运行一次命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37092591/

10-12 16:48
查看更多