使用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命令不工作了。我不知道如何编辑脚本来随时打印数据。

+0

你可以从'/ dev/ttyACM0' _without_ Python读取Arduino数据吗? [这里](http://*.com/questions/15450419/java-rxtx-code-to-connect-to-rfcomm0-is-not-working)在Java中是一个类似的问题。 – angelatlarge 2013-03-17 08:11:29

+0

你可以给我们看看'read'的内容(分割之前)吗? – 2013-03-17 10:24:58

+0

是的,我可以用屏幕/ dev/ttyACM0读取Arduino数据。并且它显示正常,正确的nubers,例如21.89。所以只有我的python脚本有问题。 – 2013-03-17 12:47:15

根据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 
+0

有什么不对。我的新代码是:ser = serial.Filelike('/ dev/ttyACM0',9600,timeout = 10),并且出现错误:AttributeError:'module'object has no attribute'Filelike' – 2013-03-17 12:59:26

+0

您应该使用大写L在FileLike中。 – 2013-03-17 14:41:20