Paso 4: Añadir la comunicación serial de VB.NET
Básicamente es una interfaz simple, no es difícil darse cuenta y hay un montón de tutoriales acerca de esto. Sin embargo quiero compartir mi propia versión con algunas explicaciones.
Esta función te muestra todos los puertos COM disponibles y los muestra en un ComboBox. Se puede usar ButtonConnect hasta hay no hay puertos COM disponibles.
Sub refreshCOM() ComboBox_COM.Items.Clear() For Each sp As String In My.Computer.Ports.SerialPortNames ComboBox_COM.Items.Add(sp) Next If ComboBox_COM.Items.Count = 0 Then Else ComboBox_COM.Text = ComboBox_COM.Items.Item(0).ToString End If If ComboBox_COM.Text = "" Then ButtonConnect.Enabled = False Else ButtonConnect.Enabled = True End If End Sub
Configuración de puerto serie con DTR deshabilitar para Arduino espera hasta PC correctamente abre el puerto.
Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load refreshCOM() SerialPort1.Close() SerialPort1.DataBits = 8 SerialPort1.Parity = Parity.None SerialPort1.StopBits = StopBits.One SerialPort1.Handshake = Handshake.None SerialPort1.Encoding = System.Text.Encoding.Default SerialPort1.DtrEnable = False End Sub
Por último podemos intentar conectar con el puerto serie y, si nada sale mal, podemos habilitar el DTR. Tengo algunos problemas en la comunicación de Bluetooth: parece que Arduino no espera para el DTR que permite... Creo que es debido a una falta conexión entre mi tablero de BT y Linvor transceptor.
Private Sub ButtonConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonConnect.Click SerialPort1.Close() SerialPort1.PortName = ComboBox_COM.Text.ToString SerialPort1.BaudRate = ComboBox_BAUD.Text Try SerialPort1.Open() Catch ex As Exception MsgBox("Error during shield connection.") End Try If SerialPort1.IsOpen Then TextBox1.Clear() Label2.Enabled = True MaskedTextBox1.Enabled = True ButtonSetSpeed.Enabled = True SerialPort1.DiscardInBuffer() SerialPort1.DtrEnable = True Else Label2.Enabled = False MaskedTextBox1.Enabled = False ButtonSetSpeed.Enabled = False End If End Sub
Se trata de método, de lectura de puerto serial el programa también refrescará valores GUI en el StatusStrip y le da las cadenas raws en un cuadro de texto dedicado (para depuración rápida al aire libre).
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Try Dim line As String = SerialPort1.ReadLine TextBox1.Invoke(New ReadSerialDelegate(AddressOf ReadSerial), line.ToString) Catch ex As Exception SerialPort1.Close() End Try End Sub Delegate Sub ReadSerialDelegate(ByVal s As String) Public Sub ReadSerial(ByVal s As String) TextBox1.Text += s + vbNewLine TextBox1.SelectionStart = TextBox1.Text.Length - 1 TextBox1.ScrollToCaret() If s.Contains("charge") Then Label_Battery.Text = s.Substring(s.Length - 4, 3) ElseIf s.Contains("speed") Then Label_Speed.Text = s.Substring(s.Length - 4, 3) End If End Sub
Método es muy simple de la escritura, no dedico palabras con él.
Private Sub ButtonSetSpeed_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonSetSpeed.Click Try SerialPort1.Write(MaskedTextBox1.Text) Label_Speed.Text = MaskedTextBox1.Text Catch ex As Exception MsgBox(vbInformation, "Unable to write at " + SerialPort1.PortName) End Try End Sub
Así que ahora tenemos un código de huesos desnudo para manejar todo de la comunicación serial.