欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > 增加什么让QT运行界面可以接受来自同波特率下的信息

增加什么让QT运行界面可以接受来自同波特率下的信息

2025/3/9 10:52:26 来源:https://blog.csdn.net/Yy468545/article/details/146077597  浏览:    关键词:增加什么让QT运行界面可以接受来自同波特率下的信息

是不是得增加什么让QT运行界面可以接受来自同波特率下的信息

是的,为了让 Qt 程序能够实时接收来自串口的信息并显示在界面上,您需要做以下改进:

  1. 确保串口配置正确

    • 确保串口的波特率、数据位、停止位、校验位等参数与发送端一致。

    • 在 StepperDriver 类中,确保串口配置正确。

  2. 实现实时数据接收

    • 使用 QSerialPort 的 readyRead 信号来实时接收数据。

    • 将接收到的数据解析并显示在界面上。

  3. 将接收到的数据传递到界面

    • 使用信号和槽机制将接收到的数据传递到主窗口,并显示在 txtBack 中。


1. 修改 StepperDriver 类

1.1 添加数据接收槽函数

在 StepperDriver 类中添加一个槽函数,用于处理接收到的数据:

cpp

复制

private slots:void readData();
1.2 实现数据接收逻辑

在 StepperDriver.cpp 中实现 readData 函数:

cpp

复制

void StepperDriver::readData()
{// 检查串口是否打开if (!serialPort->isOpen()) {return;}// 读取所有可用数据QByteArray data = serialPort->readAll();// 将数据转换为字符串QString message = QString::fromUtf8(data);// 发射信号,将接收到的消息传递给主窗口emit dataReceived(message);
}
1.3 添加信号

在 StepperDriver.h 中添加信号,用于将接收到的数据传递给主窗口:

cpp

复制

signals:void dataReceived(const QString &message);
1.4 连接信号与槽

在 StepperDriver 的构造函数中,连接串口的 readyRead 信号到 readData 槽函数:

cpp

复制

StepperDriver::StepperDriver(QObject *parent) : QObject(parent), serialPort(new QSerialPort(this))
{connect(serialPort, &QSerialPort::readyRead, this, &StepperDriver::readData);
}

2. 修改主窗口类

2.1 添加显示接收消息的槽函数

在 MainWindow 类中添加槽函数,用于显示接收到的消息:

cpp

复制

private slots:void onDataReceived(const QString &message);
2.2 实现显示逻辑

在 MainWindow.cpp 中实现该槽函数:

cpp

复制

void MainWindow::onDataReceived(const QString &message)
{// 将接收到的消息追加到文本框中ui->txtBack->append(message);// 可选:滚动到最新消息ui->txtBack->ensureCursorVisible();
}
2.3 连接信号与槽

在 MainWindow 的构造函数中,连接 StepperDriver 的 dataReceived 信号到主窗口的槽函数:

cpp

复制

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 连接信号与槽connect(stepperDriver, &StepperDriver::dataReceived,this, &MainWindow::onDataReceived);
}

3. 测试功能

3.1 发送测试数据

使用串口调试工具(如 Putty 或 RealTerm)向 Qt 程序发送数据。

3.2 预期结果
  • 在 Qt 程序的 txtBack 文本框中,实时显示从串口接收到的消息。


4. 扩展功能

4.1 添加时间戳

在显示消息时,添加时间戳:

cpp

复制

void MainWindow::onDataReceived(const QString &message)
{QString timestamp = QDateTime::currentDateTime().toString("hh:mm:ss");ui->txtBack->append(QString("[%1] %2").arg(timestamp, message));
}
4.2 支持二进制数据

如果需要支持二进制数据,可以修改 readData 函数:

cpp

复制

void StepperDriver::readData()
{QByteArray data = serialPort->readAll();emit dataReceived(data.toHex(' ')); // 将二进制数据转换为十六进制字符串
}
4.3 添加消息过滤

如果只关心特定格式的消息,可以在 readData 中添加过滤逻辑:

cpp

复制

void StepperDriver::readData()
{QByteArray data = serialPort->readAll();QString message = QString::fromUtf8(data);if (message.startsWith("CMD:")) { // 只处理以 "CMD:" 开头的消息emit dataReceived(message);}
}

5. 完整代码示例

StepperDriver.h

cpp

复制

class StepperDriver : public QObject
{Q_OBJECT
public:explicit StepperDriver(QObject *parent = nullptr);QSerialPort *getSerialPort() const;void on_btnOpenPort_clicked();bool sendCommand(const QByteArray &command, const QString &desc, QString successMsg, QTextEdit *txtBack);bool enableMotor(char slaveAddress, char enableStatus, QTextEdit *txtBack);bool setPositionControl(char slaveAddress, char direction, uint16_t speed, char acceleration,uint32_t pulseCount, char mode, char multiSync, QTextEdit *txtBack);bool emergencyStop(char slaveAddress, char multiSync, QTextEdit *txtBack);bool readZeroReturnStatus(char slaveAddress, QTextEdit *txtBack);bool forceAbortZeroReturn(char slaveAddress, QTextEdit *txtBack);bool triggerZeroReturn(char slaveAddress, char zeroReturnMode, char multiSync, QTextEdit *txtBack);bool readMotorCurrentPosition(char slaveAddress, QTextEdit *txtBack);bool readMotorStatusFlags(char slaveAddress, QTextEdit *txtBack);signals:void dataReceived(const QString &message);private slots:void readData();private:QSerialPort *serialPort;
};
StepperDriver.cpp

cpp

复制

StepperDriver::StepperDriver(QObject *parent) : QObject(parent), serialPort(new QSerialPort(this))
{connect(serialPort, &QSerialPort::readyRead, this, &StepperDriver::readData);
}void StepperDriver::readData()
{if (!serialPort->isOpen()) return;QByteArray data = serialPort->readAll();QString message = QString::fromUtf8(data);// 检查是否是寄存器数据包if (message.startsWith("<Rr")) {parseRegisterData(message);} else {emit dataReceived(message); // 普通消息}
}
MainWindow.cpp

cpp

复制

void MainWindow::onDataReceived(const QString &message)
{QString timestamp = QDateTime::currentDateTime().toString("hh:mm:ss");ui->txtBack->append(QString("[%1] %2").arg(timestamp, message));
}

通过以上修改,您的 Qt 程序可以实时接收并显示来自串口的信息。如果仍有问题,请提供具体的错误信息或日志,以便进一步分析。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词