在stm32单片机上对printf进行重定向后,出现了打印16进制后,串口调试助手选择16进制显示后,会出现数值多进行一次16进制转换了!
在Codeblock编译环境下编译和keil环境下编译后下载到单片机后的现象进行比较,如下:
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进制数。
//重定向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]);
}
测试结果如下:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)