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