Pyseriale KommunikationsproblemPython

Python-Programme
Anonymous
 Pyseriale Kommunikationsproblem

Post by Anonymous »

Ich verwende Pyserial mit dem größten Teil meines Projekts und habe oft Kommunikationsprobleme. Manchmal fehlen einige Zeichen. < /P>
Unter dem Befehl, mit dem ich das Kommunikationsproblem untersucht habe:
tx: rgb green
rx: rgb gee < /p>
Das 'N' fehlt in der Rx (Target echo)
und unter dem Frames, das mit dem Frames -HABE -HABEM -HABE -HABE -HABE -HABE -HABE -HABE -HABE -HABE -HABE -HABE -HABE -HABE -HABEM: Ziel gibt das Echo mit dem Charaters 'n' fehlenden < /p>
und unten der gleiche Befehl ohne Fehler:
Frame ohne Ausgabe, das nach diesem Befehl erfasst wurde. Nach diesem Befehl gibt das Ziel das Echo mit allen Charakteren zurück und prozzierte den Befehl. Und ich frage mich, was dies verursachen könnte (und ob es wirklich der Punkt für das Stop -Bit -Problem ist). Manchmal kann es für eine lange Zeit ohne Probleme laufen und manchmal tritt die Kommunikation schnell auf. /> [*] Python 3.11.9 < /li>
Pyserial 3.5 (mit PIP auf Venv installiert) < /li>
Porteinstellungen:
  • Code: Select all

    self.port = serial.Serial(self.com_port, baudrate=115200, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE)
[*] USB/Seriell Converter IS ESP -Programmierer von Espresssif

Bearbeiten 01:
Bitte finden Sie den Code, der zum Senden und Lesedaten verwendet wird:
def try_send_command(self, command, error_echo_single_char):
self.flush_input()

if type(command) is str:
print(f"TX: {command}")
# 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 proccessed !")

self.port.write("\n\r".encode())
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 !")

< /code>
Und hier ist die Schleife zum Senden von UART -Daten: < /p>
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
< /code>
Wenn jemand dieses Verhalten bereits hat oder wenn Sie einige raten, diese Probleme zu vermeiden, wäre dies großartig. Treiber
[*] Verwenden verschiedener Konverter

Windows kann den COM -Port schlecht verwalten>

Quick Reply

Change Text Case: