python serial.write_pySerial write()不会接受我的字符串

使用Python 3.3和pySerial进行串行通信。

我正在尝试向COM端口写入命令,但write方法不会接受我的字符串。(大部分代码都来自这里Full examples of using pySerial package

怎么了?import time

import serial

ser = serial.Serial(

port='\\\\.\\COM4',

baudrate=115200,

parity=serial.PARITY_ODD,

stopbits=serial.STOPBITS_ONE,

bytesize=serial.EIGHTBITS

)

if ser.isOpen():

ser.close()

ser.open()

ser.isOpen()

ser.write("%01#RDD0010000107**\r")

out = ''

# let's wait one second before reading output (let's give device time to answer)

time.sleep(1)

while ser.inWaiting() > 0:

out += ser.read(40)

if out != '':

print(">>" + out)

ser.close()

错误出现在ser.write(“%01 35; rdd001000107**\r”)处

回溯是这样的

数据=到字节(数据)

b、 追加(项)

类型错误:需要整数。

import sys import serial from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QSlider, QLabel from PySide6.QtCore import Qt, QTimer class SerialControlApp(QWidget): def __init__(self): super().__init__() self.initUI() self.serial = None self.timer = QTimer() self.timer.timeout.connect(self.check_serial_ports) self.timer.start(1000) # NOTE: 每1秒检查一次串口 def initUI(self): self.setWindowTitle('串口控制界面') self.setGeometry(100, 100, 1200, 800) # NOTE: 调整窗口大小以适应横屏布局 # 串口参数设置 self.port_label = QLabel('串口号: 未连接') self.baudrate_label = QLabel('波特率: 9600') self.connect_button = QPushButton('连接') self.connect_button.clicked.connect(self.connect_serial) # 摇杆控制 self.joystick_label = QLabel('摇杆控制') self.joystick_label.setAlignment(Qt.AlignCenter) self.joystick_label.setStyleSheet('border: 1px solid black; padding: 10px;') # 滑动条控制 self.slider_label = QLabel('速度控制') self.slider = QSlider(Qt.Vertical) self.slider.setMinimum(50) self.slider.setMaximum(255) self.slider.setFixedWidth(100) # NOTE: 增加滑动条宽度,方便拖动 self.slider.valueChanged.connect(self.send_speed) # 布局 hbox = QHBoxLayout() vbox_left = QVBoxLayout() vbox_left.addWidget(self.joystick_label) vbox_left.addWidget(self.connect_button) vbox_left.addWidget(self.port_label) vbox_left.addWidget(self.baudrate_label) vbox_right = QVBoxLayout() vbox_right.addWidget(self.slider_label) vbox_right.addWidget(self.slider) hbox.addLayout(vbox_left) hbox.addLayout(vbox_right) self.setLayout(hbox) # 摇杆事件处理 self.joystick_label.mousePressEvent = self.joystick_press self.joystick_label.mouseReleaseEvent = self.joystick_release def connect_serial(self): try: self.serial = serial.Serial('COM1', 9600) self.connect_button.setText('已连接') self.port_label.setText('串口号: COM1') except Exception as e: self.connect_button.setText('连接失败') self.port_label.setText('串口号: 未连接') def send_speed(self, value): if self.serial: self.serial.write(f'SPEED {value}'.encode()) def joystick_press(self, event): if self.serial: x = event.pos().x() y = event.pos().y() if x < 100: self.serial.write(b'A') elif x > 200: self.serial.write(b'D') elif y < 100: self.serial.write(b'W') elif y > 200: self.serial.write(b'S') def joystick_release(self, event): if self.serial: self.serial.write(b'X') def check_serial_ports(self): # NOTE: 自动检测串口并更新UI ports = serial.tools.list_ports.comports() if ports: self.port_label.setText(f'串口号: {ports[0].device}') else: self.port_label.setText('串口号: 未连接') if __name__ == '__main__': app = QApplication(sys.argv) ex = SerialControlApp() ex.show() sys.exit(app.exec()) 整体布局左边摇杆,右边滑动条。当有串口接入时自动识别,整体横屏布局
最新发布
03-24
<think>嗯,用户给了一个Python的代码,是关于用PySide6和串口控制做一个GUI应用的。他们希望我介绍一下这段代码,并且整体布局左边是摇杆,右边是滑动条,有串口接入时自动识别,横屏布局。首先,我需要理解这段代码的结构和功能。 首先,代码导入了必要的库,比如sys、serial,还有PySide6的各种组件。然后定义了一个SerialControlApp类,继承自QWidget。在初始化方法里调用了initUI,设置了串口和定时器。定时器每1秒检查一次串口,这个功能应该用来自动检测串口设备的变化。 接下来看initUI方法,设置窗口标题和大小,创建各种控件:标签、按钮、滑动条等。布局方面用了QHBoxLayout和QVBoxLayout,左边放摇杆相关控件,右边是滑动条。摇杆部分用了一个QLabel,通过鼠标事件来处理控制指令。滑动条是垂直的,范围50到255,值变化时会发送速度值。 connect_serial方法尝试连接COM1端口,波特率9600,成功或失败会更新界面状态。send_speed在滑动条变化时发送SPEED指令。摇杆的鼠标按下和释放事件分别发送不同方向的指令,比如A、D、W、S,释放时发送X停止。 check_serial_ports方法用serial.tools.list_ports.comports()检测可用串口,更新标签显示。主函数里启动应用,显示窗口。 现在需要检查用户的需求是否都被满足。整体布局左边摇杆,右边滑动条,横屏布局。代码里设置窗口大小为1200x800,比较宽的尺寸,符合横屏。布局使用水平布局,左右两边分别是vbox_left和vbox_right,符合描述。 自动识别串口方面,定时器每秒检查,更新端口号。但代码里connect_serial方法写死了连接COM1,这可能有问题。用户可能希望自动连接检测到的第一个端口,或者让用户选择。当前代码在check_serial_ports中只是显示第一个端口,但连接按钮还是连COM1,这可能需要调整,否则连接可能会失败,特别是如果检测到的端口不是COM1的话。 另外,摇杆的区域是一个QLabel,通过鼠标事件来模拟摇杆操作。当用户点击不同区域时发送不同指令,比如左边按A,右边按D,上W,下S。但代码中的判断条件是x<100,x>200,y<100,y>200,这需要确保QLabel的大小足够大,否则可能区域划分不明显。在initUI里,joystick_label设置了样式,但具体尺寸可能由布局决定,可能需要固定大小或者使用setFixedSize来确保区域划分准确。 还有,滑动条的valueChanged连接到send_speed,发送SPEED指令,这部分应该没问题。但需要确认串口通信的协议是否匹配,比如发送的是字符串'SPEED {value}',设备端是否能够正确解析。 可能存在的问题:串口连接部分写死了COM1,如果自动检测到的是其他端口,比如COM3,连接按钮还是会尝试连接COM1,导致失败。应该修改connect_serial方法,使用检测到的端口,而不是固定值。比如,在check_serial_ports中保存当前检测到的端口,connect_serial时使用这个端口。 此外,UI方面,当没有串口时,连接按钮应该禁用,或者提示用户插入设备。现在代码里检测到端口就显示第一个,但连接按钮始终可以点击,可能导致连接失败。需要处理异常情况,比如没有端口时禁用连接按钮,或者提示错误。 摇杆的鼠标事件处理,可能区域划分不够直观,用户可能期望有一个可视化的摇杆控件,而不是根据坐标判断。可以考虑使用自定义控件或者更直观的UI元素来显示摇杆状态。 另外,代码中的注释有NOTE,比如调整窗口大小以适应横屏布局,增加滑动条宽度,这些已经处理了。但需要确认实际运行时布局是否符合预期,特别是横屏下的控件排列。 总结,代码基本实现了用户的需求,但存在一些潜在问题,如串口连接的固定端口、摇杆区域划分、异常处理等。在介绍时需要说明代码的结构和功能,同时指出可能的改进点。</think>以下是对该串口控制程序的详细分析说明: $\boxed{程序功能模块解析}$ 一、界面布局设计 1. 采用横屏布局(1200×800像素) 2. 左右分栏结构: - 左边栏包含: $$摇杆控制区(200×200像素)$$ $$串口状态显示$$ $$连接按钮$$ - 右边栏包含: $$垂直速度滑杆(高度500像素)$$ $$速度显示标签$$ 二、核心功能实现 1. 串口通信模块: - 使用`pySerial`库实现通信 - 自动检测机制: $$QTimer(间隔Δt=1秒) \xrightarrow{轮询} list\_ports()$$ - 数据发送格式: ```python b'SPEED 255' # 滑动条指令 b'A/D/W/S/X' # 摇杆方向指令 ``` 2. 控制逻辑: - 摇杆区域事件映射: ``` (x < 100px) → 左转(b'A') (x > 200px) → 右转(b'D') (y < 100px) → 前进(b'W') (y > 200px) → 后退(b'S') ``` - 滑动条数值范围: $$v \in [50,255] \quad (PWM典型范围)$$ $\boxed{代码优化建议}$ 1. 串口连接改进: ```python # 修改前(固定COM1) self.serial = serial.Serial('COM1', 9600) # 建议修改(动态获取) available_ports = serial.tools.list_ports.comports() if available_ports: self.serial = serial.Serial(available_ports[0].device, 9600) ``` 2. 摇杆控制增强: ```python # 添加死区过滤(防止误触发) DEADZONE = 20 # 像素 if abs(x - 150) > DEADZONE: # 假设中心点150px # 处理水平方向 ``` 3. 异常处理完善: ```python # 增加串口异常捕获 try: self.serial.write(...) except serial.SerialException: self.connect_button.setText("连接异常") ``` $\boxed{硬件配合建议}$ 1. 推荐通信协议格式: ``` # 标准化数据帧 [START][CMD][DATA][CHECKSUM][END] ``` 2. 电机控制建议: - 滑动条对应电机转速: $$PWM_{duty} = \frac{value}{255} \times 100\%$$ - 摇杆组合控制(如W+A=左前向) 该程序已实现基础控制功能,通过增加异常处理、协议优化和硬件配合,可构建完整的物联网控制系统。实际部署时建议添加日志记录和紧急停止功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值