Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Allora, partiamo con ordine,
- sia arduino e vb hanno il ;
- B; ha come valore che va da 0 a 360 gradi con i decimali.
-P; ha come valore che va da 0 a 100 x il livello del volume numeri interi senza decimali.
Per il resto non so neanche che sia tryparse, mai visto e mai usato. Posso cercare di modificare il codice di arduino per inviare B; con numeri interi ma non so quanto possa servire se nel codice di vb si è messo la sostituzione del punto con la , decimale.
Ok non lo sai fare.
Ecco il codice da mettere nel timer (leggi i rem):
Codice sorgente - presumibilmente VB.NET
PrivateSub Timer2_Tick(sender AsObject, e As EventArgs)Handles Timer2.Tick
DimstrAsString
str= RiceviDati()
TextBox1.Text+=str' tuo monitor
Dim valoriDivisi()AsString' matrice senza dimensione
valoriDivisi =str.Split(";")' puntovirgola separa le stringhe: in valoriDivisi(0) ci va il codice identificativo (B = gradi bussola, P = potenziometro, N = null, E = errore) e in valoriDivisi(1) ci va il valore relativo
If valoriDivisi.Length <> 2 ThenExitSub' se str non è stato diviso in due stringhe si esce
If valoriDivisi(0)="B"Then
' Il dato è riferito ai gradi della bussola
' se la conversione è possibile avanzamento prende il valore dei primi tre caratteri della stringa
' possibili usi degli errori ritornati se ometti li ignori
If valoriDivisi(0)="N"Then
' Il dato è riferito a nessun valore ricevuto
lblgradi.Text= valoriDivisi(1)' l'info su lblgradi, oppure dove vuoi
EndIf
If valoriDivisi(0)="E"Then
' Il dato è riferito a errore sulla seriale
lblgradi.Text= valoriDivisi(1)' il tipo d'errore su lblgradi, oppure dove vuoi
EndIf
Label1.Text="NORD"
EndSub
Questo deve migliorare la situazione, non dovresti più avere errori.
Per il discorso codice arduino te l'ho modificato per provarlo l'ho postato alle 9:57 di Sabato 23/03/2024.
Prima provalo e controlla i valori che vedi in textBox1, fammi sapere.
ho provato il codice di arduino e i valori che escono sono
?;0
se agisco sul potenziometro ho ?;36 e cosi via, ma al posto dei gradi ho solo un ?
ho notato anche che se non tocco il potenziometro questo mi da come valore 0, anzicchè rimare sul valore attuale
qui è dove ho provato il tutto
https://wokwi.com/projects/393465051178897409
Ultima modifica effettuata da nightwolf il 27/03/2024 alle 0:40
ho notato anche che se non tocco il potenziometro questo mi da come valore 0, anzicchè rimare sul valore attuale
qui è dove ho provato il tutto
https://wokwi.com/projects/393465051178897409
Certo, il codice del volume deve filtrare i dati ricevuti.
Riguardando il tuo codice, semplificherei ulteriormente, perché mi sembra vantaggioso inviare i dati nella seriale in un colpo solo, gli identificativi non servono più e i valori li identifichi in base alla posizione (già accennato), ho scritto un esempio in C che ti dovrebbe chiarire il concetto, inoltre puoi provare il codice su: https://www.onlinegdb.com/online_c_compiler
Codice sorgente - presumibilmente C#
#include <stdio.h>
void bussola(char*outBussola)
{
float headingDegrees =320.5;// gradi di esempio tu li prenderai dal magnetometro
sprintf(outBussola, "%.2f", headingDegrees);// converte in stringa con 2 cifre decimali
}
void loop(){
char outBussola[8];// conterrà la stringa creata in bussola()
bussola(outBussola);// richiama la routine che legge i gradi
char outBuf[20];// spazio per la stringa d'uscita
int val =10;// volume a 10, tu lo prenderai dal potenziometro
sprintf(outBuf, "%s;%d", outBussola, val);// concatena i due valori separati da puntovirgola
printf("%s\n", outBuf);// check stringa da inviare
//Serial.println(outBuf); // tu invece invii alla seriale
}
int main()
{
loop();// richiama la routine una volta, tu tutte le volte che vuoi
return0;
}
in questo modo invii:
320.50;10
in VB tutto si semplifica e un timer è sufficiente:
Codice sorgente - presumibilmente VB.NET
PrivateSub Timer2_Tick(sender AsObject, e As EventArgs)Handles Timer2.Tick
DimstrAsString
str= RiceviDati()
Dim valoriDivisi()AsString' matrice senza dimensione
valoriDivisi =str.Split(";")' il puntoevirgola separa le stringe: in valoriDivisi(0) ci vanno i gradi bussola e in valoriDivisi(1) ci va il volume
If valoriDivisi(0)="E"Then
lblgradi.Text="errore"
' in valoriDivisi(1) ' il tipo d'errore da mostrare dove vuoi
else
' Il primo dato è riferito ai gradi della bussola
valoriDivisi(0)= valoriDivisi(0).Replace(".", ",")' se ci fosse il punto decimale viene sostituito con la virgola decimale
avanzamento =CInt(valoriDivisi(0))
Label1.Text= avanzamento.ToString("000°")
PictureBox1.Invalidate()' scatena il paint
' Il dato in: valoriDivisi(1), è riferito al volume e è una stringa
Naturalmente non ho provato nulla, se c'è qualche svista perdonami.
Buongiorno, ho rimesso questo codice nel vb, visto che dalla seriale adesso esce un unica stringa
320.20;36
Soltanto che mi da sempre l errore sulla stringa, dal codice adesso i valori ricevuti vengono splittati e messi in due array che sono valoriDivisi(0) e valoriDivisi(1). Perché mi da l errore sulla stringa, prima potevo capire che poteva essere la ricezione di B o P, ma adesso non ci sono più.
Ps. La ricezione è giusta perché dalla textbox1 si riceve tutto
Senza il debugger è impossibile capire dove hai il problema.
1) Mette un breakpoint subito dopo che i dati vengono letti.
2) Controlla la variabile ed il suo contenuto.
3) Controlla come vengono splittati
4) Controlla gli array
5) Sei apposto.
Segui questi passaggi in uno di questi punti deve esserci un problema.
non so se è giusto come ho fatto su quello che mi hai detto, questo è la schermata della variabile globale e delle relative array, mi sembra giusto, la varfiabile globale riceve entrambi i valori e dopo le rispettive array hanno valoriDivisi(0) il valore del magnetometro e valoriDivisi(1) il valore del potenziometro.
ps. ho ritoccato il codice di arduino cosi da inviare alla seriale soltanto numeri interi del magnetometro, senza decimali.
ho provato ad andare step by step, togliendo la parte di codice che riguarda il volume, il programma funziona senza nessun errore, ma la bussola non si muove, quando vado ad inserire la parte di codice riguardante valoriDivisi(1), quest ultimo è come se memorizzasse valoreDivisi(0) senza splittarlo.