微控制器输出到python cgi脚本

微控制器输出到python cgi脚本,python,serial-port,cgi,Python,Serial Port,Cgi,我买了这个温度传感器记录器套件:。它与提供的C代码配合使用非常好,我喜欢使用python,因为它简单,所以我用python编写了一个脚本,显示微控制器的输出。我只有一个温度传感器连接到套件上。我希望在网页上显示温度,但似乎无法理解,我很确定这与micro的输出有一定关系,该输出具有DOS EOL字符,\r\n并且linux web服务器无法正确解释它。我的书中说“根据您使用的web服务器,您可能需要进行配置更改,以了解如何为CGI文件提供服务。”我使用的是debian和apache2,基本CGI

我买了这个温度传感器记录器套件:。它与提供的C代码配合使用非常好,我喜欢使用python,因为它简单,所以我用python编写了一个脚本,显示微控制器的输出。我只有一个温度传感器连接到套件上。我希望在网页上显示温度,但似乎无法理解,我很确定这与micro的输出有一定关系,该输出具有DOS EOL字符,\r\n并且linux web服务器无法正确解释它。我的书中说“根据您使用的web服务器,您可能需要进行配置更改,以了解如何为CGI文件提供服务。”我使用的是debian和apache2,基本CGI脚本工作正常

以下是我的代码,用于将传感器显示到控制台(这很好):

下面是我的test.cgi脚本:

#!/usr/bin/python
print "Content-type: text/html\n"
print "<title>CGI Text</title>\n"
print "<h1>cgi works!</h1>"
#/usr/bin/python
打印“内容类型:文本/html\n”
打印“CGI文本\n”
打印“cgi工作!”
以下是我开始显示temp的cgi脚本(不工作-500内部服务器错误):

#/usr/bin/python
导入系统,串行
sys.stderr=sys.stdout
ser=serial.serial('/dev/ttyS0',2400)
打印“内容类型:文本/html\n”
打印“”
实时温度
实时温度:
"""
#结果=ser.readline()
#如果结果为:
打印序列号readline()
如果我在控制台中运行python rtt.cgi,它会输出正确的html和温度,我知道这不会是实时的,每次用户想要看到温度时,页面都必须重新加载,但这些东西将来会出现。。从我的apache2错误日志中可以看出:
脚本中的标题格式不正确。错误的header=File“/usr/lib/cgi-bin/rtt.c:rtt.cgi

我猜运行cgi的执行上下文无法从串行端口完成
读取()

顺便说一句,Python标准库编写CGI脚本的方法比您在这里所做的要好得多;即使是基本的字符串处理也提供了将结果插入HTML的更好方法(假设您的代码具有读取()的必要权限)

至少我会推荐这样的东西:

#!/usr/bin/python
import sys, serial

sys.stderr = sys.stdout
ser = serial.Serial('/dev/ttyS0', 2400)

html = """Content-type: text/html

<html><head><title>Real Time Temperature</title></head><body>
<h1>Real Time Temperature:</h1>
<p>%s</p>
</body></html>
"""  % ser.readline()   # should be cgi.escape(ser.readline())!
ser.close()
sys.exit(0)
!/usr/bin/python
导入系统,串行
sys.stderr=sys.stdout
ser=serial.serial('/dev/ttyS0',2400)
html=“”内容类型:文本/html
实时温度
实时温度:
%

“%ser.readline()#应该是cgi.escape(ser.readline())! 塞尔克洛斯() 系统出口(0)
注意,我们只是使用 %字符串运算符。(顺便说一下,您的HTML缺少
(段落)标记)

这方面仍然存在问题。例如,我们确实应该至少导入
cgi
将外来数据包装在其中,以确保HTML实体正确替换任何保留字符,等等)

我建议进一步阅读:[Python文档]:

再来一次:

# Added to allow cgi-bin to execute cgi, python and perl scripts
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
AddHandler cgi-script .cgi .py .pl
<Directory /var/www>
Options +Execcgi
AddHandler cgi-script .cgi .py .pl
</Directory>
添加了
#以允许cgi-bin执行cgi、python和perl脚本
ScriptAlias/cgi-bin//var/www/cgi-bin/
AddHandler cgi script.cgi.py.pl
选项+执行CGI
AddHandler cgi script.cgi.py.pl
迈克尔

看起来问题显然是权限问题,但是,您不应该尝试使您的脚本具有/dev/ttyS0的权限。您可能需要做的是生成另一个进程,其中您要做的第一件事是将您的组更改为/dev/ttyS0设备的组。在我的“拨号”框中,您可能有所不同

您需要导入操作系统软件包,在文档中查找流程参数,在该页面上,您将找到一些允许您更改所有权的函数。您还需要使用流程管理中的一个函数,这些函数也在操作系统软件包中,这些函数生成流程,但您需要选择一个将返回d派生进程的ata。子进程包可能更适合于此

需要生成另一个进程的原因是CGI脚本需要在Apache进程下运行,并且生成进程需要访问串行端口

如果我在接下来的几天里有机会,我会试着为你做点什么,但是试一下,不要等我

还有一件事,所有HTTP头都需要以两个CRLF序列结尾。因此,您的头需要是:

打印“内容类型:text/html\r\n\r\n”

如果不这样做,浏览器可能不知道标题何时结束,实体数据何时开始。请阅读RFC-2616


~Carl

是“#”/usr/bin/pythonimport sys,serial“复制到SO的输入错误,或者这在您的文件中?当您在命令行运行rtt.cgi时,'print ser.readline()的输出是什么?”Neil:这是一个输入错误ryan_s:当我从命令行运行rtt.cgi时,它会输出html,温度与我希望它显示在网页上的温度相同。它实际上读取串行端口,获取数据,并将其打印到html中应该显示的位置。上面的代码仍然会导致500个内部服务器错误。我还导入了是否应将cgi.escape添加到ser.close()中?是否验证ser.readline()是否正确当您的web服务器执行CGI脚本时,您是否有足够的权限进行操作?这是我建议的第一部分,也是唯一与您的500错误真正相关的部分。其余部分只是关于一般更好的CGI脚本的建议。请记住,您的web服务器可能以某种“无人”的身份运行CGI脚本(除非你正在使用某种类型的suExec功能)并且它可能正在使用
chroot
系统调用…这将阻止对/dev/ttyS*等的访问)。我认为这些是你问题的根源。我正在使用debian安装,并使用apt安装apache2。我不使用我知道的mod suExec,但mod中有一个suExec.load
#!/usr/bin/python
import sys, serial

sys.stderr = sys.stdout
ser = serial.Serial('/dev/ttyS0', 2400)

html = """Content-type: text/html

<html><head><title>Real Time Temperature</title></head><body>
<h1>Real Time Temperature:</h1>
<p>%s</p>
</body></html>
"""  % ser.readline()   # should be cgi.escape(ser.readline())!
ser.close()
sys.exit(0)
# Added to allow cgi-bin to execute cgi, python and perl scripts
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
AddHandler cgi-script .cgi .py .pl
<Directory /var/www>
Options +Execcgi
AddHandler cgi-script .cgi .py .pl
</Directory>