Acabo de integrar el código del ejemplo de puerto COM virtual USB STM32 de ST ( stm32_usb-fs-device_lib.zip desde 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 bloqueada (en una interrupción) hasta que se traten todos los datos. El comentario exacto en el código es "Los datos USB se procesarán de inmediato, esto permitirá que el próximo tráfico USB se desnude hasta el final de 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 forma de acelerar los datos que recibo de 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);
Parece que tengo esto 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 que después de obtener los datos, y en la devolución de llamada de inicio del marco (cada 1 ms), establezco si el punto final acepta datos.
Nota: Los documentos nunca parecen decir cuántos datos leerá USB_SIL_Read, lo que podría conducir a una saturación del búfer. Sin embargo, creo que el máximo es lo que está en VIRTUAL_COM_PORT_DATA_SIZE, y esto parece funcionar muy bien para mí.
Esto parece funcionar; sin embargo, no tengo idea de si es la forma "correcta" de hacerlo. Por favor, avíseme si está mal y lo actualizaré.
Debería poder hacer esto configurando un indicador atómico en el ISR de que los datos están disponibles, detectando eso en el bucle principal para tratarlo y luego enviando el acuse de recibo desde allí, o configurando un indicador para que sea acusado. la próxima oportunidad
gordon williams