2017-06-13 3 views
0

Je travaille avec ARM (SAM4), il a deux UART, j'ai besoin de configurer des flux afin que je puisse utiliser fprintf pour imprimer sur les deux.Comment définir plusieurs flux d'UART à utiliser dans fprintf

déjà essayé fwopen sans chance:

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"); 
} 

Cependant, la debug_writefn est plus récente appelée. J'utilise la chaîne d'outils arm-none-eabi-* (je suppose qu'elle utilise newlib), ASF et FreeRTOS.

+1

Cette question est plus étroitement lié à votre compilateur et les spécificités de sa mise en œuvre de bibliothèque standard que le MCU ou le matériel, de sorte qu'il vous aiderait avec quoi vous travaillez. Peut-être avec un exemple complet (si vous avez vérifié le retour d'erreur de 'fwopen' par exemple). Je ne pense pas que vous pourriez vous contenter de la solution de contournement simple et portable de l'écriture via 'snprintf' vers un tampon intermédiaire, puis de rediriger _that_ vers les UART à la place? – doynax

+1

Qu'est-ce toolchain? Quel environnement d'exécution (IE OS, métal nu)? Généralement, sur un système de métal nu, il faut recibler la bibliothèque; Là, vous pouvez simplement envoyer des données aux flux stdout ou stderr vers les deux ports. – Clifford

+0

Vous demandez une très grosse pile de code à ajouter ici pour que vous ayez l'impression que ce n'est pas du métal nu quand il s'agit de métal nu (utilisez-vous un RTOS)? Si vous voulez juste imprimer des chaînes, vous n'avez pas besoin de cette très grosse pile de code de la bibliothèque C, vous pouvez simplement envoyer les octets aux uart (s). –

Répondre

1

Vous avez seulement besoin réimplémenter _write() ou write_r() de syscall de newlib pour gérer la stdout la poignée de fichier de flux de quelque façon que vous avez besoin, par exemple:

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 ; 
}