STM32输出调试信息-printf重定向到串口
来源:互联网 发布:手机小号软件排行 编辑:程序博客网 时间:2024/04/26 16:08
在STM32调试过程中常常需要将调试信息输出到串口,然后通过串口助手查看输出的调试信息。一般来说,串口输出的是指定长度的十六进制字节,对于想打印的调试信息来
说,略显灵活性不足。这时候如果可以将printf重定向到串口输出,则能很好的解决这个问题。
关于printf重定向的方法有很多种,这里只讨论一种我认为相对简单实用的方法。其主要方法步骤如下:
1、配置STM32的串口,确保STM32能输出数据到串口调试助手。
void USART5_Init(void){USART_InitTypeDef USART_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOD |RCC_APB2Periph_AFIO , ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);// Configure the USART1_Rx as input floatingGPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING ;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_Init(GPIOD, &GPIO_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_ITConfig(UART5, USART_IT_RXNE, ENABLE); //Enable rx enable, USART_ClearFlag(UART5, USART_IT_RXNE);/* Configure the USARTx */ USART_Init(UART5, &USART_InitStructure);/* Enable the USARTx */USART_Cmd(UART5, ENABLE);}2、添加printf头文件#include <stdio.h>
3、点击Keil中小魔术棒Target页勾选Use MicroLIB。
注:这个步骤必须有,否则代码编译通过后,进行仿真时会卡住,进入不了Main函数。printf、malloc等标准库函数在工程建立时,不勾选Use MicroLIB就会引起这类问题。
至此,就可以通过printf打印调试信息到串口助手了。
接下来关于输出调试信息再补充两点。
1、printf输出指定长度的字符串。
格式为printf("%.*s\n",strlen,str);
printf("指定长度字符串:%.*s\n",strlen,str);//打印指令长度字节串2、打印十六进制数据。
当我们使用串口调试助手查看输出信息,如果我们查看的数据是十六进制类型,我们会勾选调试助手中的Hex显示选项。这时当数据量很大时,我们可能需要附加一些可见字符的说明,比如英文或者中文,这时在Hex显示下,这些字符辨识度比较低,甚至是乱码,printf辅助打印调试信息目的作用不大。这里可以选择一种方法,电脑串口助手不勾选Hex选项,而将要显示的十六进制数据转为可见的ASCII码格式。
如下为指定长度的十六进制数据转化为字符串的函数:
/***********************************************************函数功能:将十六进制数据转为字符串格式*参 数:In,十六进制数据;Len十六进制数据长度* Out,输出字符串*返 回 值:无**********************************************************/void HexToString(char *Out,char *In,char Len){long i;char Temp;for(i=0;i<Len;i++){Temp = In[i]>>4;if(Temp>9)Out[2*i] = Temp + 'A' - 10;else Out[2*i] = Temp + '0';Temp = In[i] & 0x0F;if(Temp>9)Out[2*i+1] = Temp + 'A' - 10;else Out[2*i+1] = Temp + '0';}Out[2*i] = 0;}
此时再调用printf即可打印出清晰的调试信息:
HexToString(DebugData,(char *)buffer,bufferlen);printf("NTP发送:\n%s\r\n",DebugData);
以上步骤根据调试成功后的结果总结。
阅读全文
0 0
- STM32输出调试信息-printf重定向到串口
- STM32中printf重定向到串口
- STM32中printf重定向到串口
- STM32中printf重定向到串口
- 串口输出重定向到 printf
- Keil重定向printf到串口UART输出
- STM32中重定位printf到串口输出
- STM32串口通信printf重定向方法
- STM32-串口通信printf重定向
- STM32-printf重定向到USART
- 关于printf重定向到串口
- Keil C51重定向printf到串口
- Keil C51重定向printf到串口
- Keil C51重定向printf到串口
- keil C51 重定向printf到串口
- stm32为什么用printf重定向到串口第一个字符打印不出
- 【STM32】keil MDK下重定向printf到串口(基于STM32CubeMX)
- STM32 printf重定向
- C++中map用法详解
- js 里, 如何过得一个'对象'的所有属性
- 关于LinearLayout中的getGravity方法的问题
- FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换
- PHP: 判断是否是JSON数据
- STM32输出调试信息-printf重定向到串口
- NOIP2015信息传递(洛谷2661)
- 找出数组 arr 中重复出现过的元素
- 利用LabWindows/CVI进行仪表控制编程示例
- list,set的使用
- 基础代码-计算后缀表达式
- 前端资料汇总
- Python之‘’控制流‘’
- 大数据的典型应用场景及展望-札记