關注+星標公眾號,不錯過精彩內容
作者 | 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 ------------

●專欄《嵌入式工具》
●專欄《嵌入式開發》
●專欄《Keil教程》
●嵌入式專欄精選教程
關注公眾號回復“加群”按規則加入技術交流群,回復“1024”查看更多內容。