关注+星标公众号,不错过精彩内容
作者 | strongerHuang
打印输出日志信息 打印输出调试信息 查看实时数据等
单片机printf打印输出
单片机 printf 打印输出,最常见的一种是使用UART串口重定向,然后使用微库,比如Keil环境下,只需要在配置界面勾选“微库”即可:

intfputc(int ch, FILE *f){USART_SendChar((uint8_t)ch);return ch;}
printf("公众号:strongerHuang");单片机常见自定义printf函数
USART_SendChar((uint8_t)ch);//或者CAN总线作为通信接口CAN_SendChar((uint8_t)ch);
voidputchar(char c){USART_SendChar(c);}voidputs(constchar *str){while(*str){putchar(*str++);}putchar('\n');}
voidprint_int(int num){char buffer[12];char *ptr = buffer + 11;char is_negative = 0;if (num < 0) {is_negative = 1;num = -num;}*ptr = '\0';do {*--ptr = (num % 10) + '0';num /= 10;} while (num);if (is_negative) {*--ptr = '-';}puts(ptr);}
voidprint_fixed_point(int num, int fraction_digits){int integer_part = num / (int)pow(10, fraction_digits);int fractional_part = num % (int)pow(10, fraction_digits);print_int(integer_part);putchar('.');for (int i = 0; i < fraction_digits; i++){fractional_part *= 10;putchar((fractional_part / (int)pow(10, fraction_digits - i)) + '0');}}
voidmy_printf(constchar *format, ...){va_list args;va_start(args, format);constchar *ptr = format;while (*ptr){if (*ptr == '%'){ptr++;switch (*ptr){case'd':{int num = va_arg(args, int);print_int(num);break;}case'f':{ // 使用定点数表示int num = va_arg(args, int); // 整数部分和小数部分合并的定点数int fraction_digits = va_arg(args, int); // 小数位数print_fixed_point(num, fraction_digits);break;}default:putchar('%');putchar(*ptr);break;}} else {putchar(*ptr);}ptr++;}va_end(args);}
最最后要说明一下,这里举例只是简单给大家说明原理,真正项目,其实还需要添加很多内容,比如:串口发送超时、参数验证等容错设计。
------------ END ------------

关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。