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

Скорость передачи, число бит и т.д. правильно настроил? Осциллографом (если он есть) проверял, идут ли сигналы?
PooH
надо воспользоваться модулем struct
madlight
Kogrom
Спасибо! Так получилось:
data = "".join(map(chr, [0x0D]))
serial.write(data)
PooH
надо воспользоваться модулем struct
Почитал про этот модуль, чем он мне может помочь для данной задачи не понял…
PooH
madlight
PooH
надо воспользоваться модулем struct
Почитал про этот модуль, чем он мне может помочь для данной задачи не понял…
Им можно преобразовывать типы данных питона в поток байт и наоборот.
packet = [0x0D, 0х06, 0x51, 0x0D ... ]
pack('%dB' % len(packet), *packet)
madlight
пока проблему решил, на досуге попробую со struct поэксперементирую
Kogrom
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’? Без документации не разберёшься.
PooH
Kogrom
Не понял, почему? Возможно, PooH хотел сказать не надо, а можно. В документации по pySerial про write написано:
Да, действительно - можно.
Kogrom
Генерировать массив байтов с помощью ctypes мне удобно, так как читается проще, чем сокращения в struct. Вот что значит ‘%dB’? Без документации не разберёшься.
Ну это кому что привычнее. Без документации то в обоих случаях не обойтись ;)

ЗЫ: Заставили задуматься - а не удобнее ли и мне использовать ctypes :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB