问题发生原因
使用Keil编写嵌入式代码时,常用的调试方式之一就是串口打印,但是串口打印调用的printf()
是重新定义的版本,不同于原来的标准输出STDIO。但是在代码中,可能含有从其他地方拷贝过来的代码,这些代码用的是系统的标准输出,比如:scanf()
、printf()
等函数。这就是导致问题发生的原因。
问题解决方法一
可以使用C语言常用的条件编译指令,屏蔽调用系统标准输出的代码,譬如:
调整前:
void up_lim_abs_alm_handler_test(AlarmValueDef alm_value_struct)
{
printf("请输入报警上限:");
scanf("%f", &alm_value_struct.alm1); // 假设alm1是上限,用户也可以设置alm2为上限
printf("请输入被检测的值:");
float process_value;
scanf("%f", &process_value);
if (up_lim_abs_alm(alm_value_struct.alm1, process_value))
{
printf("超过上限\n");
}
}
uint8_t up_lim_abs_alm_handler(float alm_value, float process_value)
{
if (up_lim_abs_alm(alm_value, process_value))
{
return 1;
}
return 0;
}
调整后:
#if USE_PC_STDIO == 1
void up_lim_abs_alm_handler_test(AlarmValueDef alm_value_struct)
{
printf("请输入报警上限:");
scanf("%f", &alm_value_struct.alm1); // 假设alm1是上限,用户也可以设置alm2为上限
printf("请输入被检测的值:");
float process_value;
scanf("%f", &process_value);
if (up_lim_abs_alm(alm_value_struct.alm1, process_value))
{
printf("超过上限\n");
}
}
#endif /* USE_PC_STDIO */
uint8_t up_lim_abs_alm_handler(float alm_value, float process_value)
{
if (up_lim_abs_alm(alm_value, process_value))
{
return 1;
}
return 0;
}
然后在main
函数开头中,如果没有定义USE_PC_STDIO
,就不会编译,否则定义USE_PC_STDIO
为1,会编译:
#define USE_PC_STDIO 1 // 此时代码会被编译
问题解决方法二:
如果确认使用系统标准输出的那段代码没有用到,可以直接删除。