Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与Arduino合作的Python脚本赢得';无法正确读取数据_Python_Arduino_Pyserial_Temperature - Fatal编程技术网

与Arduino合作的Python脚本赢得';无法正确读取数据

与Arduino合作的Python脚本赢得';无法正确读取数据,python,arduino,pyserial,temperature,Python,Arduino,Pyserial,Temperature,我的Python脚本有问题。它在工作,但有点不对劲。我是Python新手,所以找不到任何解决方案:( 我的脚本正在通过pySerial连接到Arduino板,并读取温度数据。连接正常,但终端中显示的数据或保存在TXT文件中的数据(使用Cron)是错误的: 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脚本

我的Python脚本有问题。它在工作,但有点不对劲。我是Python新手,所以找不到任何解决方案:(

我的脚本正在通过pySerial连接到Arduino板,并读取温度数据。连接正常,但终端中显示的数据或保存在TXT文件中的数据(使用Cron)是错误的:

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中,命令不再工作。我不知道如何编辑脚本以始终正确打印数据。

根据,当使用Python 2.6版或更高版本时,确实不再支持eol参数

请忽略我之前的建议,使用
FileLike
。这在python 2.6+中也没有使用

您必须如何处理数据取决于数据的外观。由于您没有给我们提供原始数据的示例,因此我将使用中的格式作为示例

上述示例中的数据格式为:

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]
让我们检查可以找到多少个“t:”。(您也可以搜索“\r\n”。重要的是您有一些东西可以用来分隔行)

因为我们有两个分隔符,所以至少有一个数据点。让我们隔离完整的数据点

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
根据,当使用Python 2.6版或更高版本时,确实不再支持eol参数

请忽略我之前的建议,使用
FileLike
。这在python 2.6+中也没有使用

您必须如何处理数据取决于数据的外观。由于您没有给我们提供原始数据的示例,因此我将使用中的格式作为示例

上述示例中的数据格式为:

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]
让我们检查可以找到多少个“t:”。(您也可以搜索“\r\n”。重要的是您有一些东西可以用来分隔行)

因为我们有两个分隔符,所以至少有一个数据点。让我们隔离完整的数据点

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

在不使用Python的情况下,您能否从
/dev/ttyACM0
读取Arduino数据?在Java中也是一个类似的问题。您能否向我们展示
读取
的内容(在拆分之前)?是的,我可以用screen/dev/ttyACM0读取Arduino数据。它始终显示正常、正确的数字,例如21.89。因此,我的python脚本只有一个问题。你能在没有python的情况下从
/dev/ttyACM0
读取Arduino数据吗?在Java中也是一个类似的问题。你能告诉我们
读取
的内容吗(拆分前)?是的,我可以用screen/dev/ttyACM0读取Arduino数据。它始终显示正常、正确的数字,例如21.89。因此,我的python脚本只有一个问题。有点问题。我的新代码是:ser=serial.Filelike('/dev/ttyACM0',9600,timeout=10)我得到了错误:AttributeError:'module'对象没有属性'Filelike',您应该在Filelike中使用大写字母L。有点问题。我的新代码是:ser=serial.Filelike('/dev/ttyACM0',9600,timeout=10),我得到了错误:AttributeError:'module'对象没有属性'Filelike',您应该在Filelike中使用大写字母L。