Salve, ho realizzato un programma per monitorare tramite PC alcune variabili di sensori collegati ad Arduino. Per fare questo ho realizzato, lato Arduino, questa funzione:
void comunica()
{
if (Serial.available() > 0)
{
Stringa = Serial.read();
if (Stringa == 'T')
{
Serial.println(dstm, 1);
Serial.println(tmpr, 1);
Serial.println(umid, 1);
Serial.println(indc, 1);
Serial.println(ftrs, 0);
Serial.println(bzonoff);
}
if (Stringa == 'B')
{
bzonoff = !bzonoff;
}
}
}
In pratica, inviando il carattere 'T', Arduino trasmette sulla seriale le 6 variabili indicate. Inviando invece il carattere 'B' la variabile bzonoff viene negata.
Verificando con il monitor seriale di Arduino, tutto funziona perfettamente.
Il problema si presenta con Visual Basic.
Nel Timer ho scritto queste istruzioni
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
If ToR = 0 Then
SerialPort1.Write("T")
tmprf = tmprc * 9 / 5 + 32
tmprk = tmprc + 273.15
Label1.Text = dstm & " cm"
Label2.Text = tmprc & " °C"
Label3.Text = umid & " %"
Label4.Text = indc & " °C"
Label5.Text = ftrs & " mV"
Label7.Text = tmprf & " °F"
Label8.Text = tmprk & " K"
If bzonoff = 0 Then
PictureBox1.Image = My.Resources.ON01
Label13.Text = "DISABILITA BUZZER"
Else
PictureBox1.Image = My.Resources.OFF01
Label13.Text = "ABILITA BUZZER"
End If
ElseIf ToR = 1 Then
SerialPort1.Write("B")
ToR = 0
End If
End Sub
La variabile ToR (trasmette o riceve) vale sempre "0" e il programma, inviando il carattere "T", riceve i dati correttamente che visualizza sulle varie Label senza problemi.
Se clicco su una PictureBox e assegno a ToR il valore "1" il programma dovrebbe inviare sulla seriale il carattere "B"
Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
ToR = 1
End Sub
Questo purtroppo non avviene, o meglio avviene sporadicamente e dopo molto tempo non compatibile con la velocità di comunicazione impostata a 115200.
Non può trattarsi di un problema di buffer pieno in quanto il Timer ha un ritardo di 100 ms tra un evento e l'altro e quindi a conti fatti riuscerebbe ad inviare circa 1400 caratteri per volta mentre le mie 6 variabili sono equivalenti a meno di 30 caratteri.
Il codice di lettura è questo
Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Stringa = SerialPort1.ReadLine()
dstm = Val(Stringa)
Stringa = SerialPort1.ReadLine()
tmprc = Val(Stringa)
Stringa = SerialPort1.ReadLine()
umid = Val(Stringa)
Stringa = SerialPort1.ReadLine()
indc = Val(Stringa)
Stringa = SerialPort1.ReadLine()
ftrs = Val(Stringa)
Stringa = SerialPort1.ReadLine()
bzonoff = Val(Stringa)
End Sub
Ringrazio anticipatamente chi vorrà aiutarmi.
Carlo Calò


