基於QT5實現十六進位制串列埠資料的收發
阿新 • • 發佈:2019-02-01
之前做的一個簡單串列埠上位機 收發資料是文字格式,在此基礎上修改,實現十六進位制資料的傳送和接收
最重要的是兩個收發函式
串列埠資料的傳送:
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); } } }
效果圖 ,按多次傳送資料按鈕的結果