Pagina 1 di 1

STM32 CDC ACM Virtual COM problema con LINUX

MessaggioInviato: 17 gen 2018, 16:54
da pusillus
sto cercando di far comunicare un STM32 tramite VCOM su USB con un PC Linux Ubuntu.
il programma è fatto con il framework QT

Il PC apre la porta seriale e invia la stringa "who" il micro risponde con una stringa predefinita.

il problema è che con linux sembra che viene inviato un carattere alla volta.
Questa è la funzione del micro che viene richiamata se sono presenti dati nel buffer in ingresso:

Codice: Seleziona tutto
...
void USBD_CDC0_ACM_DataReceived(uint32_t len)
{
    int32_t cnt;
    (void)(len);
    cnt = USBD_CDC_ACM_ReadData(0U, uart_rx_buf, 64);
    if (cnt > 0) {
        osSignalSet(T_LED_Thread, 0x01);
    }
}
...


nel caso di linux la funzione viene chiamata per ogni carattere e la variabile cnt risulta 1.
Mentre con windows funziona perfettamente: la funzione viene chiamata quando il uart_rx_buf contiene i 3 catratteri trasmessi dal PC.

ho provato anche con "moserial" a mandare manualmente la stringa "who" ma il risultato è lo stesso.
Credevo fosse un problema di configurazione della tty, dato che linux tratta la seriale come un terminale. sono quindi andato a spulciarmi il sorgente della libreria Qtserialport e la seriale viene inizializzata in raw mode con cfmakeraw().

Idee?? nessuno si è imbattuto in un problema analogo?
Grazie!

Re: STM32 CDC ACM Virtual COM problema con LINUX

MessaggioInviato: 21 gen 2018, 19:19
da pusillus
Mi rispondo da solo:
Come avevo intuito, Linux tratta la seriale come se fosse collegata ad un terminale e non basta impostarla come raw ma vanno settate anche altre impostazioni sulla seriale.
Ho modificato la libreria qtserialport e adesso il programma funziona.
Credo dovrò aprire un bug report agli sviluppatori QT... dopo qualche altra verifica.
Screenshot_2018-01-21_15-20-41.png

Re: STM32 CDC ACM Virtual COM problema con LINUX

MessaggioInviato: 21 feb 2018, 14:19
da pusillus
Aggiorno questo post perché potrebbe essere utile a chi volesse utilizzare le QT:
Ho contattato gli sviluppatori che mi hanno consigliato di non apporre modifiche ai sorgenti ma di utilzzare la funzione handle() per ottenere il descrittore a basso livello della seriale e fare le modifiche dal programma.
Ho seguito il loro consiglio e il codice va una meraviglia.

Dopo l'aggiornamento del kernel di Linux Ubuntu il problema è sparito: il programma funziona anche senza modifiche sulle opzioni della seriale ?%