Italian B4A ... ricezione seriale Arduino

marco.canta

Active Member
Licensed User
Longtime User
Buongiorno, dopo svariate provo mi sono blocca, e chiedo il vostro aiuto.
Il progetto prevede di ricevere dati seriale da uno schedino Arduino che tramite cavo USB è collegato ad un BoxTV Android. Il programma deve monitorizzare dei dati ricevuti, arduino invia una stringa di 12 caratteri ogni qualvolta ha delle informazioni da comunicare. Testato con l IDE arduino e monitor seriale i dati arrivano sempre perfettamente. Con la versione Android .... non molto, a volte lo divide in due o tre stringhe da pochi caratteri, a volte non arrivano tutti a volte si.
Ho provato sia la libreria jSerial che la felUsbSerial ... ma non cambia nulla. Attualmente uso la jSerial.
Qualche consiglio ?

B4X:
Sub AStream_NewData (Buffer() As Byte)
   Dim ValRX as String
    ValRX = BytesToString(Buffer, 0, Buffer.Length, "UTF8")
    Log(ValRX)
End Sub
 

sirjo66

Well-Known Member
Licensed User
Longtime User
innanzitutto bisogna essere sicuri che Arduino trasmetta i dati in formato UTF8, se sono solo caratteri stampabili non dovrebbero esserci problemi, ma se ci sono anche caratteri speciali o se la trasmissione è su dati binari questo può essere un problema.

Secondo me però il problema è che il sistema è più veloce di quello che pensi tu, e quindi nel momento in cui Arduino trasmette 12 caratteri, in realtà la Sub AStream_NewData viene chiamata due volte (o anche più) ad esempio viene chiamata una prima volta per dirti che ha ricevuto 7 caratteri e poi viene richiamata per dirti che ne ha ricevuti altri 5.

Vedo però che hai (giustamente) fatto il LOG, per cui tu nel LOG cosa vedi ??

Sicuro che i dati ricevuti sono tutti stampabili ???

Sergio
 

micro

Well-Known Member
Licensed User
Longtime User
Ciao Marco
premesso che è da qualche anno che non programmo più su Android (ormai sono su B4j) se la stringa
contiene il terminatore CRLF (chr(13) e chr(10)) o uno dei due ti consiglio di usare la classe di Erel
AsyncSteamsText che penso ci sia anche per Android.
Si affianca automaticamente alla libreria Astream e risulta migliore per gestire le stringhe.
Avrai quindi come Sub per gestire l'evento di cattura AStream_NewText(Text as String) e non più
AStream_NewData (Buffer() As Byte).

Prova, non ti costa nulla.
 

marco.canta

Active Member
Licensed User
Longtime User
Grazie ad entrambi. Anche io a dire il vero ho abbandonato un po B4A e lavoro molto su B4J.
La scritta è composta solo da caratteri leggibili es: "A12345678HHD" ma come dice Sirjio66 credo che sia troppo veloce il sistema, e qui mi nasce una domanda, ma se invece di lavorare a 9600 lavorassi a 115000 potrebbe migliorare ?
Ottimo anche il suggerimento di micro ... proverò subito la libreria AsyncSteamsText.
 

micro

Well-Known Member
Licensed User
Longtime User
Il problema della velocità non deve essere un problema e si può raggirare con artefici tantè che Erel con il suo modulo
e riferendosi proprio ai terminatori (CRLF) utilizza l'append della classe StringBuilder così accoda tutti i byte ricevuti
e sei sicuro di ricevere quello che ti aspetti..
Se usi altri metodi e sai quanto deve essere lunga la stringa puoi fare il ceck su questa anche perchè in qualsiasi
comunicazione asincrona ci deve essere per forza un carattere di sincronismo (il primo) ed uno di fine stringa.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
esatto, micro ha proprio ragione
devi controllare come è composta la stringa che ricevi, c'è un carattere di inizio trasmissione e/o un carattere di fine trasmissione ??
oppure sai che sono 12 caratteri e basta ??
 

marco.canta

Active Member
Licensed User
Longtime User
In realtà so solo che sono 12 caratteri, se se funzionerebbe meglio con carattere inizio e fine stringa , li posso inserire.
Quali caratteri mi converrebbe inserire come inizio/fine ?

Grazie
 

sirjo66

Well-Known Member
Licensed User
Longtime User
se vuoi restare sui caratteri stampabili puoi usare (ad esempio) @ per inizio trasmissione e # per fine trasmissione, ma puoi usare quello che vuoi
 

marco.canta

Active Member
Licensed User
Longtime User
Buongiorno ... tornato dalle ferie, mi ritrovo a combattere con questo vecchio dilemma.

Diciamo che seguendo i consigli, ho inserito nella stringa di trasmissione dati un carattere di inizio e fine Stringa, ora il problema è che non riesco a leggere i singoli caratteri che arrivano sulla seriale per identificare se è inizio fine o dati da concatenare.
Come scritto ad inizio poste usavo un procedura che leggeva una stringa intera di dati ricevuti, come faccio a ricevere i singoli caratteri ??

Grazie !!!
Marco
 
Top