Чтение значений со страницы в JavaScript

Я новичок в JavaScript и HTML в целом, поэтому у меня могут быть некоторые глупые вопросы...

Я использую Flask для отображения графика с некоторыми значениями от датчика на Raspberry pi3. Датчик подключен через последовательный порт. Я хочу передать значения, которые я читаю из последовательного порта, в index.html, это шаблон, в котором у меня есть код JavaScript для графа (созданный с помощью Rgraph).

Это main.py с колбой и чтением порта.

from flask import Flask,render_template
import serial

app = Flask(__name__)
ser = serial.Serial('/dev/ttyACM0', 9600)

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

#here I read one value from the serial port
@app.route('/getdata')
def test():
    return ser.readline()

if __name__ == '__main__':
    app.run()

Шаблон index.html, который я пытаюсь использовать, находится здесь (на github). Javascript генерирует некоторое случайное число (от 66 до 72), но я хочу, чтобы он вместо этого считывал число со страницы '/getdata' и помещал его в массив данных.

Я думал об использовании методов GET-POST, но это довольно сложно. Может быть, есть более простое решение? Или, может быть (но я думаю, что это невозможно), я мог бы прочитать последовательный порт прямо из JavaScript? Или, может быть, я все делаю неправильно и мне нужно выбросить все из окна?

2 ответа

После того, как фляга представит шаблон, вы ничего не сможете сделать. На самом деле он не поддерживает push-запросы (по крайней мере, насколько я могу судить), но выполнить Ajax-запрос не сложно

ajax_params = {
        url: '/getdata',
        type: 'GET',
        cache: false,
        dataType: 'json',
        error: function(jqXHR, status, error) {
            console.log("Ajax error " + error);
            console.log("status " + status);
            console.log(jqXHR);
        },
        success: datacb
    };

function datacb (resp, status, jqXHR) {
     /* update code here */
     console.log(resp);

     /* you may want to sleep here */

     $.ajax(ajax_params);
}

$.ajax(ajax_params);

Если вы не хотите обновить данные без перезагрузки страницы index.html, вы можете попробовать что-то вроде следующего:

from flask import Flask,render_template
import serial

app = Flask(__name__)
ser = serial.Serial('/dev/ttyACM0', 9600)

@app.route('/')
def hello_world():
    servalue = test();
    return render_template("index.html", value=servalue)

#here I read one value from the serial port
@app.route('/getdata')
def test():
    return ser.readline()

if __name__ == '__main__':
    app.run()

Если вы хотите обновить данные без перезагрузки страницы индекса, вам, вероятно, придется использовать AJAX, как предложено @debhand.

Другие вопросы по тегам