Velocidad de bits de la comunicación uart

0

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:

  1. ¿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?
  2. Si la respuesta a la pregunta anterior es sí, ¿la velocidad de transmisión de datos es la misma que la velocidad en baudios?
  3. 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 '#'.

    
pregunta shubham sharma

1 respuesta

1

2400 baudios son 240 caracteres (octetos) por segundo a 10 bits por trama (que es el estándar "8N1"). Dormir durante 1 milisegundo no afectará mucho el espaciado, ciertamente no de una manera predecible, porque cada personaje tarda 4 ms en enviarse.

Podría ser que el sueño de Python no pueda hacer un sueño tan corto como 1 ms,

aún, si desea monitorear los datos, necesita un osciloscopio (o conecte la línea de datos a través de una resistencia a una entrada de la tarjeta de sonido para hacer una grabación y verla en un editor de archivos de sonido; el voltaje probablemente fluctúe a poco, pero debería ver claramente los bordes de cada bit.)

¿Podría haber algo que mantenga su microcontrolador ocupado de modo que no pueda manejar 240 caracteres por segundo?

    
respondido por el Jasen

Lea otras preguntas en las etiquetas