Tengo ATMEGA328 conectado a ESP8266 a través de UART. Todo lo que estoy tratando de hacer es simplemente enviar un valor constante a través de WIFI a un simple servidor TCP.
Este es el plano de los comandos UART enviados por ATMEGA328 (código completo en la parte inferior):
// Connect to WIFI
AT+CWJAP="MYNET","MYPASSWORD"\r\n
/*
* Loop
*
* Open TCP connection
* Send 10 bytes
* Close TCP Connection
*/
AT+CIPSTART="TCP","104.111.111.111",667\r\n
AT+CIPSEND=10\r\n1111122222\r\n
AT+CIPCLOSE\r\n
Lo probé con ncat y obtuve el siguiente resultado:
Ncat: Connection from 111.111.111.111:11672.
1111122222
Ncat: Connection from 111.111.111.111:35756.
2AT+CIPCLO1111122222
Ncat: Connection from 111.111.111.111:8784.
1111122222
Ncat: Connection from 111.111.111.111:63288.
1111122222
Ncat: Connection from 111.111.111.111:28498.
1111122222
Ncat: Connection from 111.111.111.111:33319.
1111122222
Ncat: Connection from 111.111.111.111:35146.
1111122222
Ncat: Connection from 111.111.111.111:34454.
1111122222
Ncat: Connection from 111.111.111.111:33916.
1111122222
Ncat: Connection from 111.111.111.111:37095.
1111122222
Ncat: Connection from 111.111.111.111:12652.
1111122222
Ncat: Connection from 111.111.111.111:61951.
1111122222
Ncat: Connection from 111.111.111.111:27051.
1111122222
Ncat: Connection from 111.111.111.111:61870.
111122222A1111122222
Ncat: Connection from 111.111.111.111:38063.
1111122222
Ncat: Connection from 111.111.111.111:32270.
Tenga en cuenta los valores extraños a veces, parece que los datos se mezclan, incluso los comandos AT con los 'datos' reales dentro del comando:
111122222A1111122222
2AT+CIPCLO1111122222
Parece que no entiendo si está relacionado con el uso de baudios, el uso incorrecto de los comandos AT o ambos ..
Creo que podría estar relacionado con baudios, porque:
1. The data I receive from ESP8266 is for the most part 0x00, so I can't read and process the responses.
2. Not totally sure if this is correct: UBRR0 = ((( F_CPU / (BAUD * 16UL ))) - 1);
In the original example, it had 'BAUD * 8', but it didn't work for me, when changing it to 16, esp8266 started to understand commands.
Pero nuevamente, parece que el esp8266 se conecta el 100% del tiempo al WIFI (He desactivado la conexión automática en el esp8266, solo se conectará con el comando AT). El comando wifi es bastante largo y creo que si se tratara de un problema de baudios, también fallaría la conexión WiFi en algún momento, pero parece que siempre se conecta.
También intenté enviar 1 byte a la vez en la misma conexión utilizando el mismo comando, pero después de aproximadamente + -10 bytes (tamaño incoherente) el esp8266 cierra la conexión TCP, por lo que lo cambié, así que envía 10 bytes por conexión , pero sigue fallando. Cualquier ayuda es muy apreciada.
Código fuente completo (como mencioné anteriormente por algún motivo, los datos entrantes son en su mayor parte 0x00, por lo tanto no puedo procesar los comandos para ESP8266 para determinar cuándo están listos, por lo tanto simplemente usé largos retrasos para asegurarse de que haya procesado el último comando antes de continuar con el siguiente):
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_CPU 8000000UL
#define BAUD 9600
char buffer[ 70 ];
int received = 0;
void delayms( uint16_t millis )
{
while ( millis )
{
_delay_ms( 1 );
millis--;
}
}
void blink_red()
{
PORTB = 0b00000010;
_delay_ms(10);
PORTB = 0b00000000;
_delay_ms(10);
}
void command_send( char *buf, int len )
{
int i = 0;
for( i=0; i<len; i++ )
{
blink_red();
UDR0 = buf[i];
}
}
int main( void )
{
// Init serial
DDRD = 0b01101000;
DDRB = 0xFF;
UBRR0 = ((( F_CPU / (BAUD * 16UL ))) - 1);
UCSR0B = _BV( RXEN0 ) | _BV( TXEN0 );
UCSR0C = 0b00000110;
UCSR0B |= ( 1 << RXCIE0 );
sei();
command_send( "AT+CWJAP=\"XXXXXXX\",\"XXXXXXXXXX\"\r\n", 32 );
_delay_ms( 15000 );
while( 1 )
{
command_send( "AT+CIPSTART=\"TCP\",\"111.111.111.111\",667\r\n", 41 );
char data[] = { "AT+CIPSEND=10\r\n1111122222" };
_delay_ms( 30 * 1000 );
command_send( data , 25 );
_delay_ms( 30 * 1000 );
command_send( "AT+CIPCLOSE\r\n", 13 );
_delay_ms( 30 * 1000 );
}
return 0;
}
ISR( USART_RX_vect )
{
char ReceivedByte;
ReceivedByte = UDR0;
buffer[ received ] = ReceivedByte;
received++;
if( received >= 70 )
received = 0;
}
The Makefile:
CC=/usr/bin/avr-gcc
MEGA=328p
CFLAGS=-g -Os -Wall -mcall-prologues -mmcu=atmega$(MEGA)
OBJ2HEX=/usr/bin/avr-objcopy
PROG=/usr/bin/avrdude
TARGET=esp8266
DEVICE=/dev/ttyACM0
program : $(TARGET).hex
$(PROG) -c avrispv2 -p m$(MEGA) -P $(DEVICE) -e -B 2.0 -U lfuse:w:0xe2:m -U hfuse:w:0xd9:m
$(PROG) -c avrispv2 -p m$(MEGA) -P $(DEVICE) -U flash:w:$(TARGET).hex
%.obj : %.o
$(CC) $(CFLAGS) $< -o $@
%.hex : %.obj
$(OBJ2HEX) -R .eeprom -O ihex $< $@
clean :
rm -f *.hex *.obj *.o