Я работаю над небольшим проектом, используя MaxSonar EZ1 ultrasonic range sensor и Arduino Diecimila.Чтение последовательных данных из Arduino с Python
Используя MaxSonar playground code, у меня есть Arduino, записывающий количество дюймов в серию каждые 0,5 секунды вместе с разделителем. При мониторинге последовательных данных, вывод похож на:
5.13.15.12.123.39.345...
На стороне Python, у меня есть основное приложение фляги с/расстоянием маршрута, который возвращает объект JSON с порядковым значением:
from flask import Flask
from flask import render_template
import serial
import json
import random
app = Flask(__name__,
static_folder="public",
template_folder="templates")
port = "/dev/tty.usbserial-A6004amR"
ser = serial.Serial(port,9600)
@app.route("/")
def index():
return render_template('index.html')
@app.route("/distance")
def distance():
distance = read_distance_from_serial()
return json.dumps({'distance': distance})
def read_distance_from_serial():
x = ser.read();
a = '';
while x is not '.':
a += x;
x = ser.read()
print(a)
return a
# return random.randint(1, 100)
if __name__ == "__main__":
app.debug = True
app.run()
И index.html - это базовый сайт с некоторыми JS, который опроса/расстояния каждые полсекунды для нового чтения. Со значением я должен уметь создавать интересный пользовательский интерфейс, который изменяется в зависимости от того, насколько близко/далеко от сонара.
$(document).ready(function() {
window.GO = function() {
this.frequency = 500; // .5 seconds
this.init = function() {
window.setInterval(this.update_distance, 500);
}
this.update_distance = function() {
$.get('/distance', function(response) {
var d = response.distance;
$('#container').animate({"width": d + "%"});
}, 'json')
}
}
go = new GO();
go.init();
});
Вопрос
Проблема Я бегу в том, что нет никакой гарантии, что, когда питон читает из последовательного, что будет иметь значение. Часто, когда он опроса, я получаю либо пустое значение, либо частичное значение, в то время как в других случаях это происходит.
Как я могу изменить свою технику таким образом, чтобы я мог последовательно отслеживать последовательные данные и получать последние хорошие показания с серийного выхода Arduino?
не будет фоновую нить лицо такой же, проблема потенциально не синхронизирована с тем, когда arduino пишет в серийный номер? – doremi
Фоновая нить постоянно читается из сокета, а это значит, что вы получите все, что Arduino вкладывает, а не что-либо в каком-либо буфере в момент его опроса. Вместо этого вы проверяете Очередь действительных значений. Если очередь Queue пуста, когда вы запрашиваете значение, то вы опережаете Arduino. Или вы знаете, что у него были проблемы. Вы также можете войти в серийный поток, чтобы узнать, что происходит. Независимо от того, ваш сервер будет иметь доступ к всем данным Arduino между запросами для следующего, а не произвольным портом. – wwwslinger
И если вы хотите контролировать некоторую частоту дискретизации, просто добавьте счет на основе собственной частоты дискретизации и добавьте только к dataQ каждые 1000 читает, например. Вы также можете прочитать в конец dataQ для вывода, чтобы его очистить и таким образом контролировать выборку. У вас просто гораздо больше контроля, если вы не читаете сериал по требованию. – wwwslinger