基于QT的串口通信助手(MSVC2015+QT5.8)

好久没写CSDN,一直在刚QT,可惜坑有点多,一点点整理吧,否则自己都忘光了。自己借鉴的百度文库上的一个串口助手,然后再其基础上不断改进的。
https://wenku.baidu.com/view/7dd7a283d0d233d4b14e694b.html?from=search

常用的串口文件:
qextserialbase.h qextserial.cpp
qextserialport.h qextserialport.cpp
win_qextserialport.h win_qextserialport.h

这里重点说一下,读串口函数:
(1)是基于信号槽机制的

connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));

//信号和槽函数相关联,当串口缓冲区有数据时,进行读函数,看readyRead()是否有信号,
(2)重点是这句:

QByteArray temp = myCom->readAll();

写串口指令:

myCom->write(ui->sendMsgLineEdit->text().toLatin1());//注意一下版本问题:

可是按百度来,他就是发数据,并不包含16进制模式,所以重点说一下在16进制,转换问题。
16进制转换还是分为两大部分:一:写十六进制 二:读十六进制
一:写十六进制(简单一些)

 if(isHexSend)
 {
     StringToHex(str,senddata);//将str字符串转换为16进制的形式
     myCom->write(senddata);//发送到串口
 }

StringtoHex函数:字符串转换成16进制数据0-F
http://blog.csdn.net/qq_34071268/article/details/79095105(值得参考)

void MainWindow::StringToHex(QString str, QByteArray & senddata)  //字符串转换成16进制数据0-F
{
    int hexdata,lowhexdata;
    int hexdatalen = 0;
    int len = str.length();
    senddata.resize(len/2);
    char lstr,hstr;
    for(int i=0; i//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);
}

ConvertHexChar函数

 char MainWindow::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 (-1);
        else return ch-ch;//不在0-f范围内的会发送成0
}

读串口指令(16进制):

        if(isHexRead)
        {
            QByteArray temp = myCom->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);
            }
        }

附图如下
基于QT的串口通信助手(MSVC2015+QT5.8)_第1张图片

你可能感兴趣的:(QT学习笔记)