Я посылаю команды через последовательный порт в Python, но они отправляются несколько раз вместо одного
Я посылаю некоторые команды, имеющие определенный ответ, последовательно, используя com-порт.. команды хранятся в файле.. я читаю каждую команду через файл построчно и отправляю ее последовательно через com-порт.. но когда я ее вижу со стороны получателя с помощью Magic Terminal(Software).. я обнаружил, что каждая команда выполняется несколько раз... которую я отправляю только один раз.. я сделал код в pycharm.. и в консоли я вижу эту команду идет только один раз, но от принимающей стороны UART история - это нечто иное... я застрял с этой проблемой.. я сохранил ту же скорость передачи данных и все, но не смог диагностировать проблему.. ссылка на код github: https://github.com/AkshatPant06/Akshat-Pant/blob/master/cmd%20list
def recvResponse():
ser.write(serial.to_bytes(intCmd))
time.sleep(1)
data_recv=ser.read(2)
return data_recv
это я использовал, чтобы получить ответ 2 байта..
1 ответ
Кажется, с вашим кодом все в порядке. По крайней мере, насколько я мог воспроизвести, он посылает команду только один раз (я попробовал вашу функцию после настройки моего последовательного порта в loopback).
Я не могу сказать наверняка, но может случиться так, что используемый вами терминал имеет два окна, одно для ввода и другое для вывода, и каким-то образом вы путаетесь с тем, что находится внутри вашего порта и из него.
Один из простых способов решения этой проблемы - использование сниффера в вашем порту. Вы можете сделать это, комбинируя com0com и Termite в Windows, как я недавно объяснил здесь.
Как видите, на этом терминале есть только одно окно, и после настройки переадресации вы будете получать все, что входит и выходит из вашего порта. Это должно облегчить понимание того, что ваш код пишет и читает.
Чтобы дать вам обычный сценарий применения трюка с анализатором, вы можете обратиться к следующему снимку экрана:
В этом случае у нас есть два реальных последовательных порта на компьютере. Во-первых (COM9
) мы работаем с сервером Modbus (вы можете представить его как набор адресов памяти, каждый из которых хранит 16-битное число). На COM10
у нас есть клиент, который отправляет запросы с запросом содержимого первых 10 адресов (называемых регистрами с использованием терминологии Modbus). В общем случае эти порты связаны кабелем, поэтому мы знаем (теоретически), что клиент COM10
отправляет фрейм данных, запрашивая эти десять регистров и сервер на COM9
отвечает с номерами, хранящимися в этих регистрах. Но мы можем видеть только содержимое на сервере (слева на картинке) и то, что получает клиент (справа). Чего мы не видим, так это того, что едет по шине (да, мы знаем, что это такое, но мы не знаем точно, как выглядит протокол Modbus изнутри).
Если мы хотим нажать на шину, чтобы увидеть, что отправляется и принимается с каждой стороны, мы можем создать пару виртуальных портов с com0com и соединение переадресации портов с Termite, что-то вроде следующего снимка экрана:
Теперь мы переместили наш сервер Modbus на один из виртуальных последовательных портов (COM4
в этом случае). После установки com0com мы получили (по умолчанию, но вы можете изменить имена или добавить больше пар портов, конечно) пару переадресованных портов (COM4<-->COM5
). Теперь, если мы хотим увидеть, что циркулирует через порты, мы открываем Termite (нижняя правая сторона рисунка) и устанавливаем другую схему переадресации портов, в данном случае с виртуального порта. COM5
в реальный порт COM9
,
Наконец (и точно так же, как прежде мы нюхали), мы имеем COM9
связаны друг с другом COM10
с кабелем. Но теперь мы можем видеть все данные, идущие туда и сюда по шине (все эти значения HEX, которые вы видите на Termite, отображаются зеленым / синим шрифтом).
Как видите, это предложит нечто похожее на то, что вы можете сделать с более профессиональными инструментами.