2012-08-10 3 views
0

Я пишу скрипт python, который будет связываться с измерителем Fluke через COM-порт. Я могу получить данные, но хочу разобрать их в полезный поплавок. Код выглядит следующим образом:Преобразование bytearray из последовательного порта в float

import serial 

ser = serial.Serial('COM3', 115200, timeout=1) 

#Decalring some variables 
FlukeID = b'ID\r' 
FlukeQM = b'QM\r' 

#Requesting the meters ID to verify connection on terminal 
ser.writelines(FlukeID) 
line = ser.readline() 
print(line) 

#Declaring variables for my while loop 
thermdata = 0 
t=1 

ser.writelines(FlukeQM) 
thermdata = ser.readline() 

while(t < 5): 
    ser.writelines(FlukeQM) 
    #thermdata = (thermdata + ser.readline()) /2 
    thermdata = ser.readline() 
    print(thermdata) 
    t+=1 

Данные, возвращаемые устройства выглядит следующим образом на консоли:

8.597E3, OHM, NORMAL, NONEINCORRECT

EDIT: Данные на самом деле выглядят так же, как на терминале л: В'0 \ r8.597E3, OHM, NORMAL, NONE \ г»

Я просто хочу, чтобы иметь возможность использовать числовое значение в начале, так что я могу сделать некоторые расчеты с течением времени. Мне также нужно иметь возможность использовать часть научного понятия в моем номере, поскольку я не буду знать диапазон моих измерений перед началом работы. Я знаю, что должен быть простой способ сделать это и будет очень признателен за любую помощь.

На стороне примечания, я также хотел бы иметь возможность отображать эти значения или помещать их в какой-то CSV-файл. Если у вас есть какие-либо комментарии о том, где искать, как это сделать, это было бы здорово, но я в основном занимаюсь обработкой bytearray.

+1

Где находится ByteArray? – unutbu

+0

'float ('8.597E3')' -> '8597.0'. Также, если вы можете просто написать строки, такие как «8.597E3, OHM, NORMAL, NONE» '+ newline для файла, и он будет в формате csv. – martineau

+0

Ну, CSV-часть кажется довольно очевидной теперь ха-ха. Благодарю. – Menimitz

ответ

2

Используйте split(), чтобы разбить вашу строку на части, разделенные запятой. Затем первая часть представляет собой строку «8.597E3», которую вы конвертируете с помощью функции float().

s = '8.597E3,OHM,NORMAL,NONE'.split(',') 
value = float(s[0]) 
+0

Это не сработает, если я сначала не преобразую его в строку. Я могу использовать .decode ('utf-8'), чтобы выполнить это. Не уверен, что это лучший способ, но так я и делал это раньше, и все возвращается ко мне. В этот момент мне также нужно будет обрезать некоторые дополнительные элементы (см. Мое редактирование выше того, как выглядит массив байтов), и я уверен, что смогу это сделать сейчас. – Menimitz

0

Как о чем-то вроде:

def atof(text): 
    try: 
     return float(text) 
    except ValueError: 
     return text 

thermdata = b'0\r8.597E3,OHM,NORMAL,NONE\r' 
for line in thermdata.strip().split(b'\r'): 
    print(list(map(atof, line.split(b',')))) 

# [0.0] 
# [8597.0, b'OHM', b'NORMAL', b'NONE'] 
Смежные вопросы