从零开始实现自己的串口调试助手(5) -实现HEX显示/发送/接收

实现HEX显示: 


 HEX 显示 -- 其实就是 十六进制显示 --> a - 97(10) --> 61(16)

添加槽函数(bool):

实现槽函数:

注意: 

 注意QString 没有处理HEX显示的相关API 需要使用 toUtf-8 来 转换位QByteArry 类型,

利用其中的API 来处理HEX格式(toHex   fromHex)

void Widget::on_checkBox_HexDisplay_clicked(bool checked)
{
    if(checked){ // 吧把格式转为HEX格式显示
        // 获得 内容
        QString tmp =  ui->textEditRev->toPlainText();
        // 改为HEX格式
        QByteArray qtmp = tmp.toUtf8(); // 先把QString  转为 QByteArray
        qtmp = qtmp.toHex(); // QByteArray 类型的数据可以直接转为HEX格式
        //显示
        // 注意要先将 QByteArry类型的数据转为QString 类型 才能setText
        ui->textEditRev->setText(QString::fromUtf8(qtmp));

    }

    else{ // 取消勾选,把HEX格式 转为基本格式

        // 获得HEX格式的内容
        QString tmpHex  =  ui->textEditRev->toPlainText();
        //改回基本格式
        QByteArray tmpArry = tmpHex.toUtf8(); // 先将QString 类型转为QByteArry类型
        QByteArray tmpBase = QByteArray::fromHex(tmpArry); // 将HEX类型的数据转换回去

        //显示
        ui->textEditRev->setText(QString::fromUtf8(tmpBase));

    }


}

运行结果

实现HEX接收

修改 代码:

接收框显示做 添加特殊判断 --> 是否HEX显示了

if 勾选了HEX显示,我们接收的时候就需要使用HEX显示来拼接显示

修改:on_SerialData_readToRead


void Widget::on_SerialData_readToRead()
{
    QString recvMessage = serialPort->readAll();

    if(recvMessage != NULL){
        qDebug()<<"get Message: "<<recvMessage;

        if(ui->checkBox_HexDisplay->isChecked()){ // 已经勾选HEX格式
            // 将新收到的数据转为HEX类型
            QByteArray tmpHex = recvMessage.toUtf8().toHex();

            // 原来控件上的内容 也转为HEX格式  再拼接
            QString tmpStrOld=ui->textEditRev->toPlainText(); //获得接收框的数据
            tmpHex = tmpStrOld.toUtf8() + tmpHex; // 不能toHex 已经是Hex了
            ui->textEditRev->setText(QString::fromUtf8(tmpHex));
        }
        else{
            if(sendTimeStatus){
                //更新myTime
                getSysTime();

                // 在myTime两边添加方括号
                //            QString myTimeWithBrackets = "【" + myTime + "】";

                //            // 创建一个QString对象,首先添加带方括号的myTime,然后添加sendData
                //            QString result = myTimeWithBrackets + QString(recvMessage);
                //            qDebug()<<result;
                //            ui->textEditRev->append(result);
                ui->textEditRev->append("【"+myTime+"】"+recvMessage);
            }
            else{
                ui->textEditRev->append(recvMessage);
            }
        }
        readCntTotal += recvMessage.size();
        qDebug()<<"readCnt"<<recvMessage.size();
        //ui->label_RecvCnt->setNum(readCntTotal);
        ui->label_RecvCnt->setText("Receive:"+QString::number(writeCntTotal));
    }
}

运行效果

非HEX显示:

HEX显示
 

添加HEX发送

修改:on_btnSendContext_clicked

void Widget::on_btnSendContext_clicked()
{
    // const char * sendData = ui->lineEdit_SendContext->text().toStdString().c_str();//QString->String(C++)->char*0
    const char * sendData = ui->lineEdit_SendContext->text().toLocal8Bit().constData();

    int writeCnt = 0;

    //通过串口发送:

    //HEX发送 实现
    if(ui->checkBox_HexSend->isChecked()){ //if HEX发送被勾选了
        // 获得发送框内的数据
        QString tmp = ui->lineEdit_SendContext->text();
        // 判断是否是偶数位
        QByteArray tmpArry = tmp.toLocal8Bit(); // QByteArry类型方便计算位数
        if(tmpArry.size()%2!=0){
            ui->label_SendStatus->setText("Error Input!");
            return;
        }
        // (逐位)判断是否符合16进制的表达
        for(char c:tmpArry){
            if(!std::isxdigit(c)){ //判断c是否符合16进制数的表达
                ui->label_SendStatus->setText("Error Input!");
                return;
            }

        }
        //确认可以转为16进制格式,转位16进制,进行发送
        // 用户输入1,变成1 ,拒绝变成字符1,对应ASCLL = 49
        QByteArray arrySend = QByteArray::fromHex(tmpArry);
         writeCnt = serialPort->write(arrySend);

    }



    else{ //非HEX发送,直接发送 即可
    writeCnt = serialPort->write(sendData);
    }
    if(writeCnt == - 1){
        ui->label_SendStatus->setText("SendError!");
    }
    else {
        writeCntTotal += writeCnt;
        qDebug()<<"Send:"<<sendData;
        qDebug()<<"writeCnt"<<writeCnt;

        ui->label_SendStatus->setText("SendOK!");
        //ui->label_SendCnt->setNum(writeCntTotal);
        ui->label_SendCnt->setText("Send:"+QString::number(writeCntTotal));

        if(strcmp(sendData,sendBak.toStdString().c_str())!=0){ //只有当数据与上一次不相等的时候我们才会追加到我们的历史发生中


            ui->textEditRecord->append(sendData);
            //sendBak = QString(sendData);
            sendBak = QString::fromUtf8(sendData);

        }

    }
}

运行效果:

我们先发了一组常规的01

再勾选HEX发送,发了一组HEX格式的01,输出结果如下:

解读一下:

Hex格式:30310a01

3031 -- 01 对的ASCLL

0 - 换行

01 - HEX发送的01,与HEX显示的接收没有=差别

优化HEX显示

修改槽函数on_checkBox_HexDisplay_clicked

优化内容:

大写显示

(每两个数据)空格分开

void Widget::on_checkBox_HexDisplay_clicked(bool checked)
{
    if(checked){ // 吧把格式转为HEX格式显示
        // 获得 内容
        QString tmp =  ui->textEditRev->toPlainText();
        // 改为HEX格式
        QByteArray qtmp = tmp.toUtf8(); // 先把QString  转为 QByteArray
        qtmp = qtmp.toHex(); // QByteArray 类型的数据可以直接转为HEX格式
        //显示
        // 注意要先将 QByteArry类型的数据转为QString 类型 才能setText
        //ui->textEditRev->setText(QString::fromUtf8(qtmp));
        QString lastShow;
        tmp  = QString::fromUtf8(qtmp);
        for(int i=0;i<tmp.size();i+=2){
            lastShow += tmp.mid(i,2) + " "; //去tmp第i位往后两个数,在加上空格拼接
        }

        ui->textEditRev->setText(lastShow.toUpper());

    }

    else{ // 取消勾选,把HEX格式 转为基本格式

        // 获得HEX格式的内容
        QString tmpHex  =  ui->textEditRev->toPlainText();
        //改回基本格式
        QByteArray tmpArry = tmpHex.toUtf8(); // 先将QString 类型转为QByteArry类型
        QByteArray tmpBase = QByteArray::fromHex(tmpArry); // 将HEX类型的数据转换回去

        //显示
        // ui->textEditRev->setText(QString::fromUtf8(tmpBase));
        ui->textEditRev->setText(tmpBase);
    }


}

效果演示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值