Salve a tutti, una decina di anni fa avevo imparato abbastanza bene visual basic 6 ma in questi anni mi sono dedicato più alle riparazioni che alla programmazione, da qualche mese ho acquistato Arduino e non riesco più a staccarmici, ho ripreso in mano visual basic, che intanto è arrivato alla versione 2010 e ho cominciato a sperimentare.
Ho creato un semplice programma che visualizza cio che viene ricevuto dalla porta seriale e che invia una stringa sempre via seriale ad Arduino, il problema è che non riesco a visualizzare in una label ciò che ricevo dalla seriale fino a che non ricevo il timeout, ricevendo sulla label la stringa del timeout correttamente ho iniziato a pensare che il problema sia nell'acquisizione dei dati.
Vi posto il codice completo creato con visualbasic 2010 express:
Public Class Form1
'questo programma invia e riceve dati alla seriale selezionata, base per partire con comunicazione arduino
Dim comselect As String
Sub GetSerialPortNames()
' Show all available COM ports.
cbxcomsel.Items.Clear()
For Each sp As String In My.Computer.Ports.SerialPortNames
cbxcomsel.Items.Add(sp)
Next
End Sub
Function ReceiveSerialData() As String
' Receive strings from a serial port.
Dim returnStr As String = ""
Dim com1 As IO.Ports.SerialPort = Nothing
Try
com1 = My.Computer.Ports.OpenSerialPort(comselect)
com1.BaudRate = 9600
com1.ReadTimeout = 10000
Do
Dim Incoming As String = com1.ReadLine()
If Incoming Is Nothing Then
Exit Do
Else
returnStr &= Incoming & vbCrLf
End If
Loop
Catch ex As TimeoutException
returnStr = "Error: Serial Port read timed out."
tmrrec.Stop() 'blocca il timer per la ricezione altrimenti manda in blocco l'app
Finally
If com1 IsNot Nothing Then com1.Close()
End Try
Return returnStr
End Function
Sub SendSerialData(ByVal data As String)
' Send strings to a serial port.
Using com1 As IO.Ports.SerialPort =
My.Computer.Ports.OpenSerialPort(comselect)
com1.WriteLine(data)
End Using
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
GetSerialPortNames()
End Sub
Private Sub cmdserialupd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdserialupd.Click
GetSerialPortNames()
End Sub
Private Sub cbxcomsel_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbxcomsel.SelectedIndexChanged
comselect = cbxcomsel.SelectedItem
End Sub
Private Sub cmdsnddata_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdsnddata.Click
SendSerialData(txtsenddata.Text)
End Sub
Private Sub tmrrec_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrrec.Tick
lbldatareceive.Text = ReceiveSerialData()
End Sub
Private Sub cmdactrec_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdactrec.Click
tmrrec.Start()
End Sub
Questo invece è la funzione dove credo che sia il problema:
Function ReceiveSerialData() As String
' Receive strings from a serial port.
Dim returnStr As String = ""
Dim com1 As IO.Ports.SerialPort = Nothing
Try
com1 = My.Computer.Ports.OpenSerialPort(comselect)
com1.BaudRate = 9600
com1.ReadTimeout = 10000
Do
Dim Incoming As String = com1.ReadLine()
If Incoming Is Nothing Then
Exit Do
Else
returnStr &= Incoming & vbCrLf
End If
Loop
Catch ex As TimeoutException
returnStr = "Error: Serial Port read timed out."
tmrrec.Stop() 'blocca il timer per la ricezione altrimenti manda in blocco l'app
Finally
If com1 IsNot Nothing Then com1.Close()
End Try
Return returnStr
End Function
Grazie a tutti in anticipo per l'aiuto