简单的串口控制小车上位机开发
时间: 2025-02-08 16:11:19 浏览: 23
开发基于串口通信的小车上位机程序
选择合适的开发工具和语言
对于上位机软件的选择,可以考虑多种编程语言。如果希望快速实现并具有良好的图形用户界面(GUI),可以选择Python配合PyQt库来构建应用程序[^2]。
创建基本的GUI框架
使用PyQt创建一个简单的窗口应用作为基础结构,在这个阶段不需要涉及复杂的逻辑处理,主要是搭建好各个控件的位置布局以及初步定义这些组件的功能属性。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QLabel
from PyQt5.QtSerialPort import QSerialPortInfo, QSerialPort
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Simple Serial Car Control Panel")
layout = QVBoxLayout()
self.label_status = QLabel('Not Connected')
layout.addWidget(self.label_status)
btn_connect = QPushButton('Connect', self)
btn_disconnect = QPushButton('Disconnect', self)
btn_forward = QPushButton('Forward', self)
btn_backward = QPushButton('Backward', self)
btn_left = QPushButton('Left Turn', self)
btn_right = QPushButton('Right Turn', self)
buttons = [btn_connect, btn_disconnect, btn_forward,
btn_backward, btn_left, btn_right]
for button in buttons:
layout.addWidget(button)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
实现串口连接功能
为了能够通过USB转TTL模块与STM32建立联系,则需引入QSerialPort
类来进行实际操作。这一步骤涉及到枚举可用端口列表、设置波特率等参数配置工作,并提供按钮点击事件响应机制以便于手动触发打开关闭动作。
def init_serial_port(self):
available_ports = []
ports = QSerialPortInfo().availablePorts()
for port in ports:
available_ports.append(port.portName())
combo_box_ports.addItems(available_ports) # Assuming you have a ComboBox widget named 'combo_box_ports'
@pyqtSlot()
def on_btn_connect_clicked(self):
selected_port_name = str(combo_box_ports.currentText())
serial_port.setPortName(selected_port_name)
if not serial_port.open(QIODevice.ReadWrite | QIODevice.UnsignedChar):
QMessageBox.critical(None,"Error","Failed to open the COM Port.")
return False
serial_port.setDataBits(QSerialPort.Data8)
serial_port.setBaudRate(QSerialPort.Baud115200)
serial_port.setParity(QSerialPort.NoParity)
serial_port.setStopBits(QSerialPort.OneStop)
serial_port.setFlowControl(QSerialPort.NoFlowControl)
self.label_status.setText(f'Connected to {selected_port_name}')
return True
@pyqtSlot()
def on_btn_disconnect_clicked(self):
if(serial_port.isOpen()):
serial_port.close()
self.label_status.setText('Disconnected')
# Connect signals and slots here...
btn_connect.clicked.connect(on_btn_connect_clicked)
btn_disconnect.clicked.connect(on_btn_disconnect_clicked)
添加运动指令发送能力
当成功建立了稳定可靠的物理链路之后就可以着手准备向单片机下发命令了。通常情况下会预先约定一套简易的消息格式比如采用ASCII字符编码方式表示前进(F
)后退(B
)左转(L
)右转(R
)停止(S
)等功能键映射关系;也可以更进一步设计二进制帧头+长度域+负载数据区+校验码这样的复杂协议以满足更高层次的需求。
commands_mapping = {
"forward": b"F",
"backward": b"B",
"left_turn": b"L",
"right_turn": b"R",
"stop": b"S"
}
for key, value in commands_mapping.items():
getattr(self,f'on_{key}_clicked')(lambda :serial_port.write(value))
# Example of connecting signal with slot function.
btn_forward.clicked.connect(lambda: on_command_send(commands_mapping["forward"]))
以上代码片段展示了如何利用PyQt5中的信号槽机制关联各按键对应的回调函数从而达到控制目的的同时也实现了消息传递过程中的透明化管理[^1]。
相关推荐



















