Tengo una configuración que se comunica entre PC (Windows) y Atmega2560 mediante UART. En el lado de la PC estoy usando Pyserial. Desde la PC estoy enviando un párrafo de texto byte por byte a Atmega2560. La configuración de UART es: velocidad de transmisión de 2400 baudios, datos de 8 bits, 1 bit de parada; No hay paridad; El código de piserial es el siguiente:
string = "some sample text"
strobe = serial.Serial('com3',baudrate = 2400)
for x in string:
strobe.write(x)
sleep(0.001)
Usé un osciloscopio para verificar la señal UART en el pin RX de la MCU, y observé que había un espacio de 15 ms entre dos cuadros de datos. Mis preguntas son:
- ¿Se transmiten sucesivamente los marcos de datos en UART, es decir, después de un bit de parada, comienza el bit de inicio del siguiente marco?
- Si la respuesta a la pregunta anterior es sí, ¿la velocidad de transmisión de datos es la misma que la velocidad en baudios?
- En la transmisión de datos (de PC a MCU), sin el retraso de 1 ms, los datos se corrompen. ¿Por qué sucede esto? ¿Cómo puedo transmitir con éxito sin demora?
También estoy enviando datos desde MCU a PC. Cuando probé el pin TX de la MCU usando el osciloscopio, hubo un retraso insignificante entre las tramas de datos. Creo que esto se debe a que estoy utilizando interrupciones para transmitir en la MCU.
Estoy agregando el código Atmega2560 aquí:
volatile uint16_t address;
volatile char incoming;
uint8_t in_buffer[2000];
void eeprom_write(uint16_t add,uint8_t val){
while(((EECR)&(0x02)) != 0);//EEPE bit
cli();
EEAR = add;
EEDR = val;
EECR |= 0x04;//EEMPE
EECR |= 0x02;//EEPE
sei();
}
ISR(USART0_RX_vect){
incoming = UDR0;
in_buffer[address]=incoming;
address++;
}
int main(void){
/*initialization of uart*/
address = 0;
incoming = 1;
while(incoming!='#'){}
for(uint16_t i = 0 ;i<address;i++)
eeprom_write(i,in_buffer[i]);
}
La terminación de los datos se indica con '#'.