我正在使用MaxSonar EZ1 超声波测距传感器和 Arduino Diecimila 开展一个小项目。
使用MaxSonar 操场代码,我让 Arduino 每 0.5 秒将英寸数写入串行,并带有一个分隔符。监控串行数据时,输出类似于:
5.13.15.12.123.39.345...
在 Python 方面,我有一个带有 /distance 路由的基本 Flask 应用程序,它返回一个带有序列值的 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 的基本站点,它每半秒轮询一次 /distance 以获取新读数。有了这个值,我应该能够构建一个有趣的 UI,它会根据我与声纳的距离/远近而变化。
$(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();
});
问题
我遇到的问题是,不能保证当 python 从串行读取时,会有一个值。很多时候,当它轮询时,我得到一个空值或部分值,而其他时候它是正确的。
我怎样才能改变我的技术,以便我能够始终如一地轮询串行数据并从 Arduino 串行输出接收最后的良好读数?