Frame Errors (Character Stretching) of CP2102N
I eventually found the problem: It is caused by setting the serial parameters while using the port at the same time.

I read the serial port in a separate thread that calls the following method in a loop:

def read(self):
    serstring = ""
    try:
        if self.is_reading_lines:
            self.serial.timeout = READING_LINES_TIMEOUT
            serstring = self.sio.readline().rstrip()
        else:
            self.serial.timeout = READING_CHARS_TIMEOUT
            serstring = self.serial.read(100)
    except:
        pass
    else:
        if len(serstring):
            self.process_read(serstring)
    return serstring  # if called directly


I use different timeouts for reading lines (responses to commands) and for reading binary data.

I update the timeout attribute before every read, not realising that this results in a call to method _reconfigure_port in file serialwin32.py in the pyserial module.

One of the calls in method _reconfigure_port is to win32.SetCommState. This is the ultimate cause: This affects the hardware of the CP2102 chip and causes it to interfere with outputting serial data on the RS232 port, which causes stretched data bits.

It makes perfect sense that updating the hardware settings interferes with the operation of the chip, even though the settings remain the same.

I replaced updating the timeout attribute in the read method with a separate method to set it only once and this fixed my problem.