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

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

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

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

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

C代码如下:

#include 

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]);
}

测试结果如下:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/607715.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-14
下一篇 2022-04-14

发表评论

登录后才能评论

评论列表(0条)

保存