Qt采用Qextserialport 接收发送16进制数据

为了配合项目的使用,需要写个Qt的串口工具,后来发现Qextserialport 这个库很强大,参考网络霍亚飞的一篇doc,很快就搞定了界面以及基本的一些功能,不过由于项目里面需要16进制的数据收发,所以,需要支持16进制的收发,百度+谷歌下,搞定了,代码贴下,只贴核心代码:

接收16进制:

//串口接收数据
void YComWindow::readYpfCom() {
    QByteArray temp;
    QString strHex;
    if(ypfCom->bytesAvailable() >= 8)
    {
        temp = ypfCom->readAll(); //读串口缓冲区数据
    }
    QDataStream out(&temp, QIODevice::ReadWrite);    //将字节数组读入
    while(!out.atEnd())
    {
        qint8 outChar = 0;
        out >> outChar;   //每字节填充一次,直到结束
        QString str = QString("%1").arg(outChar&0xFF, 2, 16, QLatin1Char('0'));
        //十六进制的转换
        ui->textBrowser->insertPlainText(str);
        strHex += str;
    }
    //打印
    qDebug() << strHex;
    ui->textBrowser->insertPlainText(strHex);
}


发送16进制:

//发送数据
void YComWindow::on_sendMsgBtn_clicked()
{
    //
    qDebug() << ui->sendMsgLineEdit->text().toAscii();
    QByteArray temp;
    QString strHex;
    temp = ui->sendMsgLineEdit->text().toAscii();
    QDataStream out(&temp, QIODevice::ReadWrite);//将字节数组读入
    while(!out.atEnd()) {
        qint8 outChar = 0;
        out >> outChar;//每字节填充一次,直到结束
        QString str = QString("%1").arg(outChar&0xFF, 2, 16, QLatin1Char('0'));
        //十六进制的转换
//        ui->textBrowser->insertPlainText(str);
        strHex += str;
    }
    ypfCom->write(ui->sendMsgLineEdit->text().toAscii());
    ui->textBrowser->insertPlainText(strHex);
}
效果图如下:



以下是一个使用Qt5串口解析16进制协议数据的框架代码: ```cpp #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> class SerialPort : public QObject { Q_OBJECT public: SerialPort(QObject *parent = 0); ~SerialPort(); void open(QString portName, int baudRate); // 打开串口 void close(); // 关闭串口 private: QSerialPort *m_serialPort; // 串口对象 signals: void dataReceived(QByteArray data); private slots: void onReadyRead(); }; SerialPort::SerialPort(QObject *parent) : QObject(parent) , m_serialPort(new QSerialPort(this)) { connect(m_serialPort, &QSerialPort::readyRead, this, &SerialPort::onReadyRead); } SerialPort::~SerialPort() { close(); } void SerialPort::open(QString portName, int baudRate) { if (m_serialPort->isOpen()) { return; } m_serialPort->setPortName(portName); m_serialPort->setBaudRate(baudRate); m_serialPort->setDataBits(QSerialPort::Data8); m_serialPort->setParity(QSerialPort::NoParity); m_serialPort->setStopBits(QSerialPort::OneStop); m_serialPort->setFlowControl(QSerialPort::NoFlowControl); if (!m_serialPort->open(QIODevice::ReadWrite)) { qWarning() << "Failed to open serial port:" << portName; return; } } void SerialPort::close() { if (m_serialPort->isOpen()) { m_serialPort->close(); } } void SerialPort::onReadyRead() { QByteArray data = m_serialPort->readAll(); emit dataReceived(data); } ``` 在 `SerialPort` 类中,我们定义了打开和关闭串口的函数,并在 `onReadyRead` 槽函数中读取串口接收到的数据。同时,我们还定义了一个信号 `dataReceived`,用于发送串口接收到的数据。 接下来,我们可以使用上述类接收16进制协议数据。在 `dataReceived` 信号的槽函数中,我们可以通过以下代码解析16进制协议数据: ```cpp void MainWindow::onDataReceived(QByteArray data) { QByteArray hexData = data.toHex(); // 将接收到的数据转换为16进制格式 QString strData = QString(hexData); // 将16进制数据转换为字符串格式 QStringList dataList = strData.split(" "); // 将字符串数据按照空格分隔 // 按照协议解析数据 if (dataList.size() == 4) { int value1 = dataList.at(0).toInt(nullptr, 16); int value2 = dataList.at(1).toInt(nullptr, 16); int value3 = dataList.at(2).toInt(nullptr, 16); int value4 = dataList.at(3).toInt(nullptr, 16); // 处理解析出来的数据 // ... } } ``` 在上述代码中,我们首先将接收到的数据转换为16进制格式,并将其转换为字符串格式。然后,我们按照空格分隔字符串,并按照协议解析数据。最后,我们可以对解析出来的数据进行处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值