为什么 printf 在 while 循环中工作,但在树莓派 pico 之前却不行?

问题描述 投票:0回答:1

我已经在Raspberry pi 4上为Raspberry PI Pico安装了C/C++ SDK。然后我通过USB成功编译并执行了hello world示例。我使用 minicom 监视输出,到目前为止一切正常。

但是,当我在while循环之前加一个printf时,它没有任何效果。

这是我添加了 1 行的 SDK 示例:

#include <stdio.h>
#include "pico/stdlib.h"

int main() {
    stdio_init_all();

    printf( "Let's start\n" ); // <-- This is my addition

    while (true) {
        printf("Hello, world!\n");
        sleep_ms(1000);
    }
    return 0;
}

我确实按照需要在 minicom 中每秒看到一次

Hello World!
,但没有看到
Let's start
。可能是什么原因,我该如何克服?

更新:评论中一些问题的答案:

  • 我也尝试在第一个 printf 之后添加
    fflush(stdout);
    。它没有帮助
  • 通常,我在启动应用程序之前连接 minicom。无论是否使用调试器,我都会多次重启应用程序,但没有任何区别。 Minicom 不会在重启之间“掉线”。无论我做什么,与 USB 端口的连接似乎都很稳定。即使我在 pico 上的应用程序启动后启动 minicom,它也会显示“hello world”部分
  • 添加数字标识符以查看是否有一些“hello world”掉落:我在一个更复杂的应用程序中使用计时器和各种中断进行了此操作。他们工作得很好,他们都在 while 循环开始后被调用
  • 我还在 printf 之前添加了一个
    sleep_ms(1000)
    。这也没有帮助
c sdk usb raspberry-pi-pico minicom
1个回答
0
投票

最可能的原因是

stdio_init_all()
返回时USB初始化没有完成。第一份打印件将丢失。

定义

PICO_STDIO_USB_CONNECT_WAIT_TIMEOUT_MS
让它等待一定的时间。您必须在包含
pico
标题之前定义它,否则,
pico/stdio_usb.h
会将其定义为
0
.

// this must be done before indirectly including "pico/stdio_usb.h":
#ifndef PICO_STDIO_USB_CONNECT_WAIT_TIMEOUT_MS
#define PICO_STDIO_USB_CONNECT_WAIT_TIMEOUT_MS (5000)
#endif

#include <stdio.h>
#include "pico/stdlib.h"

int main(void) {
    _Bool result = stdio_init_all(); // should now wait for up to 5 seconds

    printf( "Let's start.\n" );

    for(unsigned co = 0;; ++co) {
        printf("Hello, world! %u\n", co); // Aconcagua's suggestion. Do you see "0"?
        sleep_ms(1000);
    }
    return 0;
}

如果 5 秒不够,请尝试无限期地等待,而是使用

stdio_usb_init()
显式初始化 USB,根据文档,如果您不希望在建立连接之前丢弃任何初始标准输出输出,“很有用“.

#ifndef PICO_STDIO_USB_CONNECT_WAIT_TIMEOUT_MS
#define PICO_STDIO_USB_CONNECT_WAIT_TIMEOUT_MS (-1)
#endif

#include <stdio.h>
#include "pico/stdlib.h"

int main(void) {
    _Bool result = stdio_usb_init(); // init USB explicitly

    printf( "Let's start.\n" );

    for(unsigned co = 0;; ++co) {
        printf("Hello, world!  Init: %d  id: %u\n", (int)result, co);
        sleep_ms(1000);
    }
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.