2016-04-15 18 views
2

Ich sehe HAL die folgende Funktion zum Empfangen von seriellen Daten mit Unterbrechungen liefert aktiviert.
HAL_UART_RxCpltCallback() wird aufgerufen, sobald die Anzahl der empfangenen Bytes Size erreicht.
HAL deaktiviert rx Interrupts kurz vor diesem Rückruf

Problem ausführen: Variable seine
Die Menge des ankommenden Bytes (von 1 bis ~ 100), und ich brauche sie in einen Ringpuffer zu setzen.
So stelle ich Size-1 und rufen HAL_UART_Receive_IT() wieder in den Callback auf Interrupts wieder zu aktivieren, und es funktioniert gut, wenn die Platte 1 oder 2 Bytes hin gesendet wird und dann, aber Bytes jenseits diesesWie uart RX halten Interrupt für immer mit HAL-Bibliothek auf einem STM32F1

verpasst Meine Vermutung ist, sie sind verpasst, weil sie zwischen Interrupt-Deaktivierung ankommen - Aktivieren

Gibt es eine Möglichkeit, Interrupts für immer zu halten, ohne HAL Cube generierten Code zu überschreiben?
Wenn nicht, was wäre eine saubere Möglichkeit, die beteiligten Funktionen zu überschreiben?
Gibt es etwas, das ich vermisse, das die Notwendigkeit, diese Lösung zu finden, vermeiden würde?

+1

Dies ist ein bekanntes Problem, ohne eine einfache Lösung zu sein scheint: http://stackoverflow.com/questions/24875873/stm32f4-uart-hal-driver –

+0

wie DMA scheint, ist die Sache Schreiben von Daten von einem beliebigen Peripheriegerät in einen beliebigen Speicherpuffer einschließlich Ringpuffer (DMA-Einstellungen). Und DMA Interrupts ist der einfache Weg, um alle Daten, oder sogar seine Hälfte, im Moment des Empfangs zu behandeln. – Yuriy

+0

Es hängt nicht wirklich von Ihrer Frage ab. Aber ich denke, dass es sich lohnt, keil io-Fahrer zu testen. Hier ist der Link, wo Sie sie für Ihre MCU finden können https://www.keil.com/dd2/pack/ –

Antwort

0

Sie können versuchen, UART ziehen Weg statt Interrupt Weg. Ziehweg: UART kehrt nicht zurück, bis die vom Parameter "Größe" angegebenen Daten empfangen werden.

+1

Problem ist "Größe" ist variabel und meine Anwendung ist zeitkritisch, deshalb ging ich mit Interrupts in der ersten Ort. Dies funktioniert durch Bearbeiten der HAL-Funktion 'UART_Receive_IT', so dass eingehende Bytes direkt in den Ringpuffer gelangen und Interrupts nicht deaktiviert werden –

0

Ich denke, du musst ein spezielles Zeichen setzen, um das Ende der Massage anzuzeigen, oder du machst dein eigenes Protokoll, z. Nachrichtenkopf, Nachrichtenlänge, Inhalt, Prüfsumme und Sie machen den Interrupt für ein Byte aktiviert und im Interrupt-Handler speichern Sie den empfangenen Puffer, bis Sie das letzte Byte in der Nachricht finden und dann im Fall von RTOS an die Hauptaufgabe senden oder setzen Sie eine globale Flagge. Durch die Art und Weise stellen Sie sicher, in

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); 

innen

HAL_UART_RxCpltCallback 

die entsprechenden Empfang Bytes Größe setzen Sie bitte die Rückgabe von HAL_UART_Receive_IT überprüft es Fehler zurückgeben kann und auch die

void HAL_UART_ErrorCallback(UART_HandleTypeDef *UartHandle); 
implementieren

und prüfen, ob ein Fehler im UART-Bus vorliegt.

0

Versuchen Sie, diese

__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);