leído desde el búfer en serie

0

Estoy intentando conectar un chip dsPIC33EP con un dispositivo RS232 a una velocidad de baudios = 460800. Mi código funciona bien, pero creo que debe haber una mejor manera de hacerlo. Aquí está el código:

void getData(unsigned char *Data) {
   int i=3;//EDIT: unsigned was removed
   UART1_Write(0x00);
   UART1_Write(0x86); //send two bytes of command to request data(4 bytes) back

   while (1) {

       if (U1STA.URXDA) {   // check if there is a byte available
         Data[i--]=U1RXREG; // shift a byte from UART1 internal receive buffer             
       }

       if (i == -1) break;
   }
}

Sondea el nuevo bit de byte disponible constantemente hasta que lee los cuatro bytes. La velocidad en baudios es muy rápida, así que creo que no hay problema para que esta función sea una llamada de bloqueo.

Aquí hay otra versión:

void getData(unsigned char *Data){
   UART1_Write(0x00);UART1_Write(0x86);//send two bytes of command to request data(4 bytes) back
   *(Data+3)=U1RXREG;
   *(Data+2)=U1RXREG;
   *(Data+1)=U1RXREG;
   *(Data)=U1RXREG;
}

Debido a que espero que ingresen exactamente cuatro bytes, y el búfer FIFO en el chip dsPic es cuatro, no tengo que preocuparme por la saturación. El chip se ejecuta a 120MHZ.

Según las pruebas, ambos funcionan pero mi aplicación es sensible al tiempo y quiero evitar cualquier posible error. ¿Qué camino es mejor? ¿O hay una mejor manera de hacer esto?

    
pregunta Timtianyang

1 respuesta

1

Ambos están descaradamente equivocados.

El primer método hará un bucle infinitamente de lectura de bytes de la UART y los rellenará en ubicaciones de memoria decrecientes. Se bloqueará hasta que el UART ofrezca suficientes bytes hasta que, finalmente, se sobrescriba algo sensible en la memoria o se obtenga una captura de dirección.

El segundo método ni siquiera espera a que se reciban los caracteres. copia lo que está en U1RXREG en el momento en los 4 bytes en DATOS en orden inverso.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas