1. 程式人生 > >基於QT5實現十六進位制串列埠資料的收發

基於QT5實現十六進位制串列埠資料的收發

之前做的一個簡單串列埠上位機  收發資料是文字格式,在此基礎上修改,實現十六進位制資料的傳送和接收

最重要的是兩個收發函式

串列埠資料的傳送:

void Widget::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<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 (-1);
        else return ch-ch;//不在0-f範圍內的會發送成0
}

把這兩個函式寫進原始檔中,,同時在標頭檔案中的private  slots新增這兩個函式 的定義 宣告
private slots:
    
    void StringToHex(QString str, QByteArray & senddata);

    char ConvertHexChar(char ch);

再修改串列埠資料接收和傳送兩個函式

傳送十六進位制資料

void Widget::on_pushButton_send_clicked() //傳送lineEdit視窗中的資料
{
//   if(!ui->lineEdit_write->text().isEmpty())
    QString str = ui->lineEdit_write->text();//從LineEdit得到字串
   if(!str.isEmpty())
   {
        isHexSend=ui->isHexSend->isChecked();
        int len =str.length();
        if(len%2 == 1)   //如果傳送的資料個數為奇數的,則在前面最後落單的字元前新增一個字元0
            {
                str = str.insert(len-1,'0'); //insert(int position, const QString & str)
            }

        QByteArray senddata;

        if(isHexSend)
        {
            StringToHex(str,senddata);//將str字串轉換為16進位制的形式
            serial->write(senddata);//傳送到串列埠
        }
        else
        {
            serial->write(ui->lineEdit_write->text().toLatin1());//傳送到串列埠
        }
   }
}

接收十六進位制資料
void Widget::Read_Data() //接收到的資料,並顯示在textEdit_read視窗中
{  
    isHexRead=ui->isHexRead->isChecked();
    if(!isHexRead)
    {
        QByteArray buf;
        buf = serial->readAll();
        if(buf!=NULL)
        {
            QString str = ui->textEdit_read->toPlainText();
            str+=tr(buf);//累加接收的資料
            ui->textEdit_read->clear();
            ui->textEdit_read->append(str);//附加str字串值
        }
    }

    if(isHexRead)
    {
        QByteArray temp = serial->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->textEdit_read->insertPlainText(str.toUpper());//大寫
            ui->textEdit_read->insertPlainText(" ");//每傳送兩個字元後新增一個空格
            ui->textEdit_read->moveCursor(QTextCursor::End);
        }
    }
}

效果圖  ,按多次傳送資料按鈕的結果