2016-11-22 58 views
0

目前我有一个Arduino连接到Raspberry Pi。 Arduino控制一个水位检测电路,用于自动宠物水碗。 Arduino上的程序有几个“serial.println()”语句来更新用户关于水钵状态的填充或填满状态。我通过USB将Arduino连接到Raspberry Pi。从Arduino的捕获串行数据上的皮小Python程序如下:Arduino,树莓派和HTML页面

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)的服务,更具体地说是他们的“虫洞”工具(https://docs.dataplicity.com/docs/host-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文件?

回答

1

在while循环的第一次迭代之后,关闭文件并且再也不打开它进行编辑。当您尝试附加到已关闭的文件时,会出现错误。您可以改为在您的循环中打开语句,如下所示:

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

解决了这个问题。感谢您的帮助。 – OakRidgejet

1

如果要持续更新网页,您有几个选项。我不知道你如何提供你的页面,但你可能想看看使用Flask的web框架python,并考虑使用模板语言,如jinja2。模板语言可以让你在你的html文件中创建可以直接从python脚本更新的变量。如果您希望用户每次刷新页面或在页面上执行某些操作后都能在页面上看到新数据,这非常有用。

另外,你可能想要考虑使用websockets,就像我在here的例子中一样。如果您希望用户实时在您的网页上看到新的更新,Websockets非常有用。

我很欣赏上述答案并不能直接回答你的问题,但是我在这里提供的是一个干净而容易维护的解决方案,一旦你设置好了。