Здесь может быть много проблем, но будьте уверены, что это не вызывает псевериал. Он использует API базовой ОС для связи с драйвером UART. Это значит, что сначала вы должны протестировать свой код с реальным Linux, чтобы увидеть, вызывает ли его WSL. Т.е. правильно ли синхронизированы буферы Linux и Windows UART. Я сожалею, что не могу сказать, есть ли проблема в вашем коде или нет, потому что я не знаю устройство, которое вы используете, поэтому я не могу догадаться, что происходит на его конце канала связи. Имейте в виду, что один Windows может вести себя странно в лучших обстоятельствах, поэтому приготовьтесь к некоторым разочарованиям здесь. Проверьте драйверы материнской платы или конвертера USB2Serial, а также все, что вы используете.
Следующее, вы должны знать, что иногда связь сбивается с толку, если не установлены тайм-ауты. Почему? Никто на самом деле не знает. Поэтому попробуйте установить время ожидания. Проверьте, нужно ли вам программное обеспечение Xon / Xoff включено или нет, а также другие параметры RS232, которые могут потребоваться устройству, с которым вы обмениваетесь данными.
Также посмотрите, что происходит с s.readline (), я лично не использовал бы это. Таймауты могут помочь, или вы можете использовать s.read (1024) с таймаутами. Я не помню сейчас, но посмотрим, поддерживает ли pyserial асинхронную связь. Если это так, вы можете попробовать использовать его вместо стандартного режима блокировки.
Кроме того, проверьте, нужно ли принудительно вызывать sh последовательный буфер после s.write () или добавить спящий режим после него. Может случиться, что устройство не получит сообщение, но запрос на чтение активирован. Поскольку устройство не получило команду, оно не отвечает. После отправки другой команды буфер ввода-вывода очищается, а предыдущий доставляется и т. Д. Последовательное общение - это весело, но когда оно попадает в ловушку, оно может быть настоящим буквой А в А, поверьте мне.
Оу, PS Проверьте, отправляет ли устройство «\ r \ n \ r \ n» или Только "\ r \ n", или "\ r" или "\ n" в ответе. s.readline () может запутаться. Для начала попробуйте поместить два s.readline () один за другим и распечатать каждый вывод. Если устройство отправляет двойной EOL, то один s.readline () останавливается на пустой строке, и ваша программа получает пустой ответ, когда вы отправляете другую команду s.readline () проходит через буфер и возвращает полную строку, которая уже там, но не читал раньше.