1. 程式人生 > >Qt中串列埠傳送HEX資料

Qt中串列埠傳送HEX資料

             在lineEdit輸入資料的型別是QString型別,以往我在傳送的時候是ASCII方式傳送,這會兒突然遇到一個是十六進位制傳送/接受的下位機,就需要將QString 轉化為十六進位制,本來直接用toHex進行轉化,但考慮到在輸入的的時候有間隔符之類的,我就寫了個轉化的函式;

              以下是轉化單個字元的函式:

charMainWindow::convertHexFromChar(charch)
{
if((ch>='0')&&(ch<='9'))
{
return(ch-0x30);
}
elseif((ch>='A'
)&&(ch<='F'))
{
return(ch-'A'+10);
}
elseif((ch>='a')&&(ch<='f'))
{
return(ch-'a'+10);
}
else
{
return(-1);
}
}
將lineEdit中的資料挨個轉化傳送的完整程式如下,switch語句是我為了可以兼有可以傳送ASCII設定的,看case 1部分即可;
voidMainWindow::on_transmitPushButton_clicked()
{
charcDataHigh,cDataLow;
QByteArraysendData;
intiSendDataSize=0;
intiSize=ui->lineEdit->text().size();
switch(ui->modeSelectComboBox->currentIndex())
{
case1:
{
for(inti=0;i<iSize-1;)
{
chartempByte_h=ui->lineEdit->text().at(i).toAscii();
if(tempByte_h=='')
{
i+=1;
continue;
}
else
{
chartempByte_l=ui->lineEdit->text().at(i+1
).toAscii();//轉化成ASCII碼的形式,便於符號之間的運算
i+=2;
cDataHigh=MainWindow::convertHexFromChar(tempByte_h);
cDataLow=MainWindow::convertHexFromChar(tempByte_l);
charsendChar=(char)((cDataHigh<<4)+cDataLow);
sendData[iSendDataSize]=sendChar;
iSendDataSize++;
}
}
Com->write(sendData);//write是一個過載函式,參考QIODevice類
}break;
case0:
{
//Com->write(ui->lineEdit->text().toAscii());
Com->write((ui->lineEdit->text()+"\r").toAscii());
qDebug()<<ui->lineEdit->text();
}break;
default:
{
Com->write(ui->lineEdit->text().toAscii());
}break;
}
}