最近项目用到串口数据转化,发来的数转换成int型和float型,发现toInt()函数不可用,研究了几天终于解决了这个问题。
requestData=myCom->readAll();//用requestData存储从串口那读取的数据读取第一个串口
if(requestData.size()==20)//这个是我的数据字节数,初期用于筛选数据
{
twoBytes=requestData.mid(0,4);//取四个字节 四个字节传来int型数据
int j = twoBytes[3] & 0x000000ff;
j |= ((twoBytes[2] << 8) & 0x0000ff00);
j |= ((twoBytes[1] << 16) & 0x00ff0000);
j |= ((twoBytes[0] << 24) & 0xff000000);
ui->label4->setText(QString::number(j));
twoBytes2=requestData.mid(4,4);
int d = twoBytes2[3] & 0x000000ff;
d |= ((twoBytes2[2] << 8) & 0x0000ff00);
d |= ((twoBytes2[1] << 16) & 0x00ff0000);
d |= ((twoBytes2[0] << 24) & 0xff000000);
ui->label2->setText(QString::number(d));
twoBytes3=requestData.mid(8,4);
int m = twoBytes3[3] & 0x000000ff;
m |= ((twoBytes3[2] << 8) & 0x0000ff00);
m |= ((twoBytes3[1] << 16) & 0x00ff0000);
m |= ((twoBytes3[0] << 24) & 0xff000000);
ui->label3->setText(QString::number(m));
twoBytes4=requestData.mid(12,4);
union MyUnion //这个是用来解决float型数据,下位机float数据很困难,转为发送 unsigned char型,上位机接受了数据,利用联合转为float数据
{
unsigned char info[4];
float f;
}FLOAT_DATA;
FLOAT_DATA.info[0]=twoBytes4[0];
FLOAT_DATA.info[1]=twoBytes4[1];
FLOAT_DATA.info[2]=twoBytes4[2];
FLOAT_DATA.info[3]=twoBytes4[3];
ui->label1->setText(QString::number(FLOAT_DATA.f));
twoBytes5=requestData.mid(16,4);
union YouUnion
{
unsigned char info[4];
float f;
}FLOAT_DATA1;
FLOAT_DATA1.info[0]=twoBytes5[0];
FLOAT_DATA1.info[1]=twoBytes5[1];
FLOAT_DATA1.info[2]=twoBytes5[2];
FLOAT_DATA1.info[3]=twoBytes5[3];
ui->label5->setText(QString::number(FLOAT_DATA1.f));
}
requestData.clear(); //清除缓冲区 这一步是必须的