Мониторинг ввода-вывода последовательного порта

#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 then serial.read(24) , но в конечном итоге часы с хоста и часы клиента будут смещаться, и вы потеряете сообщения. Если возвращаемый пакет всегда имеет длину 24 байта, вы можете использовать simplu serial.read(24) , что будет операцией блокировки до тех пор, пока не будет прочитано 24 символа / байта или когда будет достигнуто значение ReadTimeout (если вы его установили). Этот последний вариант кажется наиболее надежным, при условии, что сообщения всегда имеют длину 24 байта.