#python-3.x #pyserial
#python-3.x #pyserial
Вопрос:
Я создаю графический интерфейс с PyQt4 на Python 3. Однако я пытаюсь настроить последовательный порт с помощью PySerial, который я могу позже внедрить в этот графический интерфейс. Я не знаю, как просмотреть, соответствует ли отправляемая команда тому, что я хочу, так есть ли программа, которую я могу использовать, чтобы увидеть, что отправляются правильные байты?
Чтобы быть более понятным: я хочу видеть отправляемые или полученные байты.
Ответ №1:
Используйте pyserial read
и write
методы, чтобы проверить, что вы получаете от периферийного устройства и что вы отправляете на него. Вы можете дополнительно использовать метод to_bytes
, чтобы копать глубже, хотя большинство последовательных устройств принимают только команды ASCII.
Кроме того, Serial
класс имеет встроенное ведение журнала, вам нужно только включить его.
Комментарии:
1. Я думаю, я должен заглянуть в журнал. Однако, не являются ли методы чтения и записи для обмена данными через этот последовательный порт? Например, если я скажу write(‘:011 r’), он отправляет это моему компоненту, но какую информацию я получаю, кроме количества байтов?
2. Методы чтения и записи действительно предназначены для обмена данными, но разве это не именно то, что вы хотите? Когда вы пишете строку (bytestring в Python-3.x), эти символы или байты в точности соответствуют байтам, которые вы отправляете по проводам (в кодировке ASCII в Python-2.x). Если вы хотите видеть только единицы и ноль, преобразуйте строку в двоичное представление. Если вы действительно хотите увидеть состояния «hi» и «lo» канала передачи данных, вам придется гораздо глубже вникнуть в код pyserial, но, в конце концов, вы обнаружите, что они соответствуют значениям, которые вы получаете обратно
read
или отправляете черезwrite
.3. Возможно, причина запроса на просмотр байтов связана с ошибкой или устройство не отвечает так, как вы ожидаете, поэтому ваш реальный вопрос?
4. Я разрабатываю систему для кого-то, и я отправляю 5-байтовую команду и получаю 24-байтовый пакет состояния, и они показали мне пример этого сообщения, но все это было в байтах, и я подумал, что это будет проще с точки зрения тестирования для меня. Пока я обращаю ваше внимание, каков наилучший подход для получения 24-байтового пакета с определенными интервалами? (Я думаю, что это примерно. в данном случае 12 секунд)
5. Вы могли бы использовать
time.sleep(.12)
and thenserial.read(24)
, но в конечном итоге часы с хоста и часы клиента будут смещаться, и вы потеряете сообщения. Если возвращаемый пакет всегда имеет длину 24 байта, вы можете использовать simpluserial.read(24)
, что будет операцией блокировки до тех пор, пока не будет прочитано 24 символа / байта или когда будет достигнуто значение ReadTimeout (если вы его установили). Этот последний вариант кажется наиболее надежным, при условии, что сообщения всегда имеют длину 24 байта.