使用Arduino的Python脚本不会读取正确的数据
我的Python脚本有问题。它正在工作,但有些错误。我是Python新手,所以我找不到任何解决方案:(使用Arduino的Python脚本不会读取正确的数据
我的脚本通过pySerial连接到Arduino板,并读取温度数据。它连接正常,但数据显示在终端或保存在TXT文件中克龙)是错误的:
2013-03-16 13:40:01 166.8
2013-03-16 13:41:02 1617.
它应该是:
2013-03-16 13:40:01 16.68
2013-03-16 13:41:02 16.17
我的Python脚本:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# pytemp.py
import serial
import time
ser = serial.Serial('/dev/ttyACM0',9600, timeout=10)
read = ser.read(5)
comp = read.split()
ser.close();
print time.strftime("%Y-%m-%d %H:%M:%S"), comp[0]
我使用Python3.3和pySerial 2.6。在oryginal版本有:
read = ser.readline(eol=/r)
但据我所知在2.5+ EOL命令不工作了。我不知道如何编辑脚本来随时打印数据。
根据documentation,当使用更高版本的Python 2.6版本时,eol参数确实不再受支持。
请忽略我以前的建议,使用FileLike
。这不是在Python 2.6+中使用!
如何处理数据取决于数据的外观如何。既然你没有给我们一个原始数据的例子,我将以this page的格式为例。
在上述例子中的数据的格式是:
t: 2012.11.18 19:39:03 50A93957 +024.50 0189
t: 2012.11.18 19:39:13 50A93961 +024.50 0189
t: 2012.11.18 19:39:23 50A9396B +024.50 0188
的每一行都具有下列:
- 日期和时间
- 生日期和时间以十六进制
- 以摄氏度为单位的温度值
- 以十六进制表示的原始温度值
您会注意到每个测量都以't:'开头,并且有六个项目以空格分隔。因此,在这种情况下,我将运行一个循环,是这样的:
import serial
import time
buffer = bytes()
ser = serial.Serial('/dev/ttyACM0',9600, timeout=10)
while buffer.count('t:') < 2:
buffer += ser.read(30)
ser.close();
# Now we have at least one complete datum. Isolate it.
start = buffer.index('t:')
end = buffer.index('t:', start+1)
items = buffer[start:end].strip().split()
print items[1], items[2], items[4]
一个例子。意识到你可能会开始阅读一行数据。你不能假设你从一开始就开始阅读。
In [23]: buffer = '39:03 50A9\r\nt: 2012.11.18 19:39:13 50A93961 +024.50 0189\r\nt: 2012.11.18 19:39:23 50A9396B +024.50 0188'
让我们来检查我们可以找到多少't:'。 (你也可以搜索“\ r \ n”来代替。这要紧的是,你有什么要定界符线含)
In [24]: buffer.count('t:')
Out[24]: 2
因为我们有两个分隔符,我们至少有一个数据点。让我们隔离完整的数据点。
In [25]: buffer.index('t:')
Out[25]: 12
In [26]: buffer.index('t:', 12+1)
Out[26]: 58
这就是我们想看到的。完整的数据点:
In [27]: buffer[12:58+1].strip().split()
Out[27]: ['t:', '2012.11.18', '19:39:13', '50A93961', '+024.50', '0189', 't']
In [28]: items = buffer[12:59].strip().split()
In [29]: print items[1], items[2], items[4]
2012.11.18 19:39:13 +024.50
有什么不对。我的新代码是:ser = serial.Filelike('/ dev/ttyACM0',9600,timeout = 10),并且出现错误:AttributeError:'module'object has no attribute'Filelike' – 2013-03-17 12:59:26
您应该使用大写L在FileLike中。 – 2013-03-17 14:41:20
你可以从'/ dev/ttyACM0' _without_ Python读取Arduino数据吗? [这里](http://stackoverflow.com/questions/15450419/java-rxtx-code-to-connect-to-rfcomm0-is-not-working)在Java中是一个类似的问题。 – angelatlarge 2013-03-17 08:11:29
你可以给我们看看'read'的内容(分割之前)吗? – 2013-03-17 10:24:58
是的,我可以用屏幕/ dev/ttyACM0读取Arduino数据。并且它显示正常,正确的nubers,例如21.89。所以只有我的python脚本有问题。 – 2013-03-17 12:47:15