在lineEdit输入数据的类型是QString类型,以往我在发送的时候是ASCII方式发送,这会儿突然遇到一个是十六进制发送/接受的下位机,就需要将QString 转化为十六进制,本来直接用toHex进行转化,但考虑到在输入的的时候有间隔符之类的,我就写了个转化的函数;
以下是转化单个字符的函数:
char MainWindow::convertHexFromChar(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);
}
}将lineEdit中的数据挨个转化发送的完整程序如下,switch语句是我为了可以兼有可以发送ASCII设置的,看case 1部分即可;
void MainWindow::on_transmitPushButton_clicked()
{
char cDataHigh,cDataLow;
QByteArray sendData;
int iSendDataSize = 0;
int iSize = ui->lineEdit->text().size();
switch(ui->modeSelectComboBox->currentIndex())
{
case 1:
{
for(int i = 0;i<iSize-1;)
{
char tempByte_h = ui->lineEdit->text().at(i).toAscii();
if(tempByte_h == ' ')
{
i+=1;
continue;
}
else
{
char tempByte_l = ui->lineEdit->text().at(i+1).toAscii();//转化成ASCII码的形式,便于符号之间的运算
i+=2;
cDataHigh = MainWindow::convertHexFromChar(tempByte_h);
cDataLow = MainWindow::convertHexFromChar(tempByte_l);
char sendChar =(char)((cDataHigh<<4)+cDataLow);
sendData[iSendDataSize]=sendChar;
iSendDataSize++;
}
}
Com->write(sendData);//write是一个重载函数,参考QIODevice类
}break;
case 0:
{
//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;
}
}