一、实验验证
1.使用 printf 函数
uint8_t data[6] ; uint32_t temp[1]={0x11223344};
data[0]=temp[0]>>24;
data[1]=temp[0]>>16;
data[2]=temp[0]>>8;
data[3]=temp[0];
data[4] =0x0d;
data[5] =0x0a;
printf("%x\r\n",temp[0]);
2.qt串口接收
QByteArray buffer =SerialPortTotal->readLine();
qDebug()<<buffer.size();
qDebug()<<"recieve"<<buffer;
QString text = QString::fromLatin1(buffer);
// text.replace(QRegExp("[\r\n]"), "")
qDebug()<<text;
结果
:
实验证明: QByteArray(字节数组)存下来的数据按位存;
3.改变printf函数输出类型
uint8_t data[4] ; uint32_t temp[1]={0x11223344};
data[0]=cannle[0]>>24;
data[1]=cannle[0]>>16;
data[2]=cannle[0]>>8;
data[3]=cannle[0];
printf("%d\r\n",temp[0]);
qt上位机不改变,实验结果:
实验证明:QByteArray(字节数组)存下来的数据按你打印出来的数据类型按位存。
二、使用串口直接发
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
串口发送的类型是 unsigned char 是8位1个字节
uint8_t data[6] ; uint32_t temp[1]={0x11223344};
data[0]=temp[0]>>24; //取32位的高8为 31-----24
data[1]=temp[0]>>16; //取32位数据的23------16
data[2]=temp[0]>>8; //取32位数据的15-----8
data[3]=temp[0]; //取32位数据的8------0
data[4] =0x0d;
data[5] =0x0a;
qt串口输出:
6
recieve "\x11\"3D\r\n"
6
recieve "\x11\"3D\r\n"
6
recieve "\x11\"3D\r\n"
分析:串口输出的是32位 0x11223344,因为:qDebug()
函数在输出 QByteArray
类型的数据时,会将其中的非打印字符、控制字符和特殊字符进行转义,以便更清晰地显示。0x11对应的转义字符就是0x11,0x22对应的是 ",0x33对应的是ASCII码 3,0x44对应的ASCII码是D。
- 十六进制数 0x33 对应的 ASCII 码是数字字符 '3'
- 十六进制数0x22 对应的 ASCII 码是双引号字符
"
- 十六进制数 0x44 对应的 ASCII 码是大写字母 'D'
转义字符和ASCII码的关系?
ASCII 码是一种字符编码方案,用于将字符映射到数字。每个字符都有一个唯一的 ASCII 码。转义字符是一种特殊的字符序列,用于在字符串中表示非打印字符、控制字符和特殊字符。
转义字符是在源代码中使用的特殊字符序列,它们以反斜杠 \
开头,后面跟着一个或多个字符,表示特定的含义。例如,\n
表示换行字符,\t
表示制表符,\r
表示回车字符,\xHH
表示一个十六进制数,等等。
ASCII 码和转义字符之间的关系在于,转义字符是一种在源代码中表示 ASCII 字符的方式之一。通过转义字符,可以在字符串中表示任意的 ASCII 字符,包括控制字符、特殊字符和非打印字符,而不必直接使用它们的数字值。
三、改变无符号32位存储的数据
uint8_t data[6] ; uint32_t temp[1]={11223344};
data[0]=temp[0]>>24;
data[1]=temp[0]>>16;
data[2]=temp[0]>>8;
data[3]=temp[0];
data[4] =0x0d;
data[5] =0x0a;
HAL_UART_Transmit(&huart3,data,6,1000);
1.qt代码
QByteArray buffer =SerialPortTotal->readLine();
qDebug()<<buffer.size();
qDebug()<<"recieve"<<buffer;
输出结果:
6
recieve "00ab41300d0a"
6
recieve "00ab41300d0a"
6
2.改变qt打印输出类型
QByteArray buffer =SerialPortTotal->readLine();
qDebug()<<buffer.size();
qDebug()<<"recieve"<<buffer;
输出结果:
6
recieve "\x00\xAB""A0\r\n"
6
recieve "\x00\xAB""A0\r\n"
6
recieve "\x00\xAB""A0\r\n"
实验表明:还是会以16进制转成ASCII码输出。