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. :)