在QT开发上位机与单片机通信时,因通信协议包的数据类型有“char”和“float”类型,特此记录。协议包类型如下:
typedef struct{
char data1;
char data2;
char data3;
char data4;
char dataGroup[5];
float value;
char data7;
}DataInit;
因为代码中需要计算每个字节的内存地址的数据的累加和,char类型的可以直接进行累加,而float类型的数据值无法直接进行累加,如果进行累加数据将会出错,这时就需要将float类型转化为char型。有以下两种方式:
1、可以重新定义协议包将float类型的数据更改为char 类型数组,例如:
typedef struct{
char data1;
char data2;
char data3;
char data4;
char dataGroup[5];
char floatData[4];
char data7;
}DataInit;
因为float本身在内存中分配就为4个字节,所以可在定义时直接将其定义为内存大小是4个字节的char类型的数组,在应用时可再将float数据转换为char类型并存入char类型数组中,具体操作方式参考第二种方式。
2、原本的数据包类型不变,在应用时定义一个char类型的指针,指向float变量的内存地址,读取出float中的内存地址中的数据进行操作,方式如下:
DataInit temp;
char *point=(char*)&temp.value;
for(int i=0; i<(sizeof(temp)/sizeof(char)); i++,point++){
temp.data7 +=*point;
}
该方式可避免计算数据类型的大小,可将float更方便的替换为其他类型数据。
char、float、或者自定义结构体的类型转化为QByteArray类型数据
在QT开发中,经常要使用到write()和readALL()函数,在QT的QIODecive类中,提供了这几种方式:
有时候我们需要将char、float或者自定义的结构体转化为QByteArray类型数据,可根据QByteArray的构造函数
定义:
typedef struct{
unsigned char data1; //无符号字符型
unsignedchar data2;
unsignedchar data3;
unsignedchar data4;
unsignedchar dataGroup[5];
float Data[4]; //单晶度浮点型
char data7;
}DataInit;
QByteArray ba((char*)&temp,sizeof(temp)); //开辟的内存大小为DataInit的内存大小,一般定义一个QByteArray的变量为2个字节,但这个方式开辟的内存大小为DataInit结构体的大小的字节的内存
qDebug()<<"ba :"<<ba.toHex()<<endl; //将QByteArray数据转化为十六进制以字符串的方式输出,用来查看数据是否有被改变。
qDebug()<<"ba sizeof :"<<ba.size()<<endl; //将开辟的QByteArra变量的内存大小打印出来,用来查看内存字节数是否有被改变。
QIODeivce::write(ba);//将数据通过write()fa送出去。