Arduino, Raspberry Pi, and HTML page



目前,我有一个arduino挂在覆盆子pi上。Arduino控制着一个自动宠物水碗的水位检测电路。Arduino上的程序具有几个" serial.println()"语句,以更新用户水碗状态,填充或完整。我通过USB将Arduino连接到Raspberry Pi。PI上捕获Arduino串行数据的小型Python程序如下:

import serial
ser = serial.Serial('/dev/ttyUSB0',9600)
file = open('index.html', 'a+')
message1 = """<html>
<head><meta http-equiv="refresh" content="1"/></head>
<body><p>"""
message2 = """</p></body>
</html>"""
while 1:
        line=ser.readline()
        messagefinal1 = message1 + line + message2
        print(line)
        file.write(messagefinal1)
        file.close()

您可以看到,它捕获了USB,创建和HTML页面上的串行数据,并将数据插入页面。我正在使用一个名为" dataplicity"(https://www.dataplicity.com)的服务,更具体地说是他们的" wormhole"工具(https://docs.dataplicity.com/docs/docs/docs/host-a-a-a-website-from-your-pi),要在虫洞工具生成的链接上查看网络上的HTML文件。我遇到的问题是:

Traceback (most recent call last):
  File "commprog.py", line 15, in <module>
    file.write(messagefinal1)
ValueError: I/O operation on closed file

我想通过水碗状态不断更新HTML页面(它不断打印其状态)。但是,一旦我使用" file.close()"关闭页面后,我将无法再次访问它,大概是因为虫洞服务正在访问它。如果我不包括.close(),则必须使用ctrl c手动结束该过程。有什么方法可以连续更新HTML文件?

在循环的第一次迭代之后,您关闭文件,再也不会打开它进行编辑。当您尝试将其附加到关闭的文件时,您会收到错误。您可以像这样的循环中移动开放语句:

while 1:
    line=ser.readline()
    messagefinal1 = message1 + line + message2
    print(line)
    file = open('index.html', 'a+')
    file.write(messagefinal1)
    file.close()

如果要连续更新网页,则有几个选项。我不知道您如何使用页面,但是您可能想考虑使用python的瓶网框架,并考虑使用诸如jinja2之类的模板语言。模板语言将使您在HTML文件中创建可以直接从Python脚本更新的变量。如果您希望用户每次在您的页面上查看新数据刷新之后或在页面上执行某些操作。

另外,您可能想考虑使用与我在此处进行的示例一样。WebSockets如果您希望用户实时查看页面上的新更新。

我很感谢上述答案无法直接回答您的问题,但是我在这里提供的解决方案是一种干净易于维护的解决方案。

最新更新