Arm 如何从UART定义要在fprintf中使用的多个流

Arm 如何从UART定义要在fprintf中使用的多个流,arm,embedded,uart,Arm,Embedded,Uart,我正在使用ARM SAM4,它有两个UART,我需要设置流,以便可以使用fprintf在这两个端口上打印 已尝试打开,但运气不佳: FILE * debug; debug_writefn(void *cookie, const char *buf, int n); void comm_init(void) { debug = fwopen(NULL, &debug_writefn); if (debug == NULL) { printf("Error"); }

我正在使用ARM SAM4,它有两个UART,我需要设置流,以便可以使用fprintf在这两个端口上打印

已尝试打开,但运气不佳:

FILE * debug; 

debug_writefn(void *cookie, const char *buf, int n);

void comm_init(void) {
  debug = fwopen(NULL, &debug_writefn);
  if (debug == NULL) {
    printf("Error");
  }
  fprintf(debug, "Test");
}
但是,debug_writefn较新


我使用的是arm none eabi-*工具链,我猜它使用了newlib、ASF和FreeRTOS。

您只需重新实现newlib的“写入”或“写入”系统调用,即可以您需要的任何方式处理流文件句柄的标准输出,例如:

enum 
{
    STDIN_HANDLE,
    STDOUT_HANDLE,
    STDERR_HANDLE
} ;

long _write( int fd, const void *buf, size_t cnt )
{
    int ret = EOF ;

    if( fd == STDOUT_HANDLE || fd == STDERR_HANDLE )
    {
        for( int i = 0l i < cnt; i++ )
        {
            serialPutc( UART1, buf[i] ) ;
            serialPutc( UART2, buf[i] ) ;
        }

        ret = i ;
    }

    return ret ;
}

与MCU或硬件相比,这个问题与编译器及其标准库实现的细节关系更为密切,因此它将帮助您了解正在使用的内容。例如,您是否检查了fwopen的错误返回,可能还需要一个完整的示例。我不认为你可以通过snprintf写入一个中间缓冲区,然后将其转发到UART,这样简单、可移植的解决方法,什么工具链?什么样的执行环境,即操作系统、裸机?通常在裸机系统上,必须重新确定库的目标;在那里,您可以简单地将数据发送到stdout或stderr流到两个端口。您要求在此处添加大量代码,以便在您使用RTOS时感觉它不是裸机。如果你只想打印字符串,你不需要那么多的C库代码,你只需要将字节发送到UART。更新了问题,@doynax我认为它会很简单,所以可能snprintf会做,@old_timer关键是字符串格式化。在我遇到的所有newlib实现中,目前没有fwopen。为了重定向stdio,您需要在构建时定义DEBUG_ENABLE,只需提供一个重写内置doNothings的_write和_read函数。