基于qt实现十六进制收发

  • Post author:
  • Post category:其他


前面写过一篇用qt做串口助手的博文

(基于Qt5.6做一个最简单的具有收发功能的串口助手 )

,做出来的串口助手只能进行字符的收发,如果接收的是十六进制的数据的话,就会显示乱码,现在在它的基础上做一些修改,从而实现十六进制收发。

首先我在网上找到了两个函数,然后对收发函数进行简单的修改,对收到的内容的排版进行一些控制。下面贴出两个函数。

void Widget::StringToHex(QString str, QByteArray &senddata) //字符串转换为十六进制数据0-F
{
    int hexdata,lowhexdata;
    int hexdatalen = 0;
    int len = str.length();
    senddata.resize(len/2);
    char lstr,hstr;

    for(int i=0; i<len; )
    {
        //char lstr,
        hstr=str[i].toLatin1();
        if(hstr == ' ')
        {
            i++;
            continue;
        }
        i++;
        if(i >= len)
            break;
        lstr = str[i].toLatin1();
        hexdata = ConvertHexChar(hstr);
        lowhexdata = ConvertHexChar(lstr);
        if((hexdata == 16) || (lowhexdata == 16))
            break;
        else
            hexdata = hexdata*16+lowhexdata;
        i++;
        senddata[hexdatalen] = (char)hexdata;
        hexdatalen++;
    }
    senddata.resize(hexdatalen);
}
char Widget::ConvertHexChar(char ch)
{
    if((ch >= '0') && (ch <= '9'))
        return ch-0x30;
    else if((ch >= 'A') && (ch <= 'F'))
        return ch-'A'+10;
    else if((ch >= 'a') && (ch <= 'f'))
        return ch-'a'+10;
    else return ch-ch;//不在0-f范围内的会发送成0
}

把这两个函数添加到源文件里就可以使用了。

记得这是函数的定义部分,还要在头文件那里private slots对函数进行声明。

函数声明

然后再修改下收发的两个函数:

发的

void Widget::on_pushButton_send_clicked()
{
    QString str = ui->lineEdit_write->text();//从LineEdit得到字符串
    int len = str.length();
    if(len%2 == 1)   //如果发送的数据个数为奇数的,则在前面最后落单的字符前添加一个字符0
    {
        str = str.insert(len-1,'0'); //insert(int position, const QString & str)
    }
    QByteArray senddata;

     StringToHex(str,senddata);//将str字符串转换为16进制的形式

     my_serialPort->write(senddata);//发送到串口
}

收的

void Widget::readMyCom()//读取缓冲的数据,每秒读一次
{
    QByteArray temp = my_serialPort->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.toUpper());//大写
           ui->textBrowser->insertPlainText(" ");//每发送两个字符后添加一个空格
           ui->textBrowser->moveCursor(QTextCursor::End);
    }
}

改完后的效果是这样的

这里写图片描述



版权声明:本文为imkelt原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。