调试信息输出
为了方便在开发中将串口信息输出,查看中间环节是否正确,可以将函数printf进行重定向到串口中。
重定向printf输出
1.宏定义
在main.c中进行宏定义如下所示:
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
// 参数1: 使用哪个usart ,参数2: 字符, 参数3:输出数量,参数4:超时等待时间
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1 , 0xffff);
return ch;
}
/* USER CODE END Includes */
2.输出调试信息
需要注意到,此时调用printf函数输出时需要加上**\r\n**,否则将卡住无输出。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
uint8_t cnt=1;
while (1)
{
// 输出
printf("hello world!%d\r\n", cnt);
cnt += 1;
// 延时500ms
HAL_Delay(500);
}
/* USER CODE END WHILE */
重定向log输出
采用printf重定向输出需要注意添加\r\n,同时在完成调试后必须删除相关输出或进行注释。而使用log输出可以有效解决此类问题。
1.宏定义
同样需要先在main.c中进行宏定义
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
// 参数1: 使用哪个usart ,参数2: 字符, 参数3:输出数量,参数4:超时等待时间
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1 , 0xffff);
return ch;
}
#define LOG_ENABLE 1
#if LOG_ENABLE
#define log(format,...) printf(format"\r\n",##__VA_ARGS__)
#else
#define log(format,...)
#endif
/* USER CODE END Includes */
2.日志输出
/* Infinite loop */
/* USER CODE BEGIN WHILE */
uint8_t cnt=1;
while (1)
{
// 输出
log("hello world!%d", cnt);
cnt += 1;
// 延时500ms
HAL_Delay(1000);
}
/* USER CODE END WHILE */
3.关闭日志输出
为保证下位机代码的封装,有时日志信息不应被用户查看,此时只需要将上述宏定义中变量LOG_ENABLE定义为0即可关闭日志输出
#define LOG_ENABLE 0
输出浮点数
默认使用的输出并未开启浮点数输出,可以通过修改CMakeLists.txt实现输出。
1.CMakeLists.txt修改
打开项目空间根目录下的CMakeLists.txt文件,找到其中语句:
add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0)
在其后添加内容:
add_compile_options(-u _printf_float)
2.重置缓存并重新加载项目
完成对CMakeList.txt文件的改动后,需要重置缓存并重新加载项目。
点击CLion上方选项卡Tools(工具)并选择CMake下的Reset Cache and Reload Project(重置缓存并重新加载项目)
3.输出浮点数
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// 输出
log("hello world!%f", 1.1);
// 延时500ms
HAL_Delay(1000);
}
/* USER CODE END WHILE */
烧录后,效果如下所示:
4.重置
此部分,在使用CubeMX重新生成代码时,将被覆盖,需要重新修改CMakeList.txt文件添加相应内容。
由于整型数据UInt8仅占8位比特,而单精度浮点型float占32位比特。所以在进行数据传输时,一般将浮点型扩大取值从而降低消耗。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// 输出
log("hello world!%hd", (short)(1.11*100));
// 延时500ms
HAL_Delay(1000);
}
/* USER CODE END WHILE */