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.
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.
int
con a char
es 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 while
bucle. Asegúrese de leer solo una vez, luego pruebe todas las posibilidades.while (1) { ... }
bucle? Modifique su pregunta y publique la totalidad de su main
función.1
su valor, muestra 0x31
qué acc a ascii es correcto. Ahora, cuando entro q
, muestra 0xF1
cuál no está en la tabla ASCII. También intenté ingresar 2
para que muestre 0x32
lo que significa que 2
luego probé con w
, se muestra 0xE1
nuevamente, no en ascii. No es tomar cartas. no se porque Alguna idea.!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.
m.alin
usuario46573544
m.alin
usuario46573544
Asmyldof
usuario46573544
scott seidman
scott seidman