Problemas al leer datos de Arduino en Visual Basic

Hola, necesito ayuda con el siguiente tema.

Tengo un programa que he creado en Visual Basic, el cual me permite controlar un Arduino UNO R4 WiFi. Hasta este punto, todo bien. El problema que tengo es que necesito monitorear datos del Arduino en el programa, pero el programa no me los lee. He intentado varias formas, pero no logro encontrar solución.

En este momento no tengo acceso al código, pero en arduino sería algo así:

If(Serial.available()){
Char datos = Serial.read();
If(datos == 'A'){
digitalWrite(4, HIGH);
Serial.println("Luz encendida");
}
}

Y en el VB, sería algo así:

*Tengo un botón para enviar el comando:

"Botón encender luz"

serialPort1.write("A")

Y quiero ingresar el texto que manda Arduino en un textbox:

Dim mensaje as string 

mensaje = serialPort1.readLine()
textBox1.text = mensaje

Pero no me ingresa el mensaje en el textbox. Debo señalar que también probé con readExisting() y tampoco realiza la función. El tema de los baudios y el puerto está completamente correcto.

Cómo punto final, si pruebo con:

If mensaje is not nothing then 

Pasa la función, osea que detecta que hay algo en la variable, pero el textbox sigue saliendo en blanco.

Creo que es una pregunta mas adecuada para un foro de VB antes que este.
Lo primero es que publiques todo el código de arduino y no una parte.
Si lo que publicaste es lo que usas creo que eso no compila

Char datos = Serial.read();

Char no existe, en cambio char si.

Ahora veo que If tampoco compilaría porque corresponde if.
Revisa tu código.
Prueba con un programa terminal como Termite o similar.
Envia códigos como A y el arduino debería responder.
Luego has lo mismo en VB.

Claro. El codigo de arduino es:

char dato;
void setup(){
  Serial.begin(115200);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(6, OUTPUT);
 pinMode(7, OUTPUT);
 digitalWrite(6, HIGH);
}
  int e;
  int l;
  int r;
  int lr;
void loop(){
  if(Serial.available()){
  dato = Serial.read();
  if(dato == 'C'){
    if(e == 0){
      digitalWrite(6, LOW);
      digitalWrite(7, HIGH);
      e = 1;
      Serial.write("Conectado");
    } else {
      digitalWrite(6, HIGH);
      digitalWrite(7, LOW);
      e = 0;
    }
  }
  if(dato == 'L'){
    if(l == 1){
      digitalWrite(3, LOW);
      l = 0;
    } else {
      l = 1;
      digitalWrite(3, HIGH);
    }
  }
  if(dato == 'R'){
    if(r == 1){
      digitalWrite(4, LOW);
      r = 0;
    } else {
      digitalWrite(4, HIGH);
      r = 1;
    }
  }
  if(dato == 'LR'){
    if(lr == 1){
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      lr = 0;
    } else {
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      lr = 1;
    }
  }
  }

}

Como dije anteriormente, el control de Arduino funciona:

 if(dato == 'L'){
    if(l == 1){
      digitalWrite(3, LOW);
      l = 0;
    } else {
      l = 1;
      digitalWrite(3, HIGH);
    }
  }

Luego el Arduino envia una respuesta:

Serial.write("Conectado");

Pero el Vb no lo lee.

Y el codigo de vb es:


Public Class Form1
    Dim aks As String
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        btnDesconectar.Enabled = False
        ComboBox1.Items.AddRange({"LED", "RELE", "LED Y RELE"})
        ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
        SerialPort1.BaudRate = 115200
        SerialPort1.DataBits = 8
        SerialPort1.Parity = IO.Ports.Parity.None
        SerialPort1.StopBits = IO.Ports.StopBits.One
        SerialPort1.PortName = "COM7"
    End Sub
    Private Sub btnConectar_Click(sender As Object, e As EventArgs) Handles btnConectar.Click
        SerialPort1.Open()
        SerialPort1.Write("C")
        System.Threading.Thread.Sleep(200)
        TextBox1.Text = SerialPort1.ReadLine()
        btnConectar.Enabled = False
        btnDesconectar.Enabled = True

    End Sub

    Private Sub btnDesconectar_Click(sender As Object, e As EventArgs) Handles btnDesconectar.Click
        btnDesconectar.Enabled = False
        btnConectar.Enabled = True
        SerialPort1.Write("C")
        SerialPort1.Close()
    End Sub

    Private Sub btnEnviar_Click(sender As Object, e As EventArgs) Handles btnEnviar.Click
        If aks = "LED" Then
            If SerialPort1.IsOpen Then
                SerialPort1.Write("L")
                If rLe.Checked = True Then
                    rLe.Checked = False
                Else
                    rLe.Checked = True
                    rRe.Checked = False
                    rAM.Checked = False
                End If
            End If
        ElseIf aks = "RELE" Then
            If SerialPort1.IsOpen Then
                SerialPort1.Write("R")
                If rRe.Checked = True Then
                    rRe.Checked = False
                Else
                    rRe.Checked = True
                    rLe.Checked = False
                    rAM.Checked = False
                    Label1.Text = SerialPort1.ReadExisting
                End If
            End If
        ElseIf aks = "LED Y RELE" Then
            If SerialPort1.IsOpen Then
                SerialPort1.Write("LR")
                If rAM.Checked = True Then
                    rAM.Checked = False
                Else
                    rAM.Checked = True
                    rRe.Checked = False
                    rLe.Checked = False
                End If
            End If
        End If

    End Sub

