Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Чтение из ком-порта на Пайтоне
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Zlon
Знакомый порекомендовал обратиться с моим вопросом к пользователю dxp на этом форуме. Но письмо отправить ему я не могу. Надеюсь, он увидит это сообщение и даст совет. Также надеюсь, что он не один тут специалист по Пайтону и поможет кто-то еще sm.gif
Вопрос у меня такой. Как правильно обращаться с ком портом в Пайтоне?
Имеется АТмега, которая меряет температуру и посылает ее через rs232.
Теперь хочу разобраться как правильно организовать чтение/запись в порт. Нашел вот такой пример https://github.com/gregpinero/ArduinoPlot
Меня смутило то что чтение происходит по таймеру. Я думал что это должно происходить по событию. Ну и там описано только как читать. А вот если мне нужно послать команду АТмеге, то это тоже в потоке делать иил можно напрямую вызывать serial.write()?
SSerge
Начните отсюда:
http://pyserial.sourceforge.net/
Zlon
Похоже, что wxTerminal.py оттуда как раз объясняет все мои вопросы sm.gif Спасибо sm.gif
dxp
Сколько-нибудь квалифицированным специалистом по Python'у не являюсь, но кое-что делать доводилось. С COM портом проблем нет, путь правильный указали (см пост №2) - библиотека pyserial. Работать с ней очень просто - создаётся объект порта и далее пишете/читаете в соответствии с целевой задачей.
Zlon
Например, есть такая структура на Си.
Код
struct
{
    int temperatura;
    unsigned char voltage;
    int crc;
} packet;


На Пайтоне будет вот так
Код
temperatura = 1234
voltage = 1
crc = 1234
packet = [temperatura, voltage, crc]
print struct.pack('iBi', *packet) # выравнивание я потом поставлю какое нужно будет

Это можно как-то еще оформить?

И может у кого-то есть пример как обычно распознают пакеты на Пайтоне?
Рассмотрим пример с более сложным протоколом. Возникает ситуация когда чтение начнется с середины пакета. Я должен дочитать пакет до конца, найти заголовок следующего пакета, проверить контрольную сумму и взять из него нужные данные. Тут больше ничего не нужно?
Дальше возникает ситуация что виндоус была занята и при следующем чтении я получаю сразу два и более пакета. Такая ситуация возможна?
SSerge
Структуру естественно превратить в класс:
Код
class pkt :
   def __init__(self, t, v) :
      self.temperatura = t
      self.voltage = v
      self.crc = 0 #тут надо подумать
#далее в программе:
paket = pkt( 1234, 1 ) #создали экземпляр класса

Для crc логично было бы просто вызвать функцию, которая его посчитает.

Но дальше становится интереснее, поскольку пакеты могут быть различных типов, с различными полями.
Можно завести один из элементов, определяющий тип пакета и в зависимости от него по-разному обрабатывать.
Для приёма/передачи можно определить функции сериализации и десериализации, преобразующие экземпляр нашего класса в строку и обратно, заодно и crc посчитать/проверить.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.