2017-06-13 41 views
0

我正在使用ARM(SAM4),它有两个UART,我需要设置流以便我可以使用fprintf在两者上进行打印。如何从UART中定义多个流以用于fprintf

已经尝试过fwopen没有运气:

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。

+1

这个问题是更密切相关,你的编译器和细节它的标准库实现比单片机或硬件,所以它会帮助你与你一起工作。也许还有一个完整的例子(例如,你是否检查了错误返回的'fwopen')。我不认为你可以通过'snprintf'写入一个中间缓冲区,然后将_that_转发到UART来直接和便携的解决方法。 – doynax

+1

什么工具链?什么执行环境(即OS,裸机)?通常在裸机系统上,必须重新定位库;您可以简单地将数据发送到两个端口的stdout或stderr流。 – Clifford

+0

您需要在这里添加一大堆代码,以便它在裸机时很可能不是裸机(您是否使用RTOS)。如果你只是想打印字符串,你不需要大量的C库代码,你可以将字节发送到uart(s)。 –

回答

1

你只需要重新实现newlib的_write()write_r()系统调用来处理标准输出你需要的任何方式的流文件句柄,如:

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 ; 
} 
相关问题