我正在尝试在嵌入式平台(Arduino)上为snrpintf()
编写包装函数,以简化写入缓冲区,然后在串行端口上打印的功能。
只要我写完整的代码,一切都可以,但是这很冗长。因此,我决定为此编写一个函数,a,这是行不通的。
由于输出完全是垃圾,看来指针未正确设置。
#include <Arduino.h>
#define AVR_PRINTF_BUFF_SIZE 127
void avrPrintf(const char *fmt, ...) {
char avr_printf_buffer[AVR_PRINTF_BUFF_SIZE] = {};
va_list args;
va_start(args, fmt);
snprintf(avr_printf_buffer, AVR_PRINTF_BUFF_SIZE, fmt, args);
va_end(args);
Serial.print(avr_printf_buffer);
}
void setup() {
Serial.begin(19200);
delay(1000);
Serial.println("Without a function:");
char buffer[AVR_PRINTF_BUFF_SIZE] = {};
snprintf(buffer, AVR_PRINTF_BUFF_SIZE, "%d.%02d.%02d %02d:%02d:%02d Weekday: %02d\r\n\n", 1985, 5, 15, 14, 0, 32, 3);
Serial.print(buffer);
Serial.println("From a function:");
avrPrintf("%d.%02d.%02d %02d:%02d:%02d Weekday: %02d\r\n", 1985, 5, 15, 14, 0, 32, 3);
}
void loop() {
;
}
输出
Without a function:
1985.05.15 14:00:32 Weekday: 03
From a function:
2139.12594.14643 12590:13618:13369 Weekday: 12590
答案 0 :(得分:1)
使用时
snprintf(avr_printf_buffer, AVR_PRINTF_BUFF_SIZE, fmt, args);
args
成为snprintf
的自变量,就像int
或float
一样。这会导致未定义的行为,因为在该处找不到格式说明符期望的对象类型。您需要改用vsnprintf
。
vsnprintf(avr_printf_buffer, AVR_PRINTF_BUFF_SIZE, fmt, args);