Ver Mensaje Individual
  #1  
Antiguo 06-08-2021
Franciscogc1988 Franciscogc1988 is offline
Registrado
 
Registrado: ago 2021
Posts: 6
Reputación: 0
Franciscogc1988 Va por buen camino
Exclamation ComPort RxChar, Delphi vs Arduino (byte de lectura)

Buenas noches,
estoy programando un modulo MPU6050 para calcular los ángulos de giro en e pilotaje de una avión RC,

Ya tengo el código generado en Arduino y me devuelve correctamente en el monitor serie,
respecto a Delphi, estoy intentando leer los valores a través de las librerías comport y imprimir en un memo, el problema es que no recibo correctamente la cadena de texto, se come caracteres.

he estado indagando y debe tener alguna relacion con la velocidad de lectura de los bytes, al aumentar los BaudRate, parece que mejora, pero aun poniéndolos al máximo, sigue generando problemas.

he intentado también ponerle un sleep(70) después de la impresión en el memo, para darle tiempo a leer la cadena entera al buffer, pero sigue sin ser la solución definitiva., alguna sugerencia?

Codigo arduino:
Cita:
#include <I2Cdev.h>
#include <helper_3dmath.h>
#include <MPU6050.h>
#include <Wire.h>

const int mpuAddress = 0x68; // Puede ser 0x68 o 0x69
MPU6050 mpu(mpuAddress);
int ax, ay, az;
int gx, gy, gz;
void setup()
{
Serial.begin(9600);
Wire.begin();
mpu.initialize();
Serial.println(mpu.testConnection() ? F("IMU iniciado correctamente") : F("Error al iniciar IMU"));
}
void loop()
{
// Leer las aceleraciones
mpu.getAcceleration(&ax, &ay, &az);
//Calcular los angulos de inclinacion
float accel_ang_x = atan(ax / sqrt(pow(ay, 2) + pow(az, 2)))*(180.0 / 3.14);
float accel_ang_y = atan(ay / sqrt(pow(ax, 2) + pow(az, 2)))*(180.0 / 3.14);
//Mostrar resultados
Serial.print(("X:"));
Serial.print(accel_ang_x);
Serial.print(("/"));
Serial.print(("Y:"));
Serial.println(accel_ang_y);
delay(100);
}
ejemplo resultado monitor serie arduino:
X:32.60/Y:-6.03
X:32.75/Y:-6.18
X:32.63/Y:-6.15
X:32.81/Y:-5.93


Codigo Delphi:
Cita:
procedure TForm1.Button1Click(Sender: TObject);
begin
comport1.Port:='COM3';
comport1.BaudRate:=br9600;
try
comport1.Open;
if comport1.Connected then
begin
memo1.Text:=memo1.Text+'conexion serial establecida con exito('+comport1.Port+')';
memo1.Lines.Add('');
end
else
begin
memo1.Text:=memo1.Text+'ERROR en conexion serial';
end;
finally
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
comport1.Close;
memo1.Text:=memo1.Text+'conexion cerrada';
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
comport1.ShowSetupDialog;
end;

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
Str: String;
begin
// Recibe mensajes desde Arduino.
ComPort1.ReadStr(Str, comport1.InputCount);
sleep(70);
// Muestra los mensaj,es en pantalla.
MEMO1.Lines.Add( Str );
end;
ejemplo resultado memo Delphi:

X:32
.88/Y:-6.01

X:3
2.76/Y:-5.85

X
:32.80/Y:-6.14

X:32
.69/Y:-6.28

X:
32.89/Y:-5.91




Agradecido x la ayuda!
Responder Con Cita