STM32: Ein Zeichen aus dem UART lesen

Gast #6561191
Lesenswert?

Ich möchte ein Zeichen aus dem UART lesen und ausgeben.
Benutze ein Nucleo Board.
Ausgegeben wird das auf CoolTerm.
Es wird aber nichts ausgegeben.
Was ist an meiner getchar-Funktion falsch?
Oder ist der code in der while-Schleife falsch?

So sieht mein Code aus.

char getchar() {
  char data[1];
  HAL_UART_Receive(&huart2, (void*)data, 1, HAL_MAX_DELAY);
  return data[0];
}

while (1)
  {
    HAL_UART_Transmit(&huart2,(uint8_t *) "Test",4,HAL_MAX_DELAY);
    HAL_UART_Transmit(&huart2,(uint8_t *) getchar(),1,HAL_MAX_DELAY);
  }
#6561251
Lesenswert?

Hast du schon getestet RX und TX am PC direkt zu verbinden und damit vom 
PC auf den PC eine Nachricht zu senden?

Funktioniert das senden vom µC auf den PC ohne auf dem µC zu empfangen? 
Ich bin grad selbst am Empfangen dran, jedoch mit DMA. Ist ziemlicher 
Mist, da sollte senden erst mal sauber funktionieren.

Probier erstmal die Hex Zahlen von ASCII fest in ein Array zu schreiben 
und das zu senden.

Danach den Empfangenen Hexwert direkt ohne Umwege wieder senden.

Dann würde ich erst anfangen mit Interpretationen.

Die üblichen Verdächtigen:
- Richtiger COM Port?
- Gleiche Einstellungen µC und PC?
- RX/TX gekreuzt?
Gast #6561450
Lesenswert?

c-hater schrieb:
> c-hater schrieb:
>
>> Kommando zurück, im zweiten Anlauf habe ich den Aufruf gesehen...
>
> Trotzdem ist der Fehler genau hier. getchar liefert ein char, gefordert
> von ist aber offensichtlich ein Zeiger auf ein char.
>
> Schwachsinn, das Problem durch einen cast lösen zu wollen...

Was soll ich anders machen?
Gast #6561824
Lesenswert?

Keine Ahnung, ob das HAL_UART_Receive blocking ist oder nicht.
Ich weiß auch nicht, was das blocking zu bedeuten hat.
So, sieht mein jetziger Code aus und es funktioniert immer noch nicht. 
Siehe Anhang.

void getchar() {
  uint8_t data;
  HAL_UART_Receive(&huart2, &data, 1, 100);
  HAL_UART_Transmit(&huart2, &data,1,100);
}

  while (1)
  {
    uprints("Test\n");
    getchar();
  }
Angehängte Dateien:
Gast #6561836
Lesenswert?

Nick schrieb:

Oh Mann! Kauf dir ein C-Buch, arbeite das durch!

> void getchar() {
>   uint8_t data;
>   HAL_UART_Receive(&huart2, &data, 1, 100);
>   HAL_UART_Transmit(&huart2, &data,1,100);
> }

Du empfängst also kein Zeichen vonm UART, denn an den wird nichts 
gesendet. Das nicht empfangene Zeichen schickst du dann wieder dir 
selbst.
Und das rufst du immer wieder auf und es passiert immer wieder das 
Gleiche:
Empfange nichts, schick das Nichts weg
Empfange nichts, schick das Nichts weg
Empfange nichts, schick das Nichts weg

Nick schrieb:
> while (1)
>   {
>     uprints("Test\n");
>     getchar();
>   }

Wer ist schneller? Der STM oder seine serielle Schnittstelle? Du 
ballerst die Schnittstelle mit "Test" zu, empfänst nicht, schickst das 
nichts weg, ... ad infinitum.
Wohin geht uprints? Ist das das gleiche wie huart2? Warum schickst und 
empfängst du von huart2? Hängt da ein gekreuztes Kabel dran?

Und google nach blocking transmit.
Gast #6561848
Lesenswert?

Nick schrieb:
> Ich will einfach nur wissen, was ich am Code verändern muss.

Und was kommt als nächstes?
Es wurde hier schon gesagt. Versuch die Änderungen anhand deiner 
Unterlagen zu C nachzuvollziehen.
Lies dazu:
static, den '&' operator, Rückgabewerte von Funktionen.
Und lass das casting weg, das ist für dich nix.

Andere werden dir möglicherweise den kompletten code posten, ich nicht. 
Weil von dir keine Initiative kommt. Du hast ganz offensichtlich die 
Antworten und Tips hier nicht gelesen.
Gast #6562730
Lesenswert?

Nick schrieb:
> Keine Ahnung, ob das HAL_UART_Receive blocking ist oder nicht.
> Ich weiß auch nicht, was das blocking zu bedeuten hat.

Tja.

Du willst irgend eine fremde Funktion benutzen, ohne darüber auch nur 
das Geringste zu wissen, was auch das "blockierend" einschließt.

Meinst du nicht, daß du vielleicht zunächst mal versuchen solltest, 
das zu deinem Chip gehörige Referenzmanual zur Hand zu nehmen und dort 
das Kapitel über die UART's zu lesen?

Und auch das Kapitel, das sich mit dem Aufsetzen diverser Bestandteile 
des betreffenden Chips befaßt?

Also den Systemtakt, die Takte für die diversen Peripherie-Cores, die 
Verwendung der diversen Pins des Chips für die verschiedenen Zwecke.

Und dann wäre es Zeit, sich mal darüber klar zu werden, wie das 
Empfangen von Zeichen über einen UART im allgemeinen passiert: Entweder 
sendet da niemand etwas, weswegen der UART auch nix empfangen kann, oder 
es wird was gesendet, aber aus Sicht der CPU mit ihren 72 MHz Takt oder 
noch viel mehr ist das Hereinkommen der Bits in den UART ausgesprochen 
langsam.

Kurzum, man sollte begreifen, daß man von einem Zeichen per UART bis zum 
nächsten Zeichen ziemlich lange warten muß (aus Sicht der CPU). Nun kann 
man ja so verfahren, daß man den UART fragt, ob er denn etwas da hat, 
was man abholen kann und es ggf. dann eben abholen und wenn nix da ist, 
entweder drauf warten oder in der Zwischenzeit irgend etwas anderes 
machen.

Jetzt solltest du auch kapiert haben, was es mit dem Blockieren auf sich 
hat.

Dir rate ich, all solche Dinge SELBST zu schreiben, damit du sie dann 
auch selbst kapiert hast - und eben NICHT elleweil nur irgendwelche 
dir nicht bekannten Fremdfunktionen benutzen zu wollen. Irgendwelches 
Zeugs von ST ist schließlich kein Betriebssystem, das von sich aus die 
Peripherie wie beim PC verwaltet.

W.S.

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