如何将PySimpleGUI滑块数据通过PySerial写入串口?
问题解决:PySerial写入滑块数据到Arduino
错误原因
serial.Serial.write() 仅接受字节类型的数据,而你直接传入了浮点数组成的元组,同时浮点数无法被直接解析为整数用于串口写入,这就是 TypeError 的根源。
解决步骤
要实现滑块数据写入串口,需要完成以下几步:
- 将滑块返回的浮点数转为整数(角度值0-360用整数更适配Arduino的处理逻辑)
- 把三个数值拼接成带分隔符的字符串(比如用逗号分隔,末尾加换行符,方便Arduino识别数据边界)
- 将字符串编码为字节串(串口传输必须是字节格式)
- 调用
ser.write()写入字节串
修改后的完整代码
import PySimpleGUI as sg import serial font = ("Courier New", 11) sg.theme("DarkBlue3") sg.set_options(font=font) # 显式指定串口波特率,需和Arduino代码保持一致(示例用9600) ser = serial.Serial("COM6", 9600) ser.flushInput() layout = [ [sg.Text("X"), sg.Slider((0, 360), orientation='horizontal', key='SLIDER_X')], [sg.Text("Y"), sg.Slider((0, 360), orientation='horizontal', key='SLIDER_Y')], [sg.Text("Z"), sg.Slider((0, 360), orientation='horizontal', key='SLIDER_Z')], [sg.Push(), sg.Button('Exit')], ] window = sg.Window("Controller", layout, finalize=True) window['SLIDER_X'].bind('<ButtonRelease-1>', ' Release') window['SLIDER_Y'].bind('<ButtonRelease-1>', ' Release') window['SLIDER_Z'].bind('<ButtonRelease-1>', ' Release') while True: event, values = window.read() if event in (sg.WINDOW_CLOSED, 'Exit'): break # 滑块释放时发送数据到串口 if 'Release' in event: # 转换滑块值为整数 x = int(values["SLIDER_X"]) y = int(values["SLIDER_Y"]) z = int(values["SLIDER_Z"]) # 拼接为带分隔符的字符串,末尾加换行符便于Arduino识别结束位 data_str = f"{x},{y},{z}\n" # 编码为字节串后写入串口 ser.write(data_str.encode('utf-8')) print(f"已发送: {x}, {y}, {z}") window.close() ser.close()
Arduino 端参考读取代码
为配合Python端的数据格式,Arduino可使用以下代码读取:
void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { // 读取到换行符为止,获取完整数据 String data = Serial.readStringUntil('\n'); // 按逗号分割字符串并转为整数 int x = data.substring(0, data.indexOf(',')).toInt(); int y = data.substring(data.indexOf(',')+1, data.lastIndexOf(',')).toInt(); int z = data.substring(data.lastIndexOf(',')+1).toInt(); // 打印验证读取结果 Serial.print("X: "); Serial.print(x); Serial.print(" | Y: "); Serial.print(y); Serial.print(" | Z: "); Serial.println(z); } }
内容的提问来源于stack exchange,提问作者Finn
相关产品推荐
相关产品推荐

