Stm32单片机详解printf函数重定向发送到串口

文章探讨了如何使用printf函数和Qt进行32位数据的按位存储,以及在串口通信中数据的接收与显示,揭示了QByteArray处理非打印字符的机制。
摘要由CSDN通过智能技术生成

一、实验验证

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码输出。

  • 20
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值