¿Error al leer datos a través de UART usando la biblioteca periférica en PIC32?

Estoy tratando de recibir datos usando UART. Estoy usando un microcontrolador PIC32MX795F512L y una biblioteca de periféricos de 32 bits, por lo que uso funciones como putsUART o ReadUART1 Ahora en el código:

int main()
{
 OpenUART1( UART_EN | UART_NO_PAR_8BIT | UART_1STOPBIT  , UART_RX_ENABLE | UART_TX_ENABLE, (FPB/16/BAUDRATE)-1 );
 TRISDbits.TRISD5 = 0;
  while(1)
  {
    char RX_data;
    RX_data = ReadUART1();
    if(RX_data == '1')
    {
      LATDbits.LATD5 = 1;
      putsUART1("LED ON");
     }

     elseif(RX_data == 'q')
     {
       LATDbits.LATD5 = 0;
       putsUART1("LED OFF");
      }
   }
}

Ahora, cada vez que escribo 1 en el terminal, el LED se enciende, pero cuando escribo q, el LED no se apaga. Funciona con dígitos pero no con letras. Me gusta si lo hago

elseif(Rx_data == '2')

Entonces funcionará pero no con

elseif(RX_data == 'q')

No sé dónde me estoy perdiendo el punto. Por favor ayuda.

¿Estás escribiendo 'q' después de escribir 'l'? ¿O está ejecutando el firmware nuevamente al escribir 'q'?
sí, estoy escribiendo q después de 1
Tal vez el software de su terminal envíe un carácter CR o LF o ambos después del carácter '1' y es por eso que pierde la lectura 'q'. Pruebe y vea si el software de su terminal tiene alguna opción para agregar automáticamente caracteres CR/LF a una transmisión.
Estoy usando Docklight. No está enviando ningún CR LF
El código que acaba de publicar en su edición no se puede compilar. 'rx' ya no existe y no hay espacio entre else y if. Si esto es directamente de su código, lo que debería ser, entonces solo está mostrando su viejo binario una y otra vez
@Asmyldof eso fue por error. he hecho los cambios
¿Por qué estás declarando RX_data en un ciclo infinito?
Además, ¿por qué no repite su lectura en el UART, para que pueda ver cuál es el problema?

Respuestas (2)

Suponiendo que solo desea que haga uno u otro, debe modificar su código de la siguiente manera:

char RX_data = ReadUART1();
if(RX_data == '1')
{
    LATDbits.LATD5 = 1;
    putsUART1("LED ON");
}
else if(RX_data == 'q')
{
    LATDbits.LATD5 = 0;
    putsUART1("LED OFF");
}

Si recorre lógicamente su código original, verá que cuando ingresa 'q', se lee y se compara con '1', que no coincide, pero luego realiza otra lectura, por lo que pierde el ' q ' que ya habías leído.

No sé por qué no funciona, lo he hecho según tu respuesta. Todo parece perfecto, pero aún no obtiene la salida
@ user46573544 Acabo de copiar su código, que dice que funciona bien para '1'. De hecho, comparar an intcon a chares válido, siempre que los valores no excedan el rango de char. Modifiqué mi respuesta para ser más específico, pero si este código no funciona, debe mostrar un poco más del contexto. Supongo que esto está dentro de un whilebucle. Asegúrese de leer solo una vez, luego pruebe todas las posibilidades.
no trabajé Este es el único código que tengo. Lo estoy leyendo una vez y luego comprobando todo lo demás. Puede haber algún otro error.
@ user46573544 ¿Entonces este fragmento de código no está dentro de un while (1) { ... }bucle? Modifique su pregunta y publique la totalidad de su mainfunción.
sí, está dentro de while (1). he editado mi código
funciona con 2 o cualquier otro dígito pero no funciona con letras. Extraño ¿Tienes alguna idea sobre esto?
@user46573544 ¿Tiene bloqueo de mayúsculas en su teclado? Tal vez esté escribiendo 'Q' en lugar de 'q'. Si tiene el hardware para depurar, coloque un punto de interrupción después de la lectura y vea lo que ha leído.
He intentado depurarlo. Cuando ingreso 1su valor, muestra 0x31qué acc a ascii es correcto. Ahora, cuando entro q, muestra 0xF1cuál no está en la tabla ASCII. También intenté ingresar 2para que muestre 0x32lo que significa que 2luego probé con w, se muestra 0xE1nuevamente, no en ascii. No es tomar cartas. no se porque Alguna idea.!
Si ve 0xF1 cuando espera 0x71 ('q'), es posible que su paridad, el tamaño de bits de datos o los bits de parada sean incorrectos. Compruebe su configuración en ambos extremos. Intente reducir también la velocidad en baudios.
Todo es correcto en ambos extremos.
@ user46573544 Si es así, entonces esto ya no es un problema de código, es un problema de hardware y posiblemente necesite alguna depuración con un analizador de alcance y/o lógica y, si es necesario, una nueva pregunta.

Si ReadUART()te está haciendo pasar un mal rato. Puedes usar otras opciones comogetsUART1()

El documento dice:

Descripción: esta función lee una cadena de datos de longitud especificada y la almacena en la ubicación de búfer especificada.

Incluir: plib.h

Prototipo: int sin firmar getsUART1(longitud de int sin firmar, char *buffer, int sin firmar uart_data_wait);

Ejemplo de código: getsUART1(12, myBuffer, 123);

O podría intentar poner valores en los registros UART.