Qt步进电机上位机控制程序
功能介绍
基于Qt库,采用C/C++语言编写的跨平台步进电机上位机控制程序。支持串口、TCP网口、UDP网络三种端口类型,带有调试显示窗口,接收数据可实时显示。具备配置自动保存功能,用户的配置数据会自动存储,并带有超时提醒功能,如果不回复则弹框提示。其中三个端口采用了类的继承与派生方式编写,对外统一接口,实现多态功能,具备较强的移植性。
环境说明
开发环境是Qt5.10.1,使用Qt自带的QSerialPort,使用网络的Socket编程。源代码中包含详细注释,使用说明,设计文档等。
子功能模块
- 步进电机的地址设置、速度设置、正转反转等控制功能;
- 网络TcpUdp串口三种通信接口通过继承派生合三为一;
- 带有接收显示窗口,方便产品调试;
- 带有超时提醒功能,以防掉线;
- 带有独立的调试窗口,大大方便调试;
- 可刷新本机所支持的串口;
核心设计
通信模块
作者用C++的继承体系把三种通信方式整合成了统一接口。基类PortBase定义了虚函数sendData()和connectDevice()。
class PortBase : public QObject {
Q_OBJECT
public:
explicit PortBase(QObject *parent = nullptr);
virtual bool connectDevice(const QString ¶m) = 0;
virtual void sendData(const QByteArray &data) = 0;
signals:
void dataReceived(QByteArray);
};
派生类比如SerialPort的实现里,重点处理了串口特有的配置项。超时检测用QTimer实现:
void TcpClientPort::checkTimeout() {
if(!m_heartbeatReply) {
QMessageBox::warning(nullptr, "掉线警告", "设备响应超时!");
emit connectionLost();
}
m_heartbeatTimer->start(5000); // 每5秒检测一次心跳
}
控制指令生成
控制指令生成部分用QByteArray处理二进制协议,比如正反转控制:
void MotorControl::sendMoveCommand(Direction dir) {
QByteArray cmd;
cmd.append(0xAA); // 帧头
cmd.append(m_address);
cmd.append(static_cast<char>(dir));
cmd.append(calculateChecksum(cmd)); // 校验和计算
m_port->sendData(cmd);
}
UI与配置
UI部分用Qt的信号槽做解耦,接收数据显示用了自定义的HexView组件。串口自动刷新功能,用QSerialPortInfo实时获取可用端口:
void MainWindow::refreshSerialPorts() {
ui->comPortCombo->clear();
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
ui->comPortCombo->addItem(info.portName());
}
}
配置保存用QSettings实现得挺简洁,把参数存到注册表里:
void AppConfig::saveSettings() {
QSettings settings("MyCompany", "MotorControl");
settings.setValue("portType", currentPortType);
settings.setValue("lastIP", ipAddress);
settings.setValue("motorSpeed", speedValue);
}
调试时发现个细节处理不错——网络通信用了单独的线程池,防止界面卡顿。代码里能看到这样的处理:
void NetworkManager::sendAsync(const QByteArray &data) {
QtConcurrent::run([=](){ // 在子线程执行耗时网络操作
m_socket->write(data);
m_socket->waitForBytesWritten(1000);
});
}
整个项目结构清晰,通信、控制、UI三层分离。移植到其他硬件平台时,只需实现新的PortBase派生类即可。


