Python 3串口向LCD发送控制字符异常问题排查求助
此前使用Python 2开发的LCD控制代码可正常实现光标控制、颜色切换、亮度调节及文本显示更新功能。迁移至Python 3后,屏幕虽能显示正常文本,但出现大量乱码,且颜色切换失效、文本位置偏移等问题。手动直接写入文本(如self.__serial.write("test".encode()))显示正常,问题根源在于控制字符的发送逻辑。
Python 2 可行代码
def __write(self, value): self.__serial.write(str(value)) # 用于带控制字符的命令,前缀为0xfe def __write_array(self, array_values): array_values.insert(0, 0xfe) for item in array_values: self.__write(chr(item))
Python 3 修改后的写入函数
def __write(self, value): self.__serial.write(str(value).encode())
背景色设置示例函数
def set_background_color(self, value): _check_color(value) self.__state.background_color = value red = value[0] green = value[1] blue = value[2] self.__write_array([0xd0, red, green, blue]) self.__state.background_color = value time.sleep(0.01)
(注:设置绿色时,__write_array处理后的目标数组为[254, 208, 0, 255, 0])
异常表现
屏幕显示乱码,写入的数据示例:�þ�~Q^P^B�þT�þK�þ�~Y�~H�¾P�~H�þ@System Booting �þ�~P^@^@�ÿ þX�þH�þH�þH �þ�~P^@^@�ÿ�þ�~Y�~H�¾P�~H�þH�þH �þ�~P^@^@�ÿ�þ�~Y�~H�¾P�~H�þ�~P^@�ÿ^@�þH�þHa
问题核心是Python 3严格区分字符串与字节类型,当前__write函数将数值转成字符串再编码的逻辑,会破坏控制字符的二进制结构,需做以下调整:
修复
__write函数
根据输入类型处理:字符串编码为字节,整数直接转为单字节,确保二进制数据正确:def __write(self, value): if isinstance(value, str): self.__serial.write(value.encode()) elif isinstance(value, int): self.__serial.write(bytes([value])) else: self.__serial.write(value)优化
__write_array函数
直接构造字节数组一次性发送,避免循环处理导致的错误,同时简化逻辑:def __write_array(self, array_values): array_values.insert(0, 0xfe) self.__serial.write(bytes(array_values))若需保留循环调用
__write,则修改为直接传递整数:def __write_array(self, array_values): array_values.insert(0, 0xfe) for item in array_values: self.__write(item)验证控制指令的二进制正确性
以设置绿色为例,目标指令数组[254, 208, 0, 255, 0]需转为字节b'\xfe\xd0\x00\xff\x00'才能被屏幕正确识别。此前的错误逻辑会将整数254转为字符串"254"再编码为b'254',完全偏离了预期的控制字节格式。
内容的提问来源于stack exchange,提问作者Paul