Principalmente, es este codigo el que no me lee:

        SerialPort1.Open()
        SerialPort1.Write("C")
        System.Threading.Thread.Sleep(200)
        TextBox1.Text = SerialPort1.ReadLine()

dato es una variable tipo caracter, y puede contener solo un caracter, nunca puede contener dos caracteres, ademas Serial.read() devuelve solo un caracter entonces dato nunca va a ser igual "LR".

Agrego:
Antes que me respondas que funciona...
Parece que la opción "LR" funciona porque primero lee 'L' y entra en su condicional, luego en la siguiente pasada del loop() lee 'R' y entra en su condicional.

Por otro lado, supongo que es un error de tipeo pero el arduino solo devuelve "Conectado" cuando recibe 'C' y e = 0

Si, la verdad no lo había pensado así. Pero el problema que tengo no es con el control del Arduino. A lo que haces mención, es al control. El problema que tengo es con la lectura del mensaje en VB. De todas formas, agradezco la ayuda de ambos.

Claro, pero este es un foro de arduino y C, no de VB.

¿Seguro estás leyendo el puerto correcto?
Yo quedé en VB6 y las cosas se hacían de otro modo. :wink:

Con respecto al "Conectado", el Arduino solamente envía ese mensaje si se cumplen dos condiciones: 1°:

if (dato == 'C'){

Al conectarme al puerto COM7 (Puerto en dónde está conectado Arduino), el programa envía ese carácter.

2°:

if(e==0){

La variable "e" la uso para definir el estado de conexión, si "e" vale 1, significa que estoy conectado al puerto, por lo que, al desconectarme del puerto, vuelvo a enviar el mismo carácter, por lo cual el condicional detecta que no es 0, por lo tanto apaga el pin, enciende el otro y convierte la variable en 0.

Por lo demás, entiendo perfectamente que el problema que tengo corresponde más a un de VB, el problema es que lo que he encontrado no me da solución, por eso recurrí a este foro, de igual manera intentaré buscar ayuda en algún foro adicional de VB. Muchas gracias.

Yo entiendo perfectamente tu código de arduino, me acabas de explicar lo que ya te dije en el post anterior.

Por otro lado también te dije que me quedé en VB6 y no es la misma sintaxis sino con gusto te ayudaría.

Se me ocurrió lo del puerto porque podría ocurrir que Win2 lo reasigne al usar VB, aunque puede ser una burrada mía.
Tengo hecho un programita (en VB6) pero lee los puertos al iniciar y los muestra en un combobox para seleccionarlo manualmente. Como hace mucho que no lo uso, realmente no recuerdo si el puerto era el mismo que usaba la IDE o lo reasignaba, encima estoy de viaje y a 1800 km de mi PC.

¿Estas seguro que no debes utilizar Serial.print("Conectado")?
Serial.write("val") escribirá en el puerto una concatenación de Bytes sin fin de linea.

Con respecto al modelo de mi Arduino, vi en la una pagina que tiene dos procesadores, el procesador principal, un ARM Cortex M4, y un ESP32 S3. Por lo que vi, al escribir un programa, primero pasa por el ESP32 y luego va al procesador principal. ¿Puede esto estar dando problemas para comunicar mi Arduino con el PC? Toda la información pasa por el ESP32, incluso la información que intercambia.

.println() agrega final de línea, .print() no.

¿Dónde lo leíste?
Me interesa.
Porque según Arduino el ESP32 se encarga del WiFi y bluetooth y poco más que eso.

Con respecto a la página de dónde obtuve esa información, es:

Guía de modelos Arduino y sus características | Arduino UNO R4 Wifi | BricoGeek Lab

Desconozco si la información es 100% verídica, aunque por lo que ví, sus referencias son links oficiales de Arduino.

Finalizando este hilo, logré encontrar la solución a mi problema.

Lo que hice, fue poner en el codigo del botón con el que me conecto al puerto:

Private Sub btnConectar_Click(sender As Object, e As EventArgs) Handles btnConectar.Click
        SerialPort1.Open()
        SerialPort1.Write("C")
        System.Threading.Thread.Sleep(200)
        TextBox1.Text = SerialPort1.ReadLine()
        btnConectar.Enabled = False
        btnDesconectar.Enabled = True

Elimino:

System.Threading.Thread.Sleep(200)
TextBox1.Text = SerialPort1.ReadLine()

Y le agregué lo siguiente:

SerialPort1.DtrEnable = True
SerialPort1.RtsEnable = True

Luego de esto, pude recibir información desde el Arduino hacia el PC. La verdad desconozco la razón del problema.

Espero esto pueda servir de ayuda para quien tenga el mismo problema. Entiendo perfectamente que este es un foro de Arduino y no de Visual Basic, pido la disculpas pertinentes. Agradezco la ayuda de todos. Muchas gracias.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.