5

HAL は、割り込みでシリアル データを受信するための次の関数を提供しているようです。HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
これは、基本的に rx 割り込みをセットアップして戻ります。
HAL_UART_RxCpltCallback()受信したバイト数が に達すると呼び出されますSize
HAL は、このコールバックを実行する直前に rx 割り込みを無効にします

問題:
着信バイトの量は可変 (1 から ~100 まで) であり、それらをリング バッファに入れる必要があります。
したがって、1 に設定Sizeし、コールバック内で再度呼び出しHAL_UART_Receive_IT()て割り込みを再度有効にします。ボードが 1 バイトまたは 2 バイトを時々送信する場合はうまく機能しますが、それ以上のバイトは失われます。

私の推測では、割り込みの無効化と有効化の間に到着するため、それらは見逃されていると思います

HAL Cube で生成されたコードを上書きせずに、割り込みを永久に実行し続ける方法はありますか?
そうでない場合、関連する関数を上書きするクリーンな方法は何でしょうか?
この解決策を見つける必要がないように、私が見逃しているものはありますか?

4

4 に答える 4

0

メッセージの終わりを示すために特殊文字を入れる必要があると思います。または、メッセージヘッダー、メッセージ長、コンテンツ、チェックサムなどの独自のプロトコルを作成し、割り込みを1バイト有効にし、割り込みハンドラーに保存しますメッセージの最後のバイトが見つかるまでバッファを受信し、RTOS の場合はメイン タスクに送信するか、グローバル フラグを設定します。ところで、適切な受信バイトサイズを設定してください

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

中身

HAL_UART_RxCpltCallback

HAL_UART_Receive_ITエラーを返す可能性があるのを確認し、実装してください。

void HAL_UART_ErrorCallback(UART_HandleTypeDef *UartHandle);

UART バスにエラーがないかどうかを確認します。

于 2016-12-31T21:57:50.473 に答える
0

割り込み方式ではなく、ポーリング方式で UART を試すこともできます。ポーリング方法: 「Size」パラメータで指定された量のデータを受信するまで、UART は戻りません。

于 2016-05-11T10:44:09.017 に答える