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

发布于:2025-03-07 ⋅ 阅读:(89) ⋅ 点赞:(0)

是不是得增加什么让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 程序可以实时接收并显示来自串口的信息。如果仍有问题,请提供具体的错误信息或日志,以便进一步分析。