es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué tarda Arduino en recibir datos de Visual Basic.NET?

Este es el código Arduino para el receptor:

void loop() {

  int dir = Serial.read();
  if (dir == 'A') {
    Motors();
  }

  if (dir == 'B') {
    Zero();
  }

}

y este es el código Visual Basic.NET:

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If Button1.Enabled = True Then
            SerialPort1.Open()
            SerialPort1.Write("A")
            SerialPort1.Write(txtAngle1Mr.Text + Chr(13))
            SerialPort1.Close()
        End If
    End Sub

Cuando hago clic en el botón, mi programa escribe “A” en SERIAL
Y si escribe “A” EN SERIE
Arduino ejecutará la función “Motors”

Arduino se está retrasando para recibir datos de Visual Basic.NET y ejecutar la función “Motors”.

Arduino ejecuta la función “Motors”, pero se está retrasando.

¿Por qué se está retrasando Arduino?
¿Y cómo puedo solucionarlo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual hay una demora en Arduino es porque la comunicación serial es sincrónica, y Arduino está esperando a recibir todo el mensaje antes de ejecutar la función Motores. Esto puede causar demoras en el bucle que está esperando todo el mensaje, incluyendo el texto “txtAngle1Mr.Text + Chr(13)”.

    Para solucionar este problema, puede agregar un comando de tiempo límite serial al código de Arduino, que establece un tiempo máximo para esperar a que llegue el mensaje completo. De esta manera, si no se recibe el mensaje completo dentro del plazo especificado, el bucle seguirá ejecutando y ejecutando la función Motores.

    Para agregar un comando de tiempo límite al código de Arduino, puede modificar el código de la siguiente manera:

    void loop() {
      if (Serial.available() > 0) { // verificar si hay datos disponibles
        String dir = Serial.readStringUntil('\n'); // leer datos hasta final de línea
        if (dir == "A") {
          Motores();
        }
        else if (dir == "B") {
          Cero();
        }
      }
    }
    

    Al usar la función readStringUntil y especificar ‘\n’ como final de línea, el Arduino esperará a que los datos lleguen hasta que se detecte el carácter final de línea o hasta que se produzca un tiempo de espera.

    También puede modificar el código de Visual Basic.NET para agregar una demora antes de enviar los datos de texto para darle al Arduino más tiempo para procesar el mensaje anterior.

    Aquí hay un ejemplo de cómo puede modificar el código de Visual Basic.NET:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If Button1.Enabled = True Then
            SerialPort1.Open()
            SerialPort1.Write("A")
            Thread.Sleep(50) // agregar una demora de 50ms
            SerialPort1.Write(txtAngle1Mr.Text + Chr(13))
            SerialPort1.Close()
        End If
    End Sub
    

    Al agregar una breve demora después de enviar el comando “A”, le da al Arduino tiempo para procesar el mensaje antes de recibir los datos de texto.

    En general, agregar un tiempo límite y una pequeña demora al código puede ayudar a evitar retrasos en la comunicación y asegurar que el Arduino ejecute la función de Motores de manera oportuna.

Comments are closed.