Настройка программного обеспечения:
- 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/последовательного преобразователя.
Ниже вы найдете код, используемый для отправки и считывания данных:
Код: Выделить всё
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 !")
Код: Выделить всё
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
Мобильная версия