LINUX.ORG.RU

Python чтение с порта (Serial, USB)


0

1

На медне «нарисовался» зачетный вопрос: прочитать несколько байт с порта и обработать согласно требованиям разных заказчиков (они не могут договорится между собой). Судя по всему у заказчиков постоянно меняется протокол (может даже контрольная сумма считанных последовательностей, суть не в этом) помогите разобраться, как читать данные с порта, приводить их к «знаменателю» (если передаются разношерстные данные) типа «234»,1,5,«Петрович» и т.д.? Все выше-сказанное относится к Python (реализация должна быть на этом языке, интерфейс Qt4 .. репу почесал ..., язык не знаю, но хочется получить и знания и материальную помощь, и чтоб заказчик был доволен. Заказ не супер срочный, но требует внимания)

> «234»,1,5,«Петрович»

Если оно шлётся просто как байты, без всяких управляющих символов, то угадать тип сообщения будет ой как не просто.

PolarFox ★★★★★ ()
Ответ на: комментарий от PolarFox

Отсылка из микроконтроллера AVR Mega 32 (или вроде того, что с меги, видел только надпись), прогу (у контроллера) мона «кооректировать» (крайне не желательно, но можно)

Jeckdigger ()
Ответ на: комментарий от anon_666

Читал, к великому сожалению не понял, ка структурировать полученные данные.

Jeckdigger ()
Ответ на: комментарий от Jeckdigger

>Читал, к великому сожалению не понял, ка структурировать полученные данные.

А что? Руками нынче не модно?

pathfinder ★★★ ()
Ответ на: комментарий от pathfinder

>А что? Руками нынче не модно? не хотелось бы заниматься «ананизмом», поэтому следующие высказывания без результатов, оставьте себе. Спросил ... и хочу получить ответ, для всех

Jeckdigger ()
Ответ на: комментарий от pathfinder

Чтение

в потоке идет: 234 {разделитель} 1 {разделитель} 45 {разделитель} Петрович {разделитель} ... в таком виде, как поймать разделитель и записывать полученные данные в списки или нечто подобное для дальнейшей обработки?

Jeckdigger ()
Ответ на: Чтение от Jeckdigger

Я в питоне не силен, расскажу в общих чертах словами.

Считывай по байту и заноси результат в массив, до тех пор пока не встретится разделитель. Если встретили разделитель, то передаем массив другому обработчику, который проведет анализ и сформирует число, строку или что-то другое исходя из содержимого массива. Самый простой способ: если первый символ кавычки, то это строка, в противном случае ожидаем число. После анализа результат передается «кому надо», после чего массив обнуляется и из порта считывается в массив новый токен.

P.S. Чувствую себя капитаном.

pathfinder ★★★ ()
Ответ на: комментарий от pathfinder

Капитан ...

Идея понятна, даже направление верно, но как не совсем понимающий язык хочется увидеть примеры, хоть чуток сырцов, чтоб представление иметь, что делать. Да ... тут, кстати, «Петрович» будет занимать не один байт, остается ждать {разделитель} ...

Jeckdigger ()
Ответ на: комментарий от Shtucer

Я пробежал глазами, читать эту хрень не было желания ;)

anon_666 ()
Ответ на: Капитан ... от Jeckdigger

Ладно, уболтал ))) Если волокешь енглишь, внимательнее к названиям переменных - это тоже часть комментария.

# -*- coding:utf8 -*-
import random

def read():
    """Функция эмулирует чтение с порта. Выдает случайно от 1 до 5 байт."""
    global data
    cnt = random.randint(1, 5)
    result = data[:cnt]
    data = data[cnt:]
    return result

def recorder(record):
    """Типо сохранение или обработка записи."""
    print 'recieved record: ', record

def reader(item_separator, item_in_record):
    """Чтение и разбор данных с порта"""
    done = False
    buffer = ""
    while(not done):
        bytes_from_port = read()
        if(bytes_from_port==''):
            bytes_from_port='~#EOF#'
            done = True

        buffer = buffer + bytes_from_port  # Пополнение буфера
        items = buffer.split(item_separator, item_in_record) # Попытка выделить запись
        if(len(items)==item_in_record+1): # Если все гуд
            recorder(items[:item_in_record]) # Передача записи на обработку
            buffer = items[item_in_record]   # Сдвиг буфера 


# Тестовые данные
data = "34~456~Petrovich~1~4567~Mikhalych~89009~433~Ivanych"
# Читаем тестовые данные
reader('~', 3)
shelA ()
Ответ на: комментарий от shelA

Во! это вроде то, что надо, как только прибор принесут стразу попробую, спс большое.

Jeckdigger ()
Ответ на: комментарий от Jeckdigger

> Во! это вроде то, что надо, как только прибор принесут стразу попробую, спс большое.

Ага, пивком не забудь при случае проставиться.)))

shelA ()
Ответ на: Чтение от Jeckdigger

в том коде что я запостил в качестве разделителя выступает получение пустого сообщения

VladimirMalyk ★★★★★ ()
Ответ на: комментарий от Jeckdigger

Ну шо, подошло? С пивом шутил кстати, хотя кто его знаем, может пересечемся когда.)))

shelA ()
Ответ на: комментарий от shelA

Это именно то, что надо. Спс большое! Пиво - это святое, будешь на Урале угощу :)

Jeckdigger ()
Ответ на: комментарий от shelA

>buffer.split(item_separator, item_in_record)

Split — вселенское зло. Здесь нужен нормальный парсер.

Macil ★★★★★ ()
Ответ на: комментарий от Macil

>> buffer.split(item_separator, item_in_record)

Split — вселенское зло. Здесь нужен нормальный парсер.

Парсер, на то что бы тупо сдвинуть буфер, еще небось выполненный в виде класса с десятком методов? Ага самое то.))) Хотя конечно надо смотреть по задаче. Хотя этот вариант легче на Си перенести если приспичит с быстродействием, чем парсер, Неее?

shelA ()
Ответ на: комментарий от Jeckdigger

> ... будешь на Урале угощу :)

Эх, Урал! Почти историческая родина. Может когда и доеду до Вас.

shelA ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.