Проблема с Pyserial связьюPython

Программы на Python
Ответить
Anonymous
 Проблема с Pyserial связью

Сообщение Anonymous »

Я использую pyserial в большинстве своих проектов, и у меня часто возникают проблемы со связью.
Настройка программного обеспечения:
  • Windows 10
  • Python 3.11.9
  • Pyserial 3.5 (устанавливается с помощью pip на venv)
  • Настройки порта:

    Код: Выделить всё

    self.port = serial.Serial(self.com_port, baudrate=115200, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE)

Настройка оборудования:
  • Используемый преобразователь USB/Serial: ESP-Programmer (от ESPRESSIF, который использует чип FT2232HL от FTDI)
  • Шунтируйте RX и TX
Тест:
  • Отправьте сообщение UART на передачу и прочитайте его на приеме. При сравнении обоих символов некоторые символы отсутствуют

    например:

    TX: rgb green

    RX: rgb gree

    В RX => отсутствует 'n' Ошибка связи (происходит ≃ каждые 200 итераций в цикле while -код ниже-)

С помощью осциллографа я зафиксировал неудачный кадр:
Ошибка кадра для символов 'n'
И для сравнения: тот же кадр без проблем:
Кадр без проблем, захваченный областью действия
После захвата время не эквивалентно последнему низкому состоянию символов 'n' (0x6E) и, похоже, приводит к проблеме со стоповым битом (эта проблема может возникает при разном характере сообщения)
Что может вызвать эту проблему? Может ли это быть связано с тем, что я использовал pyserial? У кого-нибудь уже было такое поведение?
Протестируйте с другим конвертером:
  • Я также попробовал использовать USB/последовательный преобразователь TTL-RS232-3V3 от FTDI и получил такую ​​же проблему при отправке полного предложения с помощью port.write(), в то время как у меня было очень мало проблем при отправке предложения посимвольно (следуя приведенному ниже коду).
  • Следуя pyserial документации, отправка всего предложения не запрещена. Что может вызвать эту разницу при использовании этого USB/последовательного преобразователя.
РЕДАКТИРОВАТЬ 01:
Ниже вы найдете код, используемый для отправки и считывания данных:

Код: Выделить всё

def try_send_command(self, command, error_echo_single_char):
self.flush_input()

if type(command) is str:
print(f"TX: {command}")
command = command + "\n\r"
# Write command letter by letter to avoid comm issue with ESP32 (and ESP Prog)
for _ in command:
self.port.write(_.encode())

if error_echo_single_char:
# Check if single character is correctly sent
readback_char = self.port.read().decode()
print(f"Readback single char: {readback_char}")
if not _ == readback_char:
print(f"error while redback char: TX:{_} RX:{readback_char}")
raise ESP32CommTest.ESP32CommTestException("Echo issue with single char.  Command not processed !")
elif type(command) is bytes:
print(f"TX: {command}")
self.port.write(command)

def send_command(self, command, check_echo=True, timeout=None, try_nb=None, end_flags=[], error_flag=[], error_echo_single_char=False):

while try_nb > 0:
try:
self.try_send_command(command=command, error_echo_single_char=error_echo_single_char)
if check_echo:
lines = self.read_lines(command, timeout=timeout, end_flags=end_flags, error_flags=error_flag)
else:
lines = self.read_lines(timeout=timeout, end_flags=end_flags, error_flags=error_flag)

if self.config.get("uart_esp32_retry_on_fail", True) and len(error_flag) > 0:
for l in lines:
if any([f in l for f in error_flag]):
raise ESP32CommTest.ESP32CommTestException("Test communication error !")

return lines
except ESP32CommTest.ESP32CommTestException as ex:
print(str(ex))
if error_echo_single_char:
raise ex

raise ex

try_nb -= 1
time.sleep(self.config.get("delay_before_retry_send_command", 2))
#End while
raise ESP32CommTest.ESP32CommTestException("Test communication command failed !")

А вот цикл отправки данных UART:

Код: Выделить всё

def set_rgb(self, color:str=Literal["red", "green", "blue", "white", "off"], timeout:int=None) -> list:
"""
Change LED color in order to perform measure for each segment using Feasa module

:param color: Select the color to be set (or clear with "off")

:return: List of output frames receives
"""

return self.send_command(command=f"rgb {color}", timeout=timeout, end_flags=["OK"], error_flag=["UNKNOWN_COLOR", "UNKNOWN_COMMAND"], check_echo=True, error_echo_single_char=False)

def send_cmd_until_fail(self):
color = ["red", "green", "blue"]

i = 0
c = 0
while True:
print(f"Command n°: {i}")

self.set_rgb(color[c], timeout=2)
time.sleep(0.2)
c += 1
if c > 2:
c = 0

i += 1
Если у кого-то уже наблюдалось такое поведение или у вас есть советы, как избежать подобных проблем, было бы здорово.
С уважением,
Антуан

Подробнее здесь: https://stackoverflow.com/questions/795 ... tion-issue
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»