Comunicación UART ESP8266 y ATmega328, obtiene la función ()

1

Estoy tratando de obtener un ATmega328 y un ESP8266 para hablar entre ellos a través de UART.

En el ejemplo mínimo adjunto, tengo un LED en el pin 16 (B2) que debería comenzar y parpadear lentamente para mostrar que los datos fueron enviados / recibidos. Sin embargo, parece que se cuelga en la llamada gets (), ya que el LED nunca vuelve a encenderse.

#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>

#define F_CPU 16000000
#define BAUD 115200

void init_uart() {
    // UART setup
    uint16_t ubbr_value = F_CPU / (16UL*BAUD) - 1;
    UBRR0H = (uint8_t) (ubbr_value >> 8);
    UBRR0L = (uint8_t) ubbr_value;
    UCSR0B = (1 << RXEN0)  | (1 << TXEN0);
    UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
    // Status LED on pin 16.
    DDRB |= (1<<DDB2);
}

void transmit(char c) {
    // Wait for the flag to say we're good to write to the data register.
    while(!(UCSR0A & (1 << UDRE0)));
    UDR0 = c;
}

char receive() {
    // Wait for the Rx flag to say we've received a message.
    while(!(UCSR0A & (1 << RXC0)));
    return UDR0;
}

FILE uart_output = FDEV_SETUP_STREAM(transmit, NULL, _FDEV_SETUP_WRITE);
FILE uart_input = FDEV_SETUP_STREAM(NULL, receive, _FDEV_SETUP_READ);

int main(void) {
    init_uart();
    stdout = &uart_output;
    stdin  = &uart_input;

    PORTB=0xff;         // Comms LED on
    _delay_ms(1000);    // Makes sure LED on/off isn't too fast to see.

    puts("AT");         // Send AT command to ESP8266
    PORTB=0x00;         // After command sent, turn LED off to show where we get stuck
    _delay_ms(1000);    

    char input[64];
    gets(input);        // Get a response from the ESP8266

    PORTB=0xff;         // Turn LED back on if successful (Never reaches here)
}

Usando el mismo circuito / código, el LED vuelve a encenderse si uso un FT232 para enviar una cadena desde el terminal a la ATmega. También puedo obtener la respuesta OK del ESP8266 si le envío un comando AT .

Probablemente estoy haciendo algo incalculablemente estúpido, pero parece que no puedo usar la función gets () para recibir del ESP8266.

Originalmente asumí que debía ser algo que ver con los finales de línea, pero de lo que reconozco, pone () envía el retorno de carro / avance de línea requerido por el ESP8266 de todos modos.

    
pregunta Mal

0 respuestas

Lea otras preguntas en las etiquetas