Flusso incoerente

Flusso incoerente

by Matteo Formenti -
Number of replies: 6

Per poter studiare meglio la gestione della concorrenza per il progetto, ho pensato di studiare i tempi di lettura dei vari dispositivi, ho quindi isolato il primo dispositivo (lps22hb) dal codice di esempio "test-sensori" e ho scritto la struttura per il calcolo della differenza di tempo. Ho provato a usare la connessione USART3 per poter leggere il risultato, tuttavia anche con vari terminatori di linea e console seriali non riesco a ottenere risultati comprensibili nè consistenti (10 �{:L ��B��10 �{:L ��B��) questo è un output che ottengo dal codice.
Ho quindi deciso di stampare su display il valore di delta tempo, usando la libreria fornita nel codice di esempio. Per facilitare il debug ho inserito due gpio toggle, uno all'inizio del loop e uno alla fine, per indicare quando in teoria il display dovrebbe aggiornarsi.
Il problema riguarda il fatto che solo rimuovendo le righe di comunicazione con il sensore lps22hb_pressure_raw_get e lps22hb_temperature_raw_get il display viene aggiornato, altrimenti rimane statico al primo valore catturato. Ho pensato che le chiamate potessero essere bloccanti, ma nonostante lo schermo non si aggiorni, i led lampeggiano correttamente (e continuo a ottenere qui caratteri sulla seriale). Aggiungo che utilizzando il debugger, il problema non viene riscontrato. Allego unicamente il contenuto del while, l'unica configurazione differente rispetto al progetto di test, riguarda i pin 7 e 0 configurati come output.
Da cosa può essere dovuto il problema?

Grazie per l'aiuto

In reply to Matteo Formenti

Ri: Flusso incoerente

by Jacopo Maltagliati -
Matteo,

Ti faccio una domanda decisamente "stupida": sei sicuro di aver impostato correttamente la velocità della porta seriale (il valore BAUD) e che ci siano il giusto controllo di flusso e la dimensione dei dati? Solitamente i parametri più utilizzati sono 9600 8n1 Xon/Xoff, ma nel caso della nostra scheda penso che la comunicazione avvenga a 115200 Baud, non ne sono sicuro.
Dico questo perché ho avuto esperienze strane con le porte seriali, e mi è capitato di ottenere stream di caratteri simili a quelli che tu hai riportato quando la velocità del terminale (il computer con l'emulatore di terminale e l'UART) non era uguale a quella dell'host, spero quindi di esserti d'aiuto.
In reply to Jacopo Maltagliati

Ri: Flusso incoerente

by Matteo Formenti -
Ciao,
grazie per la risposta, purtroppo ho già fatto questo controllo. I parametri della comunicazione sono corretti (se scrivo direttamente una stringa il risultato è impeccabile), inoltre ho scoperto che i comandi tail e cat risultano indipendenti dalla velocità della porta seriale. Suppongo a questo punto che il problema derivi forse dall'implementazione di sprintf, ma la mia esperienza di c è veramente basilare e non saprei individuare il problema, stranamente la stessa stringa stampata su display da il risultato corretto (sempre con il problema però dell'aggiornamento)
In reply to Matteo Formenti

Ri: Flusso incoerente

by Jacopo Maltagliati -
Ciao,

Non avevo visto il codice: mi baso sul fatto che tu abbia esperienza di C, se certe cose ti sembrano delle banalità ignorale tranquillamente.

E' possibile che manchi un dereferenziamento alle righe 21 e 23, dipendentemente dall'implementazione della funzione lcdPrint(): controlla che essa prenda effettivamente dei puntatori (b1 e b2 sono degli indirizzi di memoria), dato che quella "spazzatura" potrebbe essere il tentativo di interpretare l'indirizzo come una sequenza di caratteri ASCII.

Potrei tranquillamente essere fuori strada, prova a fare una lcdPrint('a') e una lcdPrint(*b1), la prima dovrebbe stampare 'a' e la seconda stampare il primo carattere del buffer b1. Nel caso la cosa funzioni, devi fare un ciclo for da 0 a 15 che scorra b1 e b2 e li stampi un carattere alla volta.
In reply to Jacopo Maltagliati

Ri: Flusso incoerente

by Matteo Formenti -
Ciao, mi sembra strano che possa essere questo il problema, perchè il valore della stringa cambia sicuramente (infatti se commento le linee di richiesta dati lo schermo si aggiorna correttamente) e anche con il problema del mancato refresh, l'output sul display rimane corretto. Ho comunque fatto i test, la funzione scritta dal Prof Braione richiede un array di caratteri in input, quindi entrambi i test falliscono senza dare output
In reply to Matteo Formenti

Ri: Flusso incoerente

by Pietro Braione -
Riguardo alla porta seriale non posso essere d'aiuto, dal momento che non ho mai avuto occasione di usarla. Riguardo al blocco del display, a me è successo quando non sono stato attento a configurare la velocità del bus I2C, che non deve essere più alta della velocità massima del display, che è la periferica più lenta. Inizi con il controllare che l'I2C sia a non più di 100 KHz di velocità. Se non è quello il problema me lo faccia sapere.
In reply to Pietro Braione

Ri: Flusso incoerente

by Matteo Formenti -
Ho modificato direttamente il progetto "test-sensori", seguendo il datasheet ho visto il limite della velocità I2C, che ho verificato essere ancora in Standard Mode 100KHz. Mi viene da pensare che ci possa essere un problema nel firmware della scheda dedicata alla comunicazione con lo schermo