Forum: Mikrocontroller und Digitale Elektronik STM: Abfrage, ob HAL_UART_Transmit_IT fertig ist


von Jonas (Gast)


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?

von HUA (Gast)


Lesenswert?

Hallo,

kann es sein das du "HAL_UART_Transmit" mit "HAL_UART_Transmit_IT" 
verwechselst?
Ansonsten könnte etwas mehr code nicht schaden ;-)

von Jonas (Gast)


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;

von Jens R. (tmaniac)


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.

: Bearbeitet durch User
von Jonas (Gast)


Lesenswert?

Jens R. schrieb:
> Hast du schon mit der Callback Funktion gearbeitet?

Bisher nicht. Werde ich aber in den nächsten Tagen mal ausprobieren.

Beitrag #6967102 wurde vom Autor gelöscht.
von Harry L. (mysth)


Angehängte Dateien:

Lesenswert?

Im Anhang ein Beispiel zur Nutzung der Callbacks.

von Jonas (Gast)


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
}

von PittyJ (Gast)


Lesenswert?

Danke für Frage und Code.
Das gleiche muß ich nämlich auch nächste Woche implementieren. Und den 
Callback hatte ich mir am Freitag schon angeschaut.

von Harry L. (mysth)


Lesenswert?

Jonas schrieb:
> Allerdings mußte ich die UART-Abfrage etwas anders machen wie Du. Bei
> mir ging
> if(huart == huart2)
> nicht...

Nein, mußst du nicht!
Du musst als Erstes
1
serial_init(&huart2, pointer_to_your_buffer)

aufrufen.
Das uart-Handle wird in hcompprt gespeichert, und das wird auch bei 
weiteren Zugriffen benötigt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.