Cambiando BaudRate en ambos lados simultáneamente

1

A través de la interfaz de C # quiero cambiar la tasa de baudios, para hacer eso ofcurse tengo que cambiar la tasa de baudios en el otro lado que es MSP430 usando CodeCompserStudio y para enviar un Ack a la PC, entonces implemento los cambios también en C #, pero cuando cambio la tasa de baudios en CCS no puedo enviar el mensaje de acuse de recibo correctamente porque la tasa de baudios no coincide. y debido a eso recibo un mensaje sin sentido en lugar del "Ack" que evita cambiar la velocidad en baudios en el otro lado (PC) porque estaba esperando el "Ack". Intenté enviar el mensaje "Ack" antes de cambiar la velocidad de transmisión en CCS, pero no sirvió de nada. Este es mi pseudo código: Inicialmente en C # acabo de presionar un botón que envía un comando apropiado a CCS para cambiar la velocidad en baudios. Luego, en CCS, después o antes de cambiar la tasa de baudios, debemos enviar "Ack":

while(!(UCA1IFG & UCTXIFG));    // in this case we send the Ack msg before changing the cnfgs.
UCA1TXBUF='*';           // '*' indicates "Ack"
UCA1BR0 = 3;                 // 9600 baudrate (32k ACLK)
UCA1BR1 = 0;
UCA1MCTL = UCBRS_3+UCBRF_0;

en C #:

private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
   string receivedData = SerialPort.ReadExisting();
   if (receivedData == "*") // BaudRate Acknowledge
       SerialPort.BaudRate = Convert.ToInt16(BaudRate.SelectedItem);
}

alguna idea?

    
pregunta Renya Karasuma

1 respuesta

2
  1. Envíe el comando para cambiar la velocidad en baudios de la PC al microcontrolador en la antigua velocidad en baudios.
  2. Envíe ACK para el comando en baudrate anterior desde el microcontrolador a la PC.
  3. Cambie baudrate en la PC y haga que el microcontrolador ejecute el cambio de baudrate.
  4. Espere x ms (para asegurarse de que ambos lados hayan terminado con el cambio de velocidad en baudios).
  5. Envíe algunos datos del microcontrolador a la PC en la nueva tasa de baudios para verificar que el cambio de la tasa de baudios sea exitoso.
  6. La PC no recibe datos dentro de x + y ms, vuelve a la tasa de baudios antigua.
  7. Si el microcontrolador no obtiene un ACK para los datos del paso 5 dentro de z ms, vuelva a la velocidad de transmisión anterior

Los tiempos de espera x, y, z deberán determinarse en función de la rapidez con que ambos lados puedan cambiar la velocidad en baudios y cualquier posible retraso causado por toda la cadena (Programa, SO, hardware). Aquí diría que es mejor esperar un poco demasiado tiempo que demasiado corto, a menos que haya alguna razón por la que deba cambiar rápidamente.

Los pasos 5 a 7 están ahí para asegurarte de que estarás bastante seguro de que será posible comunicarse después de x + y + z ms, ya sea en la nueva velocidad de transmisión o en la anterior.

También desde el código que publica, entiendo que el mensaje ACK es un solo "*"? Si es así, podría ser una buena idea expandir el mensaje ACK para que la otra parte sepa qué mensaje está siendo reconocido.

editar:

En el código para tu microcontrolador, colocas el * en el búfer de envío y, justo después, comienzas a jugar con los registros de velocidad en baudios. Lo que significa que estás cambiando la velocidad en baudios mientras se envía el ACK. La solución más fácil es hacer que el microcontrolador espere hasta que termine de enviar el ACK con un: %código%. UCA1STAT es el registro de estado de la UART ( Guía de uso de la familia MSP430 página 914). Y el bit 0 será 1 si el UART está ocupado enviando o recibiendo.

Una advertencia para la solución anterior, si por alguna razón el bit de ocupado de UART se mantiene alto, el microcontrolador se bloqueará. Además, el microcontrolador no puede hacer nada más mientras tanto. El término para esto es código / función de bloqueo.

    
respondido por el user17645

Lea otras preguntas en las etiquetas