Pages: [1]   Go Down
Author Topic: comunicacion serial USB arduino mega con C#  (Read 2083 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

he creado una interfaz en C# que recoge 5 datos (peso, altura, edad, genero, tiempo de muestreo) del teclado los manda a arduino, este opera con esos datos y devuelve el resultado a c# que me los muestrea en una grafica.
nno consigo qe arduino me reciba los 5 datos correctamente, no entiendo como se mandan y se reciben datos por puerto serial USB, tengo entendido que unicamente  se pueden mandar como char o como byte, aki les dejo ambos codigos, he intentado muchas formas y no se me ocurre mas nada. no les puedo adjuntar mis codigos ya que exceden lo maximo permitido de caracteres del foro.


Logged

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 747
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

deja el código
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Fijense unicamente en la parte del codigo que trata de la comunicacion, el resto del codigo trata de representar el modelo de un paciente anestesiado durante una intervencion quirurgica.
 
CODIGO DE ARDUINO
Code:
#include <stdlib.h>
#include <stdio.h>

double m=1.0;     //la escala
int WT=2;      //peso del paciente en kg
byte HT=2;     //altura del paciente en cm
byte Age= 2;    //edad del paciente
byte Gender=2; //Género del paciente, 1 si es mujer, 0 si es hombre
byte t= 2;      // periodo de muestreo en segundoscahr
char MARCA='254';
float tiempo;
//variables del modelo
float bisref=0.0;
float Kp=0.0;
float Ki=0.0;
float alfa=0.0;
float beta=0.0;
float bis0=0.0;
float bismin=0.0;
float ec50=0.0;
float g=0.0;
float LBM=0.0;
float V1=0.0;
float V2=0.0;
float V3=0.0;
float CL1=0.0;
float CL2=0.0;
float CL3=0.0;
float k12=0.0;
float k13=0.0;
float k21=0.0;
float k31=0.0;
float k10=0.0;
float ke0=0.0;
float a1=0.0;
float a2=0.0;
float a3=0.0;
float a4=0.0;
float a5=0.0;
float a6=0.0;
float a7=0.0;
float a8=0.0;
float Q11=0.0;
float Q12=0.0;
float Q13=0.0;
float Q14=0.0;
float Q21=0.0;
float Q22=0.0;
float Q23=0.0;
float Q24=0.0;
float Q31=0.0;
float Q32=0.0;
float Q33=0.0;
float Q34=0.0;
float Q41=0.0;
float Q42=0.0;
float Q43=0.0;
float Q44=0.0;
  

void setup() {
  
   Serial.begin(9600);
  Serial.flush();
}
void serialEvent(){
  
  WT= Serial.read();
  
}
void loop(){
    Serial.flush();
    
    while (MARCA=='254'){
    MARCA=Serial.read();}
    MARCA='254';
   /* Serial.flush();  
    while (WT==2){
      WT= Serial.read();
    }
     Serial.print('y');*/  
    
    /*
      while (HT==2){
      HT= Serial.read();
    }
      Serial.print('y');
        
    while (Age==2){
      Age= Serial.read();
    }
      Serial.print('y');
          
    while (Gender==2){
      Gender = Serial.read();
    }
      Serial.print('y');
            
    while (t==2){
      t = Serial.read();
    }
      Serial.print('y');
                

  while (MARCA==254){
    MARCA=Serial.read();
  }
    Serial.print('y');
    
    MARCA=254;
       */
  
// comvertir los parametros a variables de tipo double

  //WT=float(WT);
  
 // HT=float(HT);
  
 // Age=float(Age);
  
  //Gender=float(Gender);
  
//  t=float(t);
  
  float T=t*m/60.0; //pasar el periodo de muestreo a minutos
    

    if (Gender==1.0){
       LBM = 1.1 * WT - 128.0*pow((WT/HT),2.0);
    }
    
    else if (Gender==0.0){
       LBM =  (m*1.07) * WT - 148.0 * m * pow(WT/HT,2.0);
    }
    
    else{
   // Serial.print("Gender debe ser 0 ó 1. Por defecto se toma Gender=1 (MALE)");
    Gender = 1.0;
    LBM =(1.1*m) * WT - 128.0 * m * pow(WT/HT,2.0);
    }
    // Parámetros del controlador PI
     bisref = 50.0*m;
     Kp = 0.25*m;
     Ki = 0.1*m;
     alfa = Kp + Ki* T/(2.0*m);
     beta = -Kp + Ki*T/(2.0*m);
    
    //condiciones iniciales del paciente
    bis0 = 95*m;
    bismin = 8.9*m;
    ec50 = 4.94*m;
    g = 2.69;

      
     V1 = 4.27;  //volumen del compartimento uno
     V2 = 18.9 - 0.391*(Age-53.0); //volumen del compartimento dos
     V3 = 238.0*m;  //volumen del compartimento tres
     CL1 = 1.89+0.0456*(WT-77.0) - 0.0681*(LBM-59.0)+0.0264*(HT-177.0);
     CL2 = 1.29-0.024*(Age-53.0);
     CL3 = 0.836;

     k12 = CL2*m / V1;
     k13 = CL3*m / V1;
     k21 = CL1*m / V2;
     k31 = CL1*m / V3;
     k10 = CL1*m / V1;
     ke0 = 0.456*m;  
    
    float parametros []={V1,WT,HT,Gender,Age,t,CL3,k12,k13,k21,k31,k10,ke0,alfa,beta,Kp,Ki,bisref};
    
    Serial.print('y');
  
    for (int n=0; n<=17; n++){
    Serial.print (parametros[n],4);
    delay(5);
    Serial.print('y');
    while (MARCA=='255'){
    MARCA=Serial.read();}
    MARCA=255;
   }
  

    a1=-(k10+k12+k13);
    a2=k21*V2/V1;
    a3=k31*V3/V1;
    a4=k12*V1/V2;
    a5=-k21;
    a6=k13*V1/V3;
    a7=-k31;
    a8=ke0;

  


    float bisini[] = {bis0};  
    float bolo = 1.45*m;
    float Tbolo = 1.0; // tiempo del bolo en min
    float vel_mgkgh = bolo/(Tbolo/60.0);
    float vel_bolo = (bolo*WT*Tbolo*m)/(1000.0*V1);
    float tfinal = 40.0;  // tiempo de simulacion
    float kfin = round(tfinal*m/T);






    float x1[] = {0.0,0.0,0.0,0.0};
    float x2[] = {0.0,0.0,0.0,0.0};
    float x3[] = {0.0,0.0,0.0,0.0};
    float x4[] = {0.0,0.0,0.0,0.0};
    float vel[] = {vel_bolo};
    float bisdiscreto[] = {bis0*m};



for (int i=1; i<=kfin-1; i++){
  
  if (i <= (Tbolo*m/T)-1){
    vel[i] =vel_bolo;
  }
  else{
   float ebis = bisref - bisdiscreto[i-1];
    
    float ebisant = ebis;
    vel[i] = vel[i-1] - (alfa*ebis/m + beta*ebisant/m);
    
    
    if (vel[i] < 0.0){
       vel[i] = 0.0;
    }  
    if (vel[i] > m*0.03){
       vel[i] = m*0.03;
    }
  }
  
  //  METODO RUNGE KUTTA CLASICO 4 ORDEN
  
                // CALCULO DE LOS COEFICIENTES DE LA CONCENTRACION EN EL COMPARTIMENTO 1 (X1):  

    Q11= a1*x1[i-1]/m + a2*x2[i-1]/m + a3*x3[i-1]/m +vel[i];
    Q21= a1*(x1[i-1] + T*Q11/(pow(2.0*m,2.0)))/m + a2*(x2[i-1]+ T*Q11/(pow(2.0*m,2.0)))/m + a3*(x3[i-1] + T*Q11/(pow(2.0*m,2.0)))/m +vel[i];
    Q31= a1*(x1[i-1] + T*Q21/(pow(2.0*m,2.0)))/m+ a2*(x2[i-1] + T*Q21/(pow(2.0*m,2.0)))/m + a3*(x3[i-1]+ T*Q21/(pow(2.0*m,2.0)))/m+vel[i];
    Q41= a1*(x1[i-1] + T*Q31/pow(m,2.0))/m + a2*(x2[i-1] + T*Q31/pow(m,2.0))/m + a3*(x3[i-1]+ T*Q31/pow(m,2.0))/m +vel[i];
    
              // CALCULO DE LOS COEFICIENTES DE LA CONCENTRACION EN EL COMPARTIMENTO 2 (X2):
    
    Q12= a4*x1[i-1]/m+a5*x2[1,i-1]/m;
    Q22= a4*(x1[i-1]+T*Q12/(pow(2.0*m,2.0)))/m +a5*(x2[i-1]+T*Q12/(pow(2.0*m,2.0)))/m;
    Q32= a4*(x1[i-1]+T*Q22/(pow(2.0*m,2.0)))/m+a5*(x2[i-1]+(T*Q22/(pow(2.0*m,2.0))))/m;
    Q42= a4* (x1[i-1]+T*Q32/pow(m,2.0))/m+a5*(x2[i-1]+T*Q32/pow(m,2.0))/m;
    
    
             // CALCULO DE LOS COEFICIENTES DE LA CONCENTRACION EN EL COMPARTIMENTO 3 X3
    
    Q13=  a7*x3[i-1]/m + a6*x1[i-1]/m;
    Q23= a7*(x3[i-1] + (T*Q13/(pow(2.0*m,2.0))))/m + a6*(x1[i-1]+(T*Q13/(pow(2.0*m,2.0))))/m;
    Q33= a7*(x3[i-1] + (T*Q23/(pow(2.0*m,2.0))))/m + a6*(x1[i-1]+(T*Q23/(pow(2.0*m,2.0))))/m;
    Q43= a7*(x3[i-1]+ T*Q33/pow(m,2.0))/m + a6*(x1[i-1]+T*Q33/pow(m,2.0))/m;
    
    
            // CALCULO DE LOS COEFICIENTES DE LA CONCENTRACION EN EL COMPARTIMENTO 4 X4
    
    Q14= a8*x1[i-1]/m-a8*x4[i-1]/m;
    Q24= a8*(x1[i-1]+(T*Q14/(pow(2.0*m,2.0))))/m-a8*(x4[i-1]+(T*Q14/(pow(2.0*m,2.0))))/m;
    Q34= a8*(x1[i-1]+(T*Q24/(pow(2.0*m,2.0))))/m-a8*(x4[i-1]+(T*Q24/(pow(2.0*m,2.0))))/m;
    Q44= a8*(x1[i-1]+ T*Q34/pow(m,2.0))/m-a8*(x4[i-1]+(T*Q34/pow(m,2.0)))/m;
  
    
           // CALCULO DE LAS CONCENTRACIONES DE LOS COMPARTIMENTOS DEL PACIENTE
          

    x1[1,i]= x1[i-1]+(T/(6.0*m))*(Q11 + 2.0*Q21 + 2.0*Q31 + Q41);
    x2[1,i]= x2[i-1]+(T/(6.0*m))*(Q12 + 2.0*Q22 + 2.0*Q32 + Q42);
    x3[1,i]= x3[i-1]+(T/(6.0*m))*(Q13 + 2.0*Q23 + 2.0*Q33 + Q43);
    x4[1,i]= x4[i-1]+(T/(6.0*m))*(Q14 + 2.0*Q24 + 2.0*Q34 + Q44);
    
    
           // bis discreto
    
    bisdiscreto[i] = bis0 - (bis0-bismin)*(pow(x4[i],g))/(pow(x4[i],g)+pow(ec50/1000.0,g));
    tiempo=T*i;
    
    Serial.print('y');
    Serial.print (vel[i],5);
    
    while (MARCA==255){
    MARCA=Serial.read();}
    
    MARCA=255;
    
    Serial.print (bisdiscreto[i],5);
    
    while (MARCA==255){
    MARCA=Serial.read();}
    
    MARCA=255;
    
    Serial.print (tiempo,5);
    
    while (MARCA==255){
    MARCA=Serial.read();}
    
    
  
}

}

« Last Edit: April 22, 2012, 06:28:09 am by hunaida » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
fijense unicamente en las partes del codigo que trata de la comunicacion, el resto del codigo se trata de representar el modelo de un paciente anestesiado



CODIGO DE C#
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Threading;
using System.Windows.Forms;
using System.Windows;
using System.Collections;
using ZedGraph;
using System.IO;



namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        byte[] sinc = new byte[1];



        public Form1()
        {
            InitializeComponent();
      

        }



        /* REALIZAMOS LA CARGA DE LOS DATOS DEL PACIENTE CUANDO LE DAMOS AL OK*/
        private void button1_Click(object sender, EventArgs e)
        {
            

            progressBar1.Minimum = 1;
            progressBar1.Maximum = 100;
          

          

            byte[] dato = new byte[5];

            dato[0] = byte.Parse(textBox1.Text);    /*transformamos de string a int y almacenamos*/
            dato[1] = byte.Parse(textBox2.Text);    /*transformamos de string a int y almacenamos*/
            dato[2] = byte.Parse(textBox3.Text);    /*transformamos de string a int y almacenamos*/      
            dato[3] = byte.Parse(textBox4.Text);    /*transformamos de string a int y almacenamos*/          
            dato[4] = byte.Parse(textBox5.Text);    /*transformamos de string a int y almacenamos*/

            sinc[0] = 200;
            /*se configura el Puerto COM 6*/ //serialPort1.PortName = "COM6";
            serialPort1.BaudRate = 9600;
            serialPort1.DataBits = 8;
            serialPort1.Parity = Parity.None;
            serialPort1.StopBits = StopBits.One;
          
            serialPort1.Open(); /*se abre el puerto COM6*/
          //  serialPort1.Write(sinc[0].ToString());

            serialPort1.Write(new byte [] {dato[0]},0,0);        /*escribe el valor del peso*/
            //Thread.Sleep(10);                              /*esperamos 5 ms para asegurarnos que el valor se escribe correctamente */
            serialPort1.ReadTo("y");                      /*esperamos a que el micro nos permita volver a escribir en el puerto*/
            
            serialPort1.Write(new byte [] {dato[1]},0,0);        /*escribe el valor de la altura del paciente*/
            //Thread.Sleep(5);                              /*esperamos 5 ms para asegurarnos que el valor se escribe correctamente */
            serialPort1.ReadTo("y");                      /*esperamos a que el micro nos permita volver a escribir en el puerto*/
            //serialPort1.DiscardInBuffer();
            serialPort1.Write(new byte [] {dato[2]},0,0);        /*escribe el valor del Edad del paciente*/
            //Thread.Sleep(5);
            serialPort1.ReadTo("y");
            //serialPort1.DiscardInBuffer();
            serialPort1.Write(new byte [] {dato[3]},0,0);        /*escribe el valor del Genero del paciente (1 Hombre / 0 Mujer)*/
            //Thread.Sleep(5);
            serialPort1.ReadTo("y");
            //serialPort1.DiscardInBuffer();
            serialPort1.Write(new byte [] {dato[4]},0,0);        /*escribe el valor del Tiempo de muestreo del sistema VIRPAT*/
           // Thread.Sleep(5);
            serialPort1.ReadTo("y");
            serialPort1.Write(sinc[0].ToString());
          
            serialPort1.Close();                          /*cerramos el puerto COM6*/

            progressBar1.Value = 100;
            button2.Visible = true;
        }

        private void Form1_Click(object sender, System.EventArgs e)
        {

            this.BackgroundImage = WindowsFormsApplication1.Resource1.PanoramicaQuirofanoAzul;
            //this.BackColor = System.Drawing.Color.Bisque;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2();
            frm.Show();
        }

    
    
      
        
    }

    }
Logged

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 747
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

no me cuadra esto
char MARCA='254';
debería ser char MARCA=254 , el valor en decimal.

que quieres conseguir con esto ??

    while (MARCA=='254'){
    MARCA=Serial.read();}
    MARCA='254';

primero lo lees y luego machacas de nuevo el valor MARCA con el '254', que debe ser un valor decimal, la comilla simple es para meter un caracter por ejemplo 'M'

dale un buen repaso al codigo de arduino. el otro no lo he mirado

ataca elproblema de otra forma, lee por serie una linea completa y luego analizas la linea en busca de los datos que queires.

un saludo
Logged

Pages: [1]   Go Up
Jump to: