You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:05:18