树莓派上的 flask 框架实时读取串口信息? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
kisscucci
V2EX    Python

树莓派上的 flask 框架实时读取串口信息?

  •  
  •   kisscucci 2017-08-22 12:50:02 +08:00 via iPhone 5724 次点击
    这是一个创建于 3022 天前的主题,其中的信息可能已经有所发展或是发生改变。
    硬件用的是树莓派+二维码扫描器,程序上用的是 python、flask、pyserial,这套方案现在遇到的问题就是,二维码数据有更新的时候,怎样去实时将数据显示在 html 页面中?
    各位高手帮忙提点意见,最好有现成案例
    17 条回复    2017-08-24 01:22:36 +08:00
    leavic
        1
    leavic  
       2017-08-22 12:56:01 +08:00
    实时更新这一般是前段通过 js 的 ajax 动态更新的,和 flask 关系不大吧。
    cassia
        2
    cassia  
       2017-08-22 13:09:06 +08:00
    长连接 websocket
    NoAnyLove
        3
    NoAnyLove  
       2017-08-22 13:15:07 +08:00
    websocket 正解
    but0n
        4
    but0n  
       2017-08-22 13:59:28 +08:00 via iPhone   span class="small fade"> 1
    做过类似的
    https://github.com/but0n/Avem_HUD

    用 pyserial 读取数据
    flask 返回 json
    js ajax 获取数据
    canvas 渲染数据
    kisscucci
        5
    kisscucci  
    OP
       2017-08-22 17:14:16 +08:00 via iPhone
    @NoAnyLove 有案例代码可以参考吗?
    kisscucci
        6
    kisscucci  
    OP
       2017-08-22 17:14:45 +08:00 via iPhone
    @cassia 请问有类似的代码可以参考吗?
    kisscucci
        7
    kisscucci  
    OP
       2017-08-22 17:16:34 +08:00 via iPhone
    我网上找不到 flask+pyserial 的案例,哪位大神提供一下给我吧
    phy25
        8
    phy25  
       2017-08-22 20:13:18 +08:00 via Android
    轮询的话直接在 Flask 的请求里面调 pyserial 就能做,不需要案例,用 WebSocket 的话可能麻烦点。
    ila
        9
    ila  
       2017-08-22 20:19:55 +08:00 via Android
    @kisscucci 4 楼啊
    HoHoibin
        10
    HoHoibin  
       2017-08-22 21:05:59 +08:00
    二维码扫描器淘宝买的么
    kisscucci
        11
    kisscucci  
    OP
       2017-08-22 21:14:44 +08:00 via iPhone
    @HoHoibin 买了
    HoHoibin
        12
    HoHoibin  
       2017-08-22 21:32:55 +08:00
    @kisscucci 好像很贵 = =
    kisscucci
        13
    kisscucci  
    OP
       2017-08-22 22:00:07 +08:00 via iPhone
    @HoHoibin 400 元左右
    kisscucci
        14
    kisscucci  
    OP
       2017-08-23 11:43:35 +08:00 via iPhone
    @but0n 请问 @app.route('/api/status') def api():…后为什么不用 render_template('xxx.html'),我看 flask 的教程上是每个 app.route 都要引入 html 模板啊,难道可以和 def index():共同 index.html 模版?
    kisscucci
        15
    kisscucci  
    OP
       2017-08-23 11:45:21 +08:00 via iPhone
    @but0n 还有想问你不用 websocket 为什么可以保持数据实时更新?
    but0n
        16
    but0n  
       2017-08-23 19:57:00 +08:00   1
    这里 Flask 有两个 route:
    - '/' : 返回页面 index.html
    - '/api/status': 通过串口通信获取数据并返回 json 数据

    https://github.com/but0n/Avem_HUD/blob/master/static/scripts/canvas.js#L43#L51
    通过 $.getJSON('api/status', (json) 获取数据。

    至于数据实时更新, 这里通过单片机的串口中断实现的, 这个就属于我的另一个开源飞控项目: https://github.com/but0n/Avem

    其中单片机串口中断处理函数:
    https://github.com/t01y/H0p3/blob/master/Software/libs/source/uart.c#L45#L62
    这里定义了当单片机通过串口接收到 '$' 字符就会将最新的数据通过串口发送出去
    在 flask 中
    ser.write('$')
    st = ser.readline().replace('\00','').replace('\n','').replace('\r','').split('@')
    解析数据
    kisscucci
        17
    kisscucci  
    OP
       2017-08-24 01:22:36 +08:00
    @but0n 你好,参照你的项目给了我很大的帮助;最近在做一个扫描器的项目,遇到了一个问题就是 python 和 html 之间的通信建立不起来,代码如下:

    #红外传感器
    import RPi.GPIO as GPIO
    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)
    GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    #16 进制库
    import binascii

    #FLASK 框架
    from flask import Flask, url_for, render_template, jsonify

    #实例化串口
    import serial
    import time
    ser = serial.Serial('/dev/ttyUSB0', 9600, timeout = None) #一直等待

    app = Flask(__name__)

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

    @app.route("/json/")
    def scan(channel):
    def order_list():
    a = '7e 00 08 01 00 02 01 ab cd' #触发扫描器的指令
    a_list = []
    for i in a.split():
    a_list.append(binascii.a2b_hex(i)) #转为 16 进制
    return a_list
    ser.write(order_list()) #触发扫描
    scandata = ser.readline() #读取数据
    data = {"zhipinming": "brian","age": scandata,"has_car": False}
    return jsonify(data=data)

    #18 引脚的中断和边缘检测,发生改变时调用 scan 函数
    #红外感应一次,扫描器工作一次
    GPIO.add_event_detect(18, GPIO.FALLING, callback=scan)
    if __name__ == '__main__':
    app.run()


    运行后提示错误:
    Traceback (most recent call last):
    File "/home/pi/Desktop/tgpscan/scan.py", line 35, in scan
    return jsonify(data=data)
    File "/usr/lib/python2.7/dist-packages/flask/json.py", line 234, in jsonify
    if current_app.config['JSONIFY_PRETTYPRINT_REGULAR'] \
    File "/usr/lib/python2.7/dist-packages/werkzeug/local.py", line 338, in __getattr__
    return getattr(self._get_current_object(), name)
    File "/usr/lib/python2.7/dist-packages/werkzeug/local.py", line 297, in _get_current_object
    return self.__local()
    File "/usr/lib/python2.7/dist-packages/flask/globals.py", line 34, in _find_app
    raise RuntimeError('working outside of application context')
    RuntimeError: working outside of application context
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2433 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 05:55 PVG 13:55 LAX 21:55 JFK 00:55
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86