Usando el módulo CH376 con PIC 18f520

1

Estoy intentando leer datos de un USB utilizando el módulo CH376 con el microcontrolador PIC 18f4520.

El nombre del archivo que estoy tratando de leer es "ABC.txt" y contiene "hola".

// Instructing module which file to read

SerialTransmit(0x57);
SerialTransmit(0xAB);
SerialTransmit(0x2f);
SerialTransmit(0x2f);
SerialTransmit('A');
SerialTransmit('B');
SerialTransmit('C');
SerialTransmit('.');
SerialTransmit('T');
SerialTransmit('X');
SerialTransmit('T');
SerialTransmit(0x00);

init_lcd();
lcd_string("fn");
function_int(RCREG);
DelayMS(1); 

// Opening the File

SerialTransmit(0x57);
SerialTransmit(0xAB);
SerialTransmit(0x32);

init_lcd();
lcd_string("open");
function_int(RCREG); 
DelayMS(2000);

if(RCREG!=0x14)
   {
    init_lcd();
    lcd_string("open not ok");
    while(1);
    }

 else
    {   
        init_lcd();
        lcd_string("open ok");
        DelayMS(1);
     }
 i=0;

  // Setting to read 5 bytes 

  SerialTransmit(0x57);
  SerialTransmit(0xAB);
  SerialTransmit(0x3A);
  SerialTransmit(0x05); // here
  SerialTransmit(0x00);

 i++;
 init_lcd();
 lcd_string("dl");
 function_int(RCREG);
 DelayMS(2);

 if(RCREG!=0x1D)
{   
   init_lcd();
   lcd_string("dl not ok");
   while(1);
 }

 else   
 {  
    init_lcd(); 
    lcd_string("dl ok");    
    DelayMS(1);
  }

// Reading

SerialTransmit(0x57);
SerialTransmit(0xAB);
SerialTransmit(0x27);

// It reads the first byte here, first byte is a waste byte i.e. 
// it returns 0x05 (The number of bytes we want to read)

init_lcd(); 
lcd_string("0read");
function_int(RCREG);    
DelayMS(3000);

// It reads the first byte here, i.e. H

init_lcd();
lcd_string("1read");
function_int(RCREG);
lcd_string("==");
lcd_data(RCREG);    
DelayMS(3000);

// It is supposed to read 'E' here, but it still reads 'H'

init_lcd();
lcd_string("2read");
function_int(RCREG);
lcd_string("==");
lcd_data(RCREG);
DelayMS(3000);

// It is supposed to read 'L' here, but it still reads 'H'

init_lcd();
lcd_string("3read");
function_int(RCREG);
lcd_string("==");
lcd_data(RCREG);
DelayMS(3000);

while(1);

Puedo configurar e instruir al módulo para que abra y comience a leer el archivo. Pero el problema es que estoy atascado en el primer byte. No puedo leer el segundo byte. ¿Cómo puedo hacerlo?

Gracias, realmente apreciaré cualquier ayuda.

    
pregunta prog_SAHIL

1 respuesta

2

No puedes usar RCREG de esta manera. Debe leerlo en un búfer y luego usar el búfer para otras pruebas.

Te veo usar:

function_int(RCREG);
lcd_string("==");
lcd_data(RCREG);    

En el segundo uso, RCREG será el siguiente byte recibido o la unidad uart mostrará un error porque no hay datos en el registro RCREG.

Además, la imagen 16f4520 no tiene un FIFO de recepción, los retrasos prolongados que se utilizan para desbordar el búfer y todos los bytes recibidos se pierden.

Utilice un búfer temporal para leer todos los bytes sin demora y luego procese los datos

La forma correcta es:

  • lea el indicador RCIF para ver si hay datos disponibles en RCREG
  • lea RCREG en un búfer y vuelva al primer paso hasta que lea todos los bytes esperados.
  • procesar los datos recibidos.

O use un software UART buffer, si usa MPLABX y luego usa el configurador de código mplab y las funciones generadas, no lea el RCREG directamente

Actualizar. A medida que usa SerialTransmit que espera que el búfer de TX esté vacío antes de enviar un carácter, utilice también SerialReceive, que espera que se reciba un carácter.

Aquí tiene una combinación de fallas, en el código que se muestra arriba está leyendo dos veces y la lectura del segundo byte es defectuosa, lo que conduce a un exceso de recepción

Luego, incluso en mi consejo, usted almacenó en búfer el RCREG, después de eso tiene un largo retraso, pero el búfer de recepción de UART solo puede contener un byte y todos los demás bytes se pierden.

Use SerialReceive (que espera que un byte esté disponible antes de regresar como se ve arriba) y almacene en un búfer todos los datos esperados antes de realizar cualquier procesamiento:

for(i=0;i<number_of_bytes_expected;i++)
  {
   buffer[i] = SerialReceive();
  }
// do whatever you need with the data 
    
respondido por el Dorian

Lea otras preguntas en las etiquetas