自定义snprintf()函数给出错误的输出

时间:2018-06-20 16:18:44

标签: arduino embedded

背景

我正在尝试在嵌入式平台(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

1 个答案:

答案 0 :(得分:1)

使用时

snprintf(avr_printf_buffer, AVR_PRINTF_BUFF_SIZE, fmt, args);

args成为snprintf的自变量,就像intfloat一样。这会导致未定义的行为,因为在该处找不到格式说明符期望的对象类型。您需要改用vsnprintf

vsnprintf(avr_printf_buffer, AVR_PRINTF_BUFF_SIZE, fmt, args);