STM: Abfrage, ob HAL_UART_Transmit_IT fertig ist

Gast #6966981
Lesenswert?

Hallo,

ich benutze HAL_UART_Transmit_IT und übertrage mehrere Blöcke 
nacheinander.
Das Ganze habe ich in einer Statemachine realisiert. Bisher mache ich 
die Weiterschaltung mit einer festen Zeit. Wenn der erste Block gesendet 
wird, wird in den nächsten State geschaltet. In dem wird dann erst 
weiter geschaltet, wenn die Zeit erreicht ist.

Mit dem "Transmit Ende"-Signal wäre es aber sicherlich schneller und vor 
allem sicherer anstelle einer Zeit. Ich habe wie folgt programmiert und 
es gibt ein Problem bei der Übertragung. Ich vermute die Umschaltung 
geht schon weiter, obwohl die Übertragung nicht fertig ist:
1
if(HAL_UART_GetState(&huart2) != HAL_UART_STATE_BUSY_TX) // Übertragung fertig?
2
 ucSM_status++;  // nächster State

Ist die Abfrage nicht korrekt? Oder habe ich einen Denkfehler?
Gast #6967052
Lesenswert?

Es geht definitiv um "HAL_UART_Transmit_IT". Ich kann ja nicht eine neue 
Übertragung starten, wenn die alte noch nicht abgeschlossen ist...

1
case WEB_SM_HEADER_SENDEN:
2
{
3
web.uiHeader_anzahl_bytes = strlen(web.caHeader);
4
HAL_UART_Transmit_IT(&huart2, web.caHeader, web.uiHeader_anzahl_bytes); // senden
5
web.uiSM_timer = 1;
6
web.ucSM_status = WEB_SM_WARTEN_BIS_HEADER_GESENDET;
7
} break;
8

9

10
case WEB_SM_WARTEN_BIS_HEADER_GESENDET:
11
{
12
if(HAL_UART_GetState(&huart2) != HAL_UART_STATE_BUSY_TX) // fertig?
13
      web.ucSM_status = WEB_SM_html_SENDEN;  // nächster State
14
web.uiSM_timer = 1;
15
} break
16

17
case WEB_SM_html_SENDEN:
18
{
19
web.uiHtml_anzahl_bytes = strlen(web.caHTML_string);
20
HAL_UART_Transmit_IT(&huart2, web.caHTML_string, web.uiHtml_anzahl_bytes); // senden
21

22
web.uiSM_timer = 1;
23
web.ucSM_status = WEB_SM_WARTEN_BIS_html_GESENDET;
24
} break;
#6967075
Lesenswert?

Im Manual zur HAL (UM1725) steht auf Seite 1097 folgendes

Interrupt mode IO operation
• Send an amount of data in non blocking mode using 
HAL_UART_Transmit_IT()
• At transmission end of transfer HAL_UART_TxCpltCallback is executed 
and user can add his own code by customization of function pointer 
HAL_UART_TxCpltCallback

Hast du schon mit der Callback Funktion gearbeitet?
Setze ein Flag "wenn fertig" und schwupps kannst die Transmit_IT wieder 
aufrufen.
Beitrag #6967102 wurde von einem Moderator gelöscht.
Gast #6967408
Lesenswert?

Harry L. schrieb:
> Im Anhang ein Beispiel zur Nutzung der Callbacks.

Danke, jetzt funktioniert es!
Allerdings mußte ich die UART-Abfrage etwas anders machen wie Du. Bei 
mir ging
1
if(huart == huart2)
nicht...


So geht es bei mir:
1
extern UART_HandleTypeDef huart2;
2

3
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
4
  {
5
  if(huart->Instance==USART2)  // UART 2?
6
    web.ucTx_fertig = JA;
7
  return;
8
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren