реклама на сайте
подробности

 
 
> Чтение из ком-порта на Пайтоне
Zlon
сообщение Aug 17 2012, 11:18
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 17-08-12
Пользователь №: 73 164



Знакомый порекомендовал обратиться с моим вопросом к пользователю dxp на этом форуме. Но письмо отправить ему я не могу. Надеюсь, он увидит это сообщение и даст совет. Также надеюсь, что он не один тут специалист по Пайтону и поможет кто-то еще sm.gif
Вопрос у меня такой. Как правильно обращаться с ком портом в Пайтоне?
Имеется АТмега, которая меряет температуру и посылает ее через rs232.
Теперь хочу разобраться как правильно организовать чтение/запись в порт. Нашел вот такой пример https://github.com/gregpinero/ArduinoPlot
Меня смутило то что чтение происходит по таймеру. Я думал что это должно происходить по событию. Ну и там описано только как читать. А вот если мне нужно послать команду АТмеге, то это тоже в потоке делать иил можно напрямую вызывать serial.write()?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
SSerge
сообщение Aug 17 2012, 12:12
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Начните отсюда:
http://pyserial.sourceforge.net/


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Zlon
сообщение Aug 17 2012, 12:44
Сообщение #3





Группа: Новичок
Сообщений: 3
Регистрация: 17-08-12
Пользователь №: 73 164



Похоже, что wxTerminal.py оттуда как раз объясняет все мои вопросы sm.gif Спасибо sm.gif
Go to the top of the page
 
+Quote Post
dxp
сообщение Aug 18 2012, 04:55
Сообщение #4


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Сколько-нибудь квалифицированным специалистом по Python'у не являюсь, но кое-что делать доводилось. С COM портом проблем нет, путь правильный указали (см пост №2) - библиотека pyserial. Работать с ней очень просто - создаётся объект порта и далее пишете/читаете в соответствии с целевой задачей.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Zlon
сообщение Aug 18 2012, 08:22
Сообщение #5





Группа: Новичок
Сообщений: 3
Регистрация: 17-08-12
Пользователь №: 73 164



Например, есть такая структура на Си.
Код
struct
{
    int temperatura;
    unsigned char voltage;
    int crc;
} packet;


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

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

И может у кого-то есть пример как обычно распознают пакеты на Пайтоне?
Рассмотрим пример с более сложным протоколом. Возникает ситуация когда чтение начнется с середины пакета. Я должен дочитать пакет до конца, найти заголовок следующего пакета, проверить контрольную сумму и взять из него нужные данные. Тут больше ничего не нужно?
Дальше возникает ситуация что виндоус была занята и при следующем чтении я получаю сразу два и более пакета. Такая ситуация возможна?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 18 2012, 09:10
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Структуру естественно превратить в класс:
Код
class pkt :
   def __init__(self, t, v) :
      self.temperatura = t
      self.voltage = v
      self.crc = 0 #тут надо подумать
#далее в программе:
paket = pkt( 1234, 1 ) #создали экземпляр класса

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

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



--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 14:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01395 секунд с 7
ELECTRONIX ©2004-2016