Forum: Mikrocontroller und Digitale Elektronik UART RX IT im STM32F401


von stm31 (Gast)


Lesenswert?

Guten Tag,

folgende Frage beschäftigt mich:

Ich möchte über die zwei seperaten USART Schnittstellen des µCs Daten 
empfangen. Für jeweils eine Schnittstelle bekomme ich dies auch hin.
Dafür nutze ich folgende Funktionen:
1
HAL_UART_Receive_IT(&huart1,(uint8_t *)Rx_Data,1);

Vereinfachter Code:
1
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
2
{
3
 if(huart->Instance == USART1&&received==0)
4
 {
5
 received=1
6
 }
7
HAL_UART_Receive_IT(&huart1,(uint8_t *)Rx_Data,1);
8
}
Meine Idee für zweimal UART RX wäre in der Callback Funktion
1
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
2
{
3
 if(huart->Instance == USART1&&received1==0)
4
 {
5
 received1=1
6
 }
7
 if(huart->Instance == USART2&&received2==0)
8
 {
9
 received2=1
10
 }
11
HAL_UART_Receive_IT(&huart1,(uint8_t *)Rx_Data,1);
12
HAL_UART_Receive_IT(&huart2,(uint8_t *)Rx_Data,1);
13
}

Falsch gedacht, funktioniert natürlich nicht.

Wie macht man es richtig? Direkt im UARTX_IRQHandler?
Wie bekomme ich da die eingehenden Daten?

von (Gast)


Lesenswert?

Das sieht eher nach einem Problem mit den STM-Libs aus als mit dem F401 
an und für sich.

Abgesehen davon dass der Code so nicht kompiliert würd ich mir mal 
folgende Fragen stellen:

* warum habe ich eine Variable received1, was soll die signalisieren
* ditto für received2
* was tut eigentlich HAL_UART_Receive_IT und warum rufe ich beide in 
einem Callback auf
* wer ruft den Callback auf

von pegel (Gast)


Lesenswert?

Das hier sieht nach einer Lösung aus:
http://blog.naver.com/PostView.nhn?blogId=bieemiho92&logNo=220996707352

unten im Artikel gibt es eine HAL_UART_RxCpltCallback Funktion, die die 
2 UART auswertet.

von Harry L. (mysth)


Lesenswert?

Ich verstehe ehrlich gesagt dein Problem nicht ganz.
Mit "UART_HandleTypeDef *huart" wird der Callback-Routine doch 
mitgeteilt, auf welche Schnittstelle sich der Callback bezieht.
1
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
2
{
3
  if (huart == &huart1)
4
  {
5
// Code für uart 1
6
  }
7
  if (huart == &huart2)
8
  {
9
// Code für uart 2
10
  }    
11
}

von Klaus S. (skibby)


Lesenswert?

So sollte es gehen:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
 if ( (huart == &huart1 && (received==0) )
 {
   received1=1;
   HAL_UART_Receive_IT(&huart1,(uint8_t *)Rx_Data,1);
 }

 if( (huart == &huart2)&& (received2==0) )
 {
   received2=1;
   HAL_UART_Receive_IT(&huart2,(uint8_t *)Rx_Data,1);
 }
}


stm31 schrieb:
> Guten Tag,
>
> folgende Frage beschäftigt mich:
>
> Ich möchte über die zwei seperaten USART Schnittstellen des µCs Daten
> empfangen. Für jeweils eine Schnittstelle bekomme ich dies auch hin.
> Dafür nutze ich folgende Funktionen:
>
1
> HAL_UART_Receive_IT(&huart1,(uint8_t *)Rx_Data,1);
2
>
>
> Vereinfachter Code:
>
1
> void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
2
> {
3
>  if(huart->Instance == USART1&&received==0)
4
>  {
5
>  received=1
6
>  }
7
> HAL_UART_Receive_IT(&huart1,(uint8_t *)Rx_Data,1);
8
> }
9
>
> Meine Idee für zweimal UART RX wäre in der Callback Funktion
1
> void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
2
> {
3
>  if(huart->Instance == USART1&&received1==0)
4
>  {
5
>  received1=1
6
>  }
7
>  if(huart->Instance == USART2&&received2==0)
8
>  {
9
>  received2=1
10
>  }
11
> HAL_UART_Receive_IT(&huart1,(uint8_t *)Rx_Data,1);
12
> HAL_UART_Receive_IT(&huart2,(uint8_t *)Rx_Data,1);
13
> }
>
> Falsch gedacht, funktioniert natürlich nicht.
>
> Wie macht man es richtig? Direkt im UARTX_IRQHandler?
> Wie bekomme ich da die eingehenden Daten?

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.