фильтрация ввода из данных последовательного порта - PullRequest
2 голосов
/ 12 ноября 2011

Я очень новичок в Python и могу использовать вашу помощь. Я сделал небольшую программу, которая считывает аналоговый сигнал с последовательного порта и записывает его в файл. Однако, несмотря на то, что чтение очень точное, иногда оно сбрасывает ненужные / неопределенные символы в файл:

Это дамп из файла 500 строк; проверьте 2-е значение: 466 þ466 466 466

Итак, в основном проблема в том, что я понятия не имею, как отфильтровать этот вход по показаниям. Я читал немного из документации в разделе регулярных выражений, но я не могу правильно обработать / манипулировать результатом. Как вы можете видеть, функция «очистить строки» очень неполная ...

import serial
import re

#this is the pain...
def purifystring(string):

    regobj = re.match("^([0-9]+)$")
    result = regobj.find(string)

#start monitoring on ttyACM0 at 9600 baudrate
ser = serial.Serial('/dev/ttyACM0', 9600)

#the dump file
filename = 'output.txt'

#save data to file
f = open(filename, 'w')
counter = 0;
while counter < 500:

    analogvalue = ser.readline()

    #need to clean the input before writing to file...
    #purifystring(analogvalue)

    #output to console (debug)
    f.write(analogvalue)

    counter += 1

f.close()

print 'Written '+ str(counter)+' lines to '+filename;

Так что, хотя это не самый лучший подход, я открыт для предложений. Я пытаюсь, чтобы мой выходной файл имел значение в строке в диапазоне от 0 до 1023. Данные, которые я получаю при чтении сериала, представляют собой строку, похожую на «812 \ n».

Заранее спасибо!

1 Ответ

1 голос
/ 12 ноября 2011

Чтобы выполнить задание простым способом (т.е. без регулярного выражения;)), попробуйте следующее:

def purifystring(string_to_analyze):    # string is a really bad variable name as it is a python module's name
   return "".join(digit for digit in string_to_analyze if digit.isdigit())

таким образом, вы будете фильтровать только цифры полученных данных.( isdigit () )

...