in data 11-05-2012 05:33 AM
Ciao a tutti, chiedo se è possibile ricomporre una stringa che arriva spezzettata in 2 o 3 pezzi dalla seriale in una stringa completa che poi possa venire elaborata dal resto del vi.
Spiego meglio, ho uno strumento che ogni secondo invia a seriale una stringa composta di tre valori numerici intervallati da #numero canale e virgola. Ogni stringa completa è separata da CR, però le stringhe non arrivano mai tutte intere ma spezzettate in 1, 2, o tre parti in maniera random.
Vorrei sapere se è possibile utilizzando le code ricostruire ogni stringa al suo completamento.
Ringrazio.
11-05-2012 08:18 AM - modificato 11-05-2012 08:19 AM
Più semplice delle code è utilizzare il concatenate string. Però mi sembra strano che la stringa "arrivi spezzettata": più probabilmente stai leggendo prima che sia arrivata tutta: prova a impostare correttamente il terminatore nella VISA Configure Serial Port (il default è 0x10 che è LF, per CR devi impostare 0xA) e lasciare un tempo più lungo (guarda la documentazione dello strumento per sapere il tempo di risposta tipico e massimo). Guarda l'esempio Advanced Serial Write and Read
in data 11-05-2012 10:31 AM
Ti ringrazio voglio provare come dici tu...però non ho capito come fare ad impostare 0xA nel visa configure, creando una costante mi fa solo inserire un numero intero.
in data 11-05-2012 11:06 AM
0xA vuol dire 10 in formato esadecimale; corrisponde a LF - Line feed. Nel tuo caso devi scrivere 13 (corrisponde a 0xD, indicato come CR - carriage return).
Hai visto l'help in linea? Elenca i valori in esadecimale.
in data 11-05-2012 11:54 AM
Ciao si ho cercato nell'help in linea ma non ho trovato quello che mi serviva, ho immaginato corrispondesse all'esadecimale ma non trovavo il valore da inserire. Grazie. Domani provo.
11-05-2012 05:16 PM - modificato 11-05-2012 05:17 PM
Si, lo '0x' è tipico in linguaggi testuali tipo C ma ci sono numerosi altri modi per evidenziare che si parla di numeri esadecimali, prova per esempio a dare un'occhiata qui
L'importante alla fine è capirsi.
in data 11-06-2012 05:55 AM
Ecco perchè non mi tornava la dicitura "0x" non la conoscevo 🙂
comunque non funziona, siccome oltre all'acquisizione di quel dato, dalla seriale posso ricevere altri dati come temperatura, dati dal "data logger" ecc ecc, se metto come paletto che deve esserci un CR alla seriale può capitare che in caso di lettura errata non arrivi mai il CR per cui il vi mi rimane impallinato.
Per ricorstuire quella stringa dovrò provare altri modi, ad esempio se gliela faccio leggere con un intervallo maggiore può essere comunque che non sia sincronizzato con l'invio dei dati e quindi che venga comunque spezzettata random lo stesso...ti torna?
in data 11-06-2012 07:54 AM
'momento: il termination character deve funzionare insieme ad un adeguato timeout, da stabilire sulla base dei dispositivi che ci sono sulla linea. Il VISA Read dove terminare per il primo evento fra CR e/o timeout (è già cos' a meno che non forzi nessun timeout: leggi la documentazione). Alla fine del read devi sempre monitorare l'error out e ignorare il timeout (salvo eventualmente marcare quel particolare dispositivo come assente), mentre gli altri errori devono essere gestiti (fermare l'applicazione, informare l'utente... quello che ti sembra più opportuno).
Immagino che la modalità di trasmissione sia sempre un polling diretto (richiesta del programma - risposta del dispositivo), quindi puoi sempre identificare il dispositivo che non risponde e assegnare il relativo stato di funzionamento.
in data 11-06-2012 08:45 AM
Il problema sta proprio che per alcune istruzioni il flusso dati viene richiesto con un polling, mentre per altre come l'invio della lettura istantanea ogni secondo viene attivato con una istruzione ed interrotto con un'altra, per cui per leggere quel flusso dati bisogna mantenere aperta la lettura da seriale.
Invece l'istruzione che richiede i dati dal "data logger" fa un polling ma siccome in memoria ci possono essere i dati di una settimana intera lo scarico dell'intero buffer può richiedere anche 20 minuti, ed è per questo che non posso introdurre un timeout.
(a meno di non riuscire a settare parametro time out e carattere di fine riga per ogni istruzione che si manda con un property node, ci ho guardato ma credo non si possa perchè alcuni paramentri vanno settati alla configurazione della seriale in apertura).
in data 11-06-2012 09:14 AM
Ma mentre scarichi dal data logger non stai anche chiedendo gli altri dati, no? Quindi potresti isolare quel task e gestirlo a parte, eventualmente modificando i parametri della seriale tanto su un task di 20 minuti perdere anche mezzo secondo di configurazione è trascurabile.
Escludendo il data logger, quali altri messaggi scambi con l'esterno? Non puoi avere un dispositivo che manda messaggi in modo indipendente mescolato con uno interrogato in polling, altrimenti come distingui le risposte? E se si sovrappongono?