2013-03-17 2 views
1

У меня проблема с моим скриптом Python. Он работает, но что-то не так. Я новичок в Python, поэтому я не могу найти решение :(Сценарий Python, работающий с Arduino, не будет корректно считывать данные

Мой скрипт подключается через плату 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. В ORYGINAŁ версии был:

read = ser.readline(eol=/r) 

, но, насколько я знаю, в 2.5+ команды Eol не работает больше. Я понятия не имею, как редактировать мой скрипт для корректной печати данных.

+0

Вы можете прочитать данные Arduino из '/ dev/ttyACM0' _without_ Python? [Здесь] (http://stackoverflow.com/questions/15450419/java-rxtx-code-to-connect-to-rfcomm0-is-not-working) - аналогичная проблема в Java. – angelatlarge

+0

Можете ли вы показать нам содержимое 'read' (до разделения)? –

+0

Да Я могу прочитать данные Arduino с экраном/dev/ttyACM0. И он показывает нормальные, правильные нуберы, все время, например, 21.89. Таким образом, есть только проблема с моим скриптом python. –

ответ

1

В соответствии с documentation параметр eol действительно больше не поддерживается при использовании версии 2.6 версии Python выше.

Пожалуйста, не обращайте внимания на мой предыдущий совет по использованию 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:' 'мы можем найти. (Вы также можете искать «\ г \ п» вместо этого. Все, что имеет значение в том, что у вас есть что-то разделительные линии с)

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' не имеет атрибута 'Filelike' –

+0

Вы должны использовать капитал L в FileLike. –

Смежные вопросы