error de lectura y escritura en matlab

0

Estoy tratando de enviar un dato = 40 de matlab gui a pic16f877A a través de comunicación serial. Para la verificación cruzada, el valor se transmite correctamente a la imagen. También se transmitieron esos datos de imagen a matlab y se mostraron esos datos en texto editado en matlab gui. Me di cuenta de que el valor de edittext es 75. los datos recibidos se transmitieron tal como están sin ninguna manipulación, entonces ¿por qué cambió el valor? Alguien puede ayudarme . ¿Hay algún problema en mi encasillamiento?

código mikroc:

 unsigned int setPoint;
 char start;

función principal

 void main() {
 UART1_Init(9600);
 setPoint=100;       // initially setpoint is set to 100
 . 
 .
 .

    while(1){
  if (UART1_Data_Ready()){
       start = UART1_Read();

    }
 if(start=='s'){             // if start button is pressed

  do something....
 }
else if(start=='g'){          // if stop button is pressed
   do something....
}

else if(start=='r'){         // if refresh button is pressed
 UART1_Write(1);
 refresh=1;

 while(refresh==1){
 if(UART1_Data_Ready()){
 setPoint=UART1_Read();      // reads data from matlab

  refresh=0;
   UART1_Write(setPoint);      //transmits back to matlab 
 }
 }
 }
 }
 }

Código Matlab:

se ejecuta cuando se presiona el botón de inicio

   function start_Callback(hObject, eventdata, handles)  // start button in matlab

    s = serial('COM2');
    set(s,'BaudRate',9600);
    set(s,'Timeout',10);
    set(s,'ReadAsyncMode','continuous');
    fopen(s);
    handles=guidata(hObject);
    handles.set=s;                         //passed serial comuunication object(s),so that it can be accessed in other callbacks
    guidata(hObject,handles);
    fprintf(s,'%c','s');                // send 's' to mikroc
    i=1;

     do something here....

ejecutado cuando se presiona el botón de parada

     function stop_Callback(hObject, eventdata, handles)  //stop button in matlab

     setup=handles.set;              //setup is serial communication object(setup=s)
     fprintf(setup,'%c','g');      //send 'g' to mikroc

     do something here.....

se ejecuta cuando se presiona el botón de actualización (el problema se encuentra en el botón de actualización)

     function Refresh_Callback(hObject, eventdata, handles) //refresh button in matlab

     setup=handles.set;
     fprintf(setup,'%c','r');   // send r to mikroc
     refresh=0;
     while(refresh==0)
     if(setup.BytesAvailable>0)
     refresh = fread(setup,1,'uint8');
      end
      end
      setpoint=str2num(get(handles.edit1,'String'));  // take data from edit box (data =40)
       fwrite(setup,setpoint);     //writes data(40) to pic

       setp=fread(setup,1,'uint8');    // receive data from pic
       string1 = sprintf('set = %i', setp);   //display in edit text
       set(handles.edit5, 'String', string1);
       fclose(setup)
       delete(setup)

La salida que se muestra en el texto de edición es 75 y 40 cambian a 75. Soy nuevo en matlab gui.

    
pregunta dcmotor

1 respuesta

1

Necesitas segmentar un poco ese problema.

Paso 1) Comprueba tu código de uC

  • Adjunte una herramienta de terminal (como PuTTY) en lugar de Matlab a su uC; También nos muestran su configuración física. Es consciente de que NO DEBE conectar directamente la unidad uC a su PC, ¿verdad (es necesario que exista un nivel entre el dispositivo de traducción)? Use su configuración para configurar PuTTY (probablemente 9600 baudios, 8 datos, 1 bits de parada, sin paridad, sin control de flujo)
  • Use PuTTY para enviar caracteres y ver qué está haciendo realmente la unidad de usuario (realmente puede depurar la unidad de usuario, ¿correcto?)
  • Haz un programa muy simple que solo haga lo siguiente

Código de ejemplo:

char c;
UART1_Init(9600);
  while(1){
    if (UART1_Data_Ready()){
      c = UART1_Read();
      UART1_Write(c);
      UART1_Write(c);
      UART1_Write(c);
    }
  }  

Debería repetir cada carácter que envíe tres veces (¿por qué tres? Entonces sabemos que no es el eco de su programa terminal). Necesitas hacer que esto funcione, de lo contrario no sirve de nada usar Matlab, simplemente complica tu problema.

Si desea que sea aún más simple, intente lo siguiente

char c = 'z';
UART1_Init(9600);
while(1){
  UART1_Write(c);
}

Esto simplemente enviará el carácter 'z' una y otra vez, deberías ver una larga línea de 'z' en tu programa terminal.

Paso 2) Corregir el código de Matlab

Una vez que la configuración de arriba esté funcionando y funcionando, ahora debería trabajar en su código matlab. Las posibilidades son altas, funcionará de inmediato, pero para eso podría necesitar a otra persona.

Información de depuración) Si te encuentras con personajes extraños hay muchos problemas potenciales. Solo para nombrar unos pocos

  • Configuración incorrecta de Baudrate o generalmente incorrecta para su interfaz serial
  • El microcontrolador estaba mal configurado para esa velocidad en baudios (¿necesitas configurar algún reloj primero?)
respondido por el Tom L.

Lea otras preguntas en las etiquetas