Cadena RX en UART no funciona

0

Tengo algunos problemas con la comunicación UART con el módulo Bluetooth RN-42 SM. Actualmente, solo uso el sondeo para hacer que la comunicación funcione. Tengo mis archivos fuente a continuación.

El problema es que puedo enviar correctamente, pero no puedo recibir. He podido recibir PARTES de una respuesta, pero parece que la Transmisión envía un comando antes de que pueda recibir todo el búfer.

Tenga en cuenta también que estoy intentando recuperar una cadena de valores. Entonces, por ejemplo, si envío un '$$$', recibo un 'CMD \ r \ n' a cambio. Estoy tratando de recuperar este último.

ARCHIVO FUENTE

DDRC |= 0xFF;
DDRD |= 0xFA;

initUART();
unsigned char pinRTS = 0;
unsigned char buffer[RXBUFSIZE] = {0};

UNSETCTS(PORTD);

while(1)
{
    PORTC ^= 0xFF;
    pinRTS = GETRTS(PIND);

    if(pinRTS == 0x00) { //Receiver is letting us send
        SETCTS(PORTD);
        transmitStr((unsigned char *)CMDMODE);  
        UNSETCTS(PORTD); 

        waitForRcv();
        rcvStr(buffer);

        SETCTS(PORTD);  
        transmitStr((unsigned char *)EXITCMD); 
        UNSETCTS(PORTD); 

        waitForRcv();
        rcvStr(buffer);        
    }             
}

ABAJO LA CABEZA

#include "serial.h"

void initUART() {   
    /* Set baud rate */
    UBRR0H = (unsigned char)(UBBRVAL >> 8);
    UBRR0L = (unsigned char)UBBRVAL;

    /* Enable receiver and transmitter */
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);

    /* Set frame format: 8 data, 1 stop bit */
    UCSR0C = (3<<UCSZ00);

    /* Double the speed */
    UCSR0A |= (1 << U2X0);
}

void USART_TRANSMIT(unsigned char cmd) {
    /* Wait for empty transmit buffer */
    while ( !( UCSR0A & (1 << UDRE0)) );

    /* Put data into buffer, sends the data */
    UDR0 = cmd;
}

void transmitStr(unsigned char *cmd) {
    int i;
    for(i = 0; cmd[i] != '
DDRC |= 0xFF;
DDRD |= 0xFA;

initUART();
unsigned char pinRTS = 0;
unsigned char buffer[RXBUFSIZE] = {0};

UNSETCTS(PORTD);

while(1)
{
    PORTC ^= 0xFF;
    pinRTS = GETRTS(PIND);

    if(pinRTS == 0x00) { //Receiver is letting us send
        SETCTS(PORTD);
        transmitStr((unsigned char *)CMDMODE);  
        UNSETCTS(PORTD); 

        waitForRcv();
        rcvStr(buffer);

        SETCTS(PORTD);  
        transmitStr((unsigned char *)EXITCMD); 
        UNSETCTS(PORTD); 

        waitForRcv();
        rcvStr(buffer);        
    }             
}
' ;i++) { USART_TRANSMIT(cmd[i]); } } unsigned char USART_RECEIVE() { /* Wait for data to be received */ while ( !(UCSR0A & (1 << RXC0)) ); /* Get and return received data from buffer */ return UDR0; } void rcvStr(unsigned char *buffer) { int i = 0; while ( UCSR0A & (1 << RXC0) ) { buffer[i] = UDR0; i++; } UCSR0A |= (1 << RXC0); } void waitForRcv() { while ( !((UCSR0A >> RXC0) & 0x01) ); }

Gracias por tu ayuda. :)

    
pregunta Edwin

1 respuesta

3

¿Está seguro de que está viendo correctamente para ver si el módulo bluetooth se ha llenado en su búfer RX? Realmente no estoy seguro de que estés marcando los indicadores RTS y CTS correctamente.

¡Debería estar marcando las marcas RTS y CTS en cada carácter, no solo cuando comienza a enviar la cadena completa! Si llena el búfer de RX en el módulo bluetooth, actualmente seguirá transmitiendo, incluso si cambian los indicadores RTS o CTS.

También debe verificar qué versión de handshaking usa su módulo: enlace

Por último, pero no menos importante, pequeña selección de nits: ¿Estás almacenando realmente el código fuente en un encabezado? Por favor no! ¡Ponga la fuente en un archivo separado y simplemente coloque los prototipos en el encabezado!

    
respondido por el Kit Scuzz

Lea otras preguntas en las etiquetas