[STM32] HAL ライブラリは 3 つのステップでシリアル ポート リダイレクトを実装します (コード コピーが利用可能)

目次

ステップ 1: 標準入力および出力ヘッダー ファイルを追加する

ステップ 2: fputc() 関数を書き直す

ステップ 3: fgetc() 関数を書き直す

コードの概要 (直接コピー使用用) - 直接コピーに必要


PC 上で C 言語プログラムを開発する場合、C 言語の定型出力関数 printf() を使用してプログラムの実行結果を表示画面に送信して表示したり、定型入力関数 scanf() を使用して読み込むことができます。キーボードからの結果、入力された情報。組み込みシステムの開発では、プログラムの実行結果やデバッグ情報を PC に送信して表示したり、キーボードから入力された情報を読み取って人間とコンピュータの良好なインタラクションを実現したりすることも期待されています。

HALライブラリが提供するシリアルポートトランシーバ機能は比較的単純な機能であり、フォーマットされた入出力は行えません。C 言語に似たフォーマットされた入出力関数を実装する場合は、printf() 関数の出力と scanf() 関数の入力をシリアル ポートにリダイレクトする必要があります。

具体的な実装方法は、ユーザがC言語の標準ライブラリ関数と同名の関数を記述し、リンカが標準ライブラリ関数と同名の関数を記述したことを確認した場合に、標準ライブラリ関数を実現するために、ユーザが最初に記述した関数を間接的に改変する(標準ライブラリ関数内の同名関数をweak属性で定義する)。

printf()関数はfputc()関数を呼び出すことでデータ出力を実現し、scanf()関数はfgetc()関数を呼び出すことでデータ入力を実現するため、ユーザーはこれら2つの関数を書き換えてリダイレクトを実現する必要があります。シリアルポート。

リダイレクトする前に、シリアル ポートを設定し、シリアル ポートのポーリング モードを使用する必要があります。

注: printf() 関数および scan() 関数は MDK ソフトウェアが提供する C 言語の標準ライブラリ関数であるため、プログラム作成完了後、MDK のプロジェクト設定ウィンドウで「ターゲット」タブを選択する必要もあります。ソフトウェアの「Use MicroLIB」オプション。「MicroLIBを使用する」にチェックが入っていない場合は使用できません。

ステップ 1: printf() 関数と scanf() 関数はメイン プログラムで呼び出されるため、標準入出力ヘッダー ファイル stdio.h を追加する必要があります。

/* USER CODE BEGIN Includes*/

#include <stdio.h>// 包含标准输入输出头文件

/* USER CODE END Includes*/

ステップ 2: fputc() 関数を書き直す

int fputc(int ch,FILE *f)

{

//采用轮询方式发送1字节数据,超时时间设置为无限等待

HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);

return ch;

}

注: エントリ パラメータ ch は整数変数であり、関数 HAL_UART_Transmit() のエントリ パラメータ pdata は符号なし文字型へのポインタであるため、int を uint8_t* に変換するには強制的な型変換が必要です。

HAL_MAX_DELAY は無限待機を意味します。これは、たとえば 1000 に変更できます。

ステップ 3: fgetc() 関数を書き直す

int fgetc(FILE *f)

{

uint8_t ch;

// 采用轮询方式接收 1字节数据,超时时间设置为无限等待

HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );

return ch;

}

注: scanf() 関数を呼び出してシリアル ポート データを読み取る場合は、入力の末尾としてスペースを使用する必要があります。したがって、シリアル ポート デバッグ アシスタントにデータを入力するときは、スペースで終わってから送信ボタンをクリックする必要があります。そうしないと、データを正しく受信できません。

scanf()関数は、スペースを含まない文字列のみを受け入れることができます。ユーザーがスペースを含む文字列を受信する必要がある場合、最初にバイトごとに受信する必要があります。受信処理中に、文字列「\r」と「\n」が文字列であるかどうかを継続的に判断することで、文字列が受信されたかどうかが判断されます。受け取った。このとき、シリアルポートデバッグアシスタントの送信エリアに完全な文字列を入力した後、終了としてキーボードの「ENTER」キーを押してください。

コードの概要 (コピーして直接使用):

#include <stdio.h>// 包含标准输入输出头文件

int fputc(int ch,FILE *f)
{
//采用轮询方式发送1字节数据,超时时间设置为无限等待
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch;
// 采用轮询方式接收 1字节数据,超时时间设置为无限等待
HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );
return ch;
}

おすすめ

転載: blog.csdn.net/weixin_45015121/article/details/129718556