( 此代码在AT32F421c8t7上测试通过 )
首先 : 需要本身就有一个串口发送函数,并且必须要有阻塞模式.( 上个数据没发送完毕,就阻塞 )
//串口发送字节函数
void usart_data_transmit(usart_type* usart_x, uint16_t data)
{// 等待发送缓冲区为空(可以放入新数据)while(usart_flag_get(usart_x, USART_TDBE_FLAG) == RESET){// 等待直到发送缓冲区为空}usart_x->dt = (data & 0x01FF);
}//使用示例
usart_data_transmit (USART1, 0x66);
第二步: 加入以下头文件和print函数.
#include <stdarg.h>
/* 自定义串口打印函数 */
void usart_print(usart_type* USARTx, const char* format, ...) {va_list args;char buffer[128];int length;int i;const char* p;int precision; // 精度控制变量/* 使用正确的 va_list 处理 */va_start(args, format);length = 0;/* 手动实现简单的格式化输出 */p = format;while (*p != '\0') {if (*p == '%') {p++; // 跳过 '%'// 检查是否有精度指定(如 .3)precision = -1; // -1 表示使用默认精度if (*p == '.') {p++; // 跳过 '.'precision = 0;while (*p >= '0' && *p <= '9') {precision = precision * 10 + (*p - '0');p++;}}switch (*p) {case 'd': { // 整数int num = va_arg(args, int);length += sprintf(&buffer[length], "%d", num);break;}case 'f': { // 浮点数double num = va_arg(args, double);if (precision >= 0) {// 使用自定义精度char format_str[8];sprintf(format_str, "%%.%df", precision);length += sprintf(&buffer[length], format_str, num);} else {// 使用默认精度(3位)length += sprintf(&buffer[length], "%.3f", num);}break;}case 's': { // 字符串char* str = va_arg(args, char*);length += sprintf(&buffer[length], "%s", str);break;}case 'c': { // 字符char ch = (char)va_arg(args, int);buffer[length++] = ch;break;}default:buffer[length++] = *p;break;}} else {buffer[length++] = *p;}p++;}va_end(args);/* 发送数据 */for (i = 0; i < length; i++) {// 添加忙等待检测while(usart_flag_get(USARTx, USART_TDBE_FLAG) == RESET);usart_data_transmit(USARTx, buffer[i]);}
}
最后:使用示例,和发送展示效果
// 默认精度(3位小数)usart_print(USART1, "默认精度: %f\r\n", 3.14159); // 输出: 默认精度: 3.142// 自定义精度usart_print(USART1, "1位小数: %.1f\r\n", 3.14159); // 输出: 1位小数: 3.1usart_print(USART1, "2位小数: %.2f\r\n", 3.14159); // 输出: 2位小数: 3.14usart_print(USART1, "4位小数: %.4f\r\n", 3.14159); // 输出: 4位小数: 3.1416// 混合使用usart_print(USART1, "温度: %.1f°C, 电压: %.2fV\r\n", 25.5, 3.141);
