inviare stringhe tramite seriale da microcontrollore bx24 a pc e viceversa

Jun 04, 2008 1 Replies

ciao a tutti ho creato una tastiera contenente dei tasti e display. questa tastiera (che =E8 montata su breadboard) =E8 provvista di un microcontrollore che deve inviare dati al pc tramite seriale e ascoltare i dati in arrivo. Quando un pulsante sulla tastiera viene premuto il micro invia una stringa al pc con scritto quale tasto =E8 premuto (e fino qui tutto bene, funziona tutto) , il problema arriva quando il micro deve ascoltare i dati in arrivo dal computer (il computer periodicamente deve inviare una stringa per aggiornare i dati dei display), infatti in alcuni casi sui display vengono visualizzati i dati giusti, in altri casi no, ma comunque sia, in entrambi i casi subito dopo avere ricevuto il dato il micro si blocca e non rileva pi=F9 neanche i tasti premuti e l'unico modo per farlo rifunzionare =E8 quello di staccare e rimettere la batteria. Se invece faccio in modo che il computer non invii nessun dato il tutto funziona correttamente. Credo che il problema si nel programma che ho scritto per il micro (che =E8 un bx24 programmabile in picBasic). Ecco il programma:



 =2E........... =2E........... =2E.........

dim dato as string



dim inputBuffer(1 to 7) as byte ' buffer per dati in ingresso dim outputBuffer(1 to 30) as byte ' buffer per i dati in uscita



Public Sub Main()



call openqueue (inputBuffer, 7) ' apre la coda per i dati in ingresso call openqueue (outputBuffer, 30) ' apre la coda per i dati in uscita call opencom (1, 9600, inputBuffer, outputBuffer) 'instaura la connessione



.,...... ......... ......... call estrapolaNumero()



End Sub


private sub estrapolaNumero()



dim I as integer dim numero as single dim stato as boolean dim timeOut as boolean dim datoChar as byte


do ' verifica se un tasto =E8 stato premuto, se si invia una stringa alla seriale



if (getpin(12) =3D 0) then call putQueueStr (outputBuffer, "sinistra" & chr(10)) end if



if (getpin(11) =3D 0) then call putQueueStr (outputBuffer, "su" & chr(10)) end if



if (getpin(10) =3D 0) then call putQueueStr (outputBuffer, "giu" & chr(10)) end if



if (getpin(9) =3D 0) then call putQueueStr (outputBuffer, "destra" & chr(10)) end if



'fine controllo tasti



' verifica se sono presenti 6 caratteri in inputBuffer (6 caratteri xk=E8 ho 6 display e quindi devo ricevere 6 numeri) , credo che il problema sia in questo blocco di codice if (getQueueCount(inputBuffer) =3D 6) then



for I =3D 1 to 6



if (I =3D 1) then dato =3D "" end if ' legge carattere per carattere i dati in inputBuffer e li deposita in datoChar, se dopo 1.5 millisecondi non riceve nessun dato passa oltre call getQueue(inputBuffer, datoChar, 1, 1.5E-3, timeOut)



dato =3D dato & chr(datoChar)



next



'esamina carattere per carattere la variabile "dato" e invia il carattere convertito in numero alla funzione VisualizzaNumero che lo invier=E0 ai vari display for I =3D 1 to len(dato) call ValueS(mid(dato,I,1), numero, stato) call visualizzaNumero(cInt(numero), I) next



end if



call sleep(0.01)



loop



End Sub



spero che qualcuno mi possa aiutare grazie in anticipo :) luca


snipped-for-privacy@gmail.com ha scritto:

Di solito conviene ricevere carattere per carattere e aggiungerlo al buffer. Inoltre se non ho capito male non hai caratteri di sincronizzazione e quindi se ne perdi uno non sai più dove metterlo... Io di solito definisco un carattere di inizio pacchetto (es. '$') che mi permette di inizializzare l'indice del buffer. Da quel momento conto 6 caratteri (o aspetto il terminatore nel caso i pacchetti hanno lunghezza variabile).

se devi inizializzare la stringa conviene mettere semplicemente dato = "" prima del ciclo così il test viene eseguito una sola volta.

mmm, questo no mi è chiaro. Se hai verificato prima che hai 6 caratteri nel buffer perché usare il timeout? E in ogni caso se il timeout scadesse come gestisci la situazione?

Se ben ricordo la & nel basic non è un AND logico ma l'operatore per concatenare le stringhe, giusto?

Ti conviene inviare un dato numerico, convertirlo in stringa e riconvertilo nuovamente in numero? Forse è più semplice (e veloce) ricevere i sei caratteri in un array numerico anziché testuale.

Ad ogni modo per isolare il problema del blocco, prova a commentare tutto il codice e poi ad abilitare un'istruzione alla volta così da trovare quella incriminata.

Ciao! Marco / iw2nzm

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required