Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 10, 2010 21:25:47

madlight
От:
Зарегистрирован: 2010-06-10
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно передать комманды в COM порт?

Кто сталкивался подскажите пожалуйста как правильно передать команды в HEX формате в COM порт
с портом работаю с помощью PySerial:
Пишу в порт примерно так:
self.serial.write(cmnd)
а вот чему должна быть равна cmnd если надо передать следующее:
/?! 0x0D
0х06 051 0x0D
0x0A
0x01 R1 0x02 SNUMB() 0x03
и т.п. уже по разном пробовал но похоже что то делаю неправильно т.к. устройство до которого хочу
достучатся не отвечает, а фирменной утилите своей на эти команды отвечает.
То что 0x0D = ‘\n’ а 0x0A = ‘\r’ я знаю, но вот как остальное передать мне не понятно…



Офлайн

#2 Июнь 10, 2010 21:40:18

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно передать комманды в COM порт?

Должно быть что-то вроде:

data = "".join(map(char, [0x0D, 0х06, 0x51, 0x0D ... ]))
serial.write(data)
где вместо троеточия надо вбить остальные байты.

Можно ещё не строку передать а что-то вроде такого:

BuffBytes = ctypes.c_ubyte * WRITE_LEN
data = BuffBytes(*[0x0D, 0х06, 0x51, 0x0D ... ])
serial.write(data)
Но это уже для параноиков.
Код не проверял.

Скорость передачи, число бит и т.д. правильно настроил? Осциллографом (если он есть) проверял, идут ли сигналы?



Офлайн

#3 Июнь 11, 2010 05:50:04

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Как правильно передать комманды в COM порт?

надо воспользоваться модулем struct



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#4 Июнь 11, 2010 08:43:07

madlight
От:
Зарегистрирован: 2010-06-10
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно передать комманды в COM порт?

Kogrom
Спасибо! Так получилось:

data = "".join(map(chr, [0x0D]))
serial.write(data)
PooH
надо воспользоваться модулем struct
Почитал про этот модуль, чем он мне может помочь для данной задачи не понял…



Офлайн

#5 Июнь 11, 2010 09:29:26

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Как правильно передать комманды в COM порт?

madlight
PooH
надо воспользоваться модулем struct
Почитал про этот модуль, чем он мне может помочь для данной задачи не понял…
Им можно преобразовывать типы данных питона в поток байт и наоборот.
packet = [0x0D, 0х06, 0x51, 0x0D ... ]
pack('%dB' % len(packet), *packet)



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#6 Июнь 11, 2010 12:25:41

madlight
От:
Зарегистрирован: 2010-06-10
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно передать комманды в COM порт?

пока проблему решил, на досуге попробую со struct поэксперементирую



Офлайн

#7 Июнь 11, 2010 13:17:24

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно передать комманды в COM порт?

PooH
надо воспользоваться модулем struct
Не понял, почему? Возможно, PooH хотел сказать не надо, а можно. В документации по pySerial про write написано:

pySerial
Write the string data to the port.

Changed in version 2.5: Accepts instances of bytes and bytearray when available (Python 2.6 and newer) and str otherwise.
То есть, строка будет совместима со старыми версиями, а в новых можно делать так как удобнее. Генерировать массив байтов с помощью ctypes мне удобно, так как читается проще, чем сокращения в struct. Вот что значит ‘%dB’? Без документации не разберёшься.



Офлайн

#8 Июнь 11, 2010 13:30:11

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Как правильно передать комманды в COM порт?

Kogrom
Не понял, почему? Возможно, PooH хотел сказать не надо, а можно. В документации по pySerial про write написано:
Да, действительно - можно.
Kogrom
Генерировать массив байтов с помощью ctypes мне удобно, так как читается проще, чем сокращения в struct. Вот что значит ‘%dB’? Без документации не разберёшься.
Ну это кому что привычнее. Без документации то в обоих случаях не обойтись ;)

ЗЫ: Заставили задуматься - а не удобнее ли и мне использовать ctypes :)



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version