Forum: Mikrocontroller und Digitale Elektronik HAL_UART receive geht nicht


von Adrian (Gast)


Lesenswert?

Hallo zusammen :)

Ich bin zurzeit in meiner Firma an meiner IPA(individuelle 
Abschlussarbeit).
Meine Aufgabe ist es ein Buskoppler(RS485) zu Layouten/testen und 
programmieren.

Jetzt stehe ich gerade bei der Aufgabe Daten zu senden und empfangen.
Da ich mehrere Prototypen zusammengebaut habe, kann ich zwei prints 
ueber A und B des Rs485 Anschlusses zusammenschließen.

Das Senden geht(mit KO gemessen) aber beim empfangen springt mein Code 
immer in das Timeout der receive funktion. leider habe ich keine ahnung 
warum oder was ich falsch mache.

zum senden benutzte ich:
1
while(1)
2
    {
3
      HAL_UART_Transmit(&huart1, buffer, 1, 5000);
4
      HAL_Delay(40);
5
    }

zum empfangen benutzte ich:
1
while(1)
2
  {
3
    HAL_StatusTypeDef temp;
4
    temp = HAL_UART_Receive(&huart1, res, 1, 5000);
5
6
    switch(temp)
7
        {
8
        case(HAL_OK):{setRGB(gruen);break;}
9
        case(HAL_ERROR):{setRGB(rot);break;}
10
        case(HAL_BUSY):{setRGB(blau);break;}
11
        case(HAL_TIMEOUT):{setRGB(violett);break;}
12
        default:{setRGB(weiss);temp = 0;break;}
13
        }
14
15
  }


Der Code ist mit CubeMX generiert und nur diese Funktionen habe ich 
geschrieben. durch Truestudio sehe ich den wert von Temp. er ist nach 
dem 2. mal aufruffen auf Timeout aber beim einschalten kurz(einmal 
aufgeruffen) auf HAL_OK.

Ich danke schon im voraus fuer die Antworten :)

: Verschoben durch User
von W.S. (Gast)


Lesenswert?

Adrian schrieb:
> Der Code ist mit CubeMX generiert

Du dankst im Voraus für die Antworten? O ha. Also rein gefühlsmäßig ist 
mir eher danach, dir die Ohren lang zu ziehen. Offenbar ist das 
Verwenden von µC in dieser Firma eine normale Sache und ich unterstelle 
mal, daß auch du im Vorfeld deiner Abschlußarbeit darüber Kenntnisse dir 
angeeignet haben müßtest. Warum also schreibst du dann so ein seltsames 
blockierendes Zeug?

Bei mir sähe sowas etwa so aus:
1
main(..)
2
{ ..
3
4
immerzu:
5
  if (CharAvailable()) SendChar(GetChar());
6
goto immerzu;
7
}
und wenn dazwischen noch ne verarbeitung liegen müßte, dann würde man 
diese logisch zwischen GetChar und SendChar dazwischenbauen.

W.S.

von adrian (Gast)


Lesenswert?

tolle antwort, bringt mir nichts, da du die frage nicht verstanden hast. 
habe schon oft gelesen, dass die leute hier naja solche antworten 
schreiben anstatt zu helfen oder eine genauere beschreibung der 
situation zu fordern. denke es liegt am rs485 treiber und nicht am code, 
so wie du das meinst oder denks es wäre der grund. while(1) oder goto 
macht kein unterscheid. beim KO habe ich auch noch gesehen, dass der 
high pegel von B nicht auf high geht sondern wie A auf low bleibt beim 
senden des bytes :/

deine unterstellungen sind falsch, der stm32 benutzten wir nicht in der 
firma, genau so wie cubeMx oder truestudio. dies wurde vom 
experten/fachvorgesetzten vorbestummen.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Adrian schrieb:
> Ich danke schon im voraus fuer die Antworten :)

 Schon mal mit HAL_UART_Receive_IT und LED an irgendeinem PIN
 probiert (nur zum Testen) ?


> macht kein unterscheid. beim KO habe ich auch noch gesehen, dass der
> high pegel von B nicht auf high geht sondern wie A auf low bleibt beim
> senden des bytes :/

 Muss er auch nicht unbedingt.
 RS485 arbeitet differentiell, es wird die DIFFERENZ beider Signale
 gemessen.

 A=0V, B=0.2V ist genauso gültig wie A=5V, B=4.8V oder A=5V, B=0.2V.

: Bearbeitet durch User
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.