STM32F103ZET6的printf重定向后%x输出16进制数的问题

STM32F103ZET6的printf重定向后%x输出16进制数的问题!

在stm32单片机上对printf进行重定向后,出现了打印16进制后,串口调试助手选择16进制显示后,会出现数值多进行一次16进制转换了!
在Codeblock编译环境下编译和keil环境下编译后下载到单片机后的现象进行比较,如下:

(1)CodeBlock打印出%x数值:

C代码如下:

#include <stdio.h>

int main(void)
{
    unsigned char arry[10];

    arry[0] = 0xFF;
    arry[1] = 0xFF;
    arry[2] = 0x1A;
    arry[3] = 0x45;
    printf("%02x %02x %02x %02x\n",arry[0],arry[1],arry[2],arry[3]);

    return 0;
}

编译后结果如下:
在这里插入图片描述显然打印出来的结果就是16进制数。

(2)Keil上的代码和打印:

//重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
		/* 发送一个字节数据到串口 */
		USART_SendData(DEBUG_USARTx, (uint8_t) ch);
		
		/* 等待发送完毕 */
		while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);		
	
		return (ch);
}

stm32串口发送一个字节数据的库函数:

/**
  * @brief  Transmits single data through the USARTx peripheral.
  * @param  USARTx: Select the USART or the UART peripheral. 
  *   This parameter can be one of the following values:
  *   USART1, USART2, USART3, UART4 or UART5.
  * @param  Data: the data to transmit.
  * @retval None
  */
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data)); 
    
  /* Transmit Data */
  USARTx->DR = (Data & (uint16_t)0x01FF);
}

usart1_buf为串口接收缓存区,读取到缓冲区的数据后,用printf打印出arry数组的数据:

if((usart1_buf[0] == 0xFF)&&(usart1_buf[1] == 0xFF)&&(usart1_buf[2] == 0x1A)&&(usart1_buf[3] == 0x45))
{
	arry[0] = 0xFF;
	arry[1] = 0xFF;
	arry[2] = 0x1A;
	arry[3] = 0x45;
	printf("%02x %02x %02x %02x\n",arry[0],arry[1],arry[2],arry[3]);
}

如下所示,选择1处“16进制发送”,2处“16进制显示”不勾选,后发现打印区为字符显示,却显示了16进制数!!!
在这里插入图片描述

如下所示,选择1处“16进制发送”,2处“16进制显示”勾选,后发现打印区为多进行了一次16进制数转换!!!
在这里插入图片描述
结论:通过(1)(2)知道printf打印16进制数时,在串口调试助手上输出的是hex格式的数据为34,35,相当于ASCII形式的4和5,原因不详

那这样想要打印出16进制数咋办呢?

方法1:将printf()中的“%x”该为"%c"则数据正常(如果是工作的项目中,谨慎使用第一种方法)(实测后数据不对,读者自行实验一下哦)

方法2:使用stm32库自带的函数USART_SendData:

/*****************  发送一个字节 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
	/* 发送一个字节数据到USART */
	USART_SendData(pUSARTx,ch);
		
	/* 等待发送数据寄存器为空 */
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
}
if((usart1_buf[0] == 0xFF)&&(usart1_buf[1] == 0xFF)&&(usart1_buf[2] == 0x1A)&&(usart1_buf[3] == 0x45))
{
	Usart_SendByte(DEBUG_USARTx,usart1_buf[0]);
	Usart_SendByte(DEBUG_USARTx,usart1_buf[1]);
	Usart_SendByte(DEBUG_USARTx,usart1_buf[2]);
	Usart_SendByte(DEBUG_USARTx,usart1_buf[3]);
}

测试结果如下:
在这里插入图片描述

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值