关于C#:将printf与两个UART一起使用

Using printf with two UARTs

我已经在retarget.c中实现了fputcfgetc,以便通过Cortex-M3上的UART0成功使用printf。

但是,我想要第二个uart通道来获取其他调试信息。如何使用printf尽可能好地集成UART0?

例如,使用fprintf到自定义目标并在fputc中签入将字符发送到的目标。
例如。正常输出fprintf(UART0,"..");和调试输出fprintf(UART1,"..");

但是我看不出是否为标准输出调用了fopen,因此我在努力查看如何手动实现这一点。 (如果我只是打电话给fprintf(RANDOM_VALUE,..),我不知道它的行为。

我猜想,一旦我将它定向到一个不同的" FILE",那么这只是检查在fputc中指向哪个对象的问题,但这是我正在努力的FILE指针的初始设置。

也许可以使用某种方式来区分stdout和stderr,但是从两个独立的通道获取输入时,我仍然遇到相同的问题。

也是microlib中的fprintf吗?如果没有,是否有更好的方法来实现呢?

谢谢!


fputc()使用流指针参数,有两个标准输出流stdin,stdout和stderr。在重定向的较低级别,这些分别与文件描述符0、1和2关联,您可以使用此信息在设备驱动程序级别将stderr与备用UART关联。

然后,您可以使用stderr输出调试数据,因此:

1
fprintf (stderr,"Error reading file" ) ;

例如。

最小的重定向(特定于Keil ARM-MDK / RealView)可能如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
struct __FILE
{
    int handle;  
};

enum
{
    STDIN_HANDLE,
    STDOUT_HANDLE,
    STDERR_HANDLE
} ;

FILE __stdin = {STDIN_HANDLE} ;
FILE __stdout = {STDOUT_HANDLE} ;
FILE __stderr = {STDERR_HANDLE} ;

int fputc(int ch, FILE *f)
{
    int ret = EOF ;

    switch( f->handle )
    {
        case STDOUT_HANDLE :
            // Write character to UART0
            ...
            ret = ch ;
            break ;

        case STDERR_HANDLE :
            // Write character to UART1
            ...
            ret = ch ;
            break ;

        default :
            break ;

    return ret ;
}

显然,如果需要,也可以在此挂接文件系统,在这种情况下,您的__FILE结构无疑将具有其他成员。

如果您不想为此目的使用stderr,则必须重新定位fopen()以将设备名称(例如" dbg:")转换为所需端口的文件描述符,然后使用stdio输出到相关流。

Also is fprintf in the microlib? If not, is there a better way to implement this?

文档会告诉您,但是可以。 Microlib stdio支持由#pragma import(__use_full_stdio)指令控制,如果不使用此内容,则文档尚不清楚清除的内容。尝试不使用它,如果缺少任何内容,请使用它。也就是说,我可以想象将printf()实现为stdout流的fprintf(),因此,如果您有printf(),那么您就有fprintf()。