Datos de regulación de la conexión serie USB en el microcontrolador STM32 (control de flujo)

2

Acabo de integrar el código del ejemplo STM32 USB Virtual Com Port de ST ( stm32_usb-fs-device_lib.zip de aquí ) con mi proyecto para que el STM32 aparezca como un puerto serie virtual.

Sin embargo, el ejemplo de código limita los datos que recibe al tener la función de devolución de llamada EP3_OUT_Callback (en una interrupción) hasta que se tratan todos los datos. El comentario exacto en el código es "los datos USB se procesarán inmediatamente, esto permitirá que el siguiente tráfico USB sea NAK hasta el final del USART Xfer"

En mi proyecto, necesito procesar los datos que se han recibido en el bucle principal (fuera de una interrupción), por lo que necesito una manera de estrangular los datos que obtengo del USB sin bloquear en EP3_OUT_Callback.

Lo que me gustaría es una función:

Do_Not_Call_EP3_OUT_Callback_Right_Now(bool yes_or_no);
    
pregunta Gordon Williams

2 respuestas

1

Parece que tengo este trabajo funcionando:

void EP3_OUT_Callback(void) {
 ...
  //SetEPRxValid(ENDP3); //<-- Commented out
  SetEPRxStatus(ENDP3, Do_I_Have_Room_For_More_Data() ? EP_RX_VALID : EP_RX_NAK); //<-- Added this
}

void SOF_Callback(void) {
  if(bDeviceState == CONFIGURED) {
    SetEPRxStatus(ENDP3, Do_I_Have_Room_For_More_Data() ? EP_RX_VALID : EP_RX_NAK); //<-- Added this
    ...
    // Original TX code here
  }
}

Lo que sucede es después de obtener los datos, y en el inicio de la devolución de llamada del marco (cada 1 ms), establezco si el punto final está aceptando los datos.

Nota: parece que los documentos nunca dicen la cantidad de datos que leerá USB_SIL_Read, lo que podría provocar una saturación del búfer. Sin embargo, creo que el máximo es lo que hay en VIRTUAL_COM_PORT_DATA_SIZE, y esto parece funcionar muy bien para mí.

Esto parece funcionar, sin embargo, no tengo idea si es la forma "correcta" de hacerlo. Por favor, avíseme si está mal y lo actualizaré.

    
respondido por el Gordon Williams
0

Debería poder hacer esto estableciendo una bandera atómica en el ISR que los datos están disponibles, detectando que en el bucle principal para tratarla y luego enviando el recibo desde allí, o configurando una bandera para que Ser invitado en la próxima oportunidad

    
respondido por el Chris Stratton

Lea otras preguntas en las etiquetas