Как исправить UnicodeDecodeError при использовании Serial.println

Я использую Arduino Uno R3 для отправки инструкций на последовательный монитор в программе Python с Serial.println. Но когда я отправляю определенную строку, я получаю UnicodeDecodeError.

Строка в коде Arduino, вызывающая эту ошибку:

Serial.println("Press '1,2,3,4,5' to run motor at 10%, 20%, 30%, 40%, 50% for 2 seconds");

Мой код Python для чтения последовательных данных:

def get_serial_data(self):
        while 1:
            try:
                serial_data = self.serial_connection.readline().decode('Ascii')
                filtered_serial_data = serial_data.strip('\r\n')
                self.serial_monitor.insert(END, filtered_serial_data)
            except TypeError:
                pass

и вызывается из потока:

thread1 = threading.Thread(target=self.get_serial_data)
        thread1.daemon = True
        thread1.start()

Но я получаю следующую ошибку:

UnicodeDecodeError: 'ascii' codec can't decode byte 0x85 in position 36: ordinal not in range(128)

Может ли кто-нибудь помочь, почему это происходит или как это исправить, я видел сообщение stackoverflow, в котором нужно попробовать, за исключением блока, чтобы заставить его игнорировать эту строку, но я хочу его распечатать и хочу понять, почему я получите эту ошибку.

, 👍0

Обсуждение

Как новичку в сообществе Arduino, было бы полезно знать, почему за этот и мой ответ проголосовали отрицательно. Это была реальная проблема, на решение которой мне потребовалось некоторое время, и она не была очевидна из документации. Без каких-либо причин для отрицательных голосов это сообщество выглядит недружелюбным., @stanley


1 ответ


Лучший ответ:

-1

Я решил проблему. Это была проблема с памятью, а не с декодированием. Поскольку динамическая память была в основном израсходована, это повлияло на кодирование данных. Уменьшение объема памяти, используемой моим кодом, решило проблему.

Я также обнаружил, что Serial.println("некоторый текст") использует много динамической памяти. Таким образом, мне помогло уменьшение количества кодируемого текста, а также перенос текста в F(), вот так:

Serial.println(F("some text"))

При этом строка хранится во флэш-памяти, а не в оперативной памяти. Вот полезная ссылка на функцию F:

https://arduinogetstarted.com/faq/what-is-serial.println-f

,