1 UART関連のデータ構造とAPI
この記事で紹介したデータ構造とAPIについては、SDKのzyf_uart.hファイルを参照してください。
1.1概要
OpenCPUでは、シリアルポートには物理シリアルポートと仮想シリアルポートが含まれます。物理シリアルポートは外部デバイスに接続でき、仮想シリアルポートはアプリケーションと基盤となるオペレーティングシステム間の通信に使用されます。物理シリアルポートの1つにハードウェアハンドシェイク機能があり、他のポートは3線式インターフェイスです。OpenCPUは、アプリとコア間の通信用に2つの仮想シリアルポートをサポートしています。これらのシリアルポートは、物理シリアルポートの特性に応じてRIおよびDCD情報を使用して設計されています。DCDのレベルは、仮想シリアルポートがデータモードかATコマンドモードかを示します。
1.2使用法
物理シリアルポートと仮想シリアルポートの初期化と使用は、次の手順で完了できます。
手順1:ZYF_UartRegisterを使用して、シリアルポートのコールバック関数を登録します。
ステップ2:ZYF_UartOpenを使用してシリアルポートを開く
ステップ3:ZYF_UartWriteを使用してシリアルポートにデータを書き込む 実際に送信されたバイト数が送信されるバイト数より少ない場合、アプリケーションはデータの送信を停止し、アプリケーションはコールバック関数からEVENT_UART_READY_TO_WRITEイベントを受け取ります。イベントを受信した後、アプリケーションはデータを送信し続けることができ、以前に送信されたことのないデータも送信されます。
手順4:コールバック関数で、シリアルポートの通知を処理します。通知タイプがEVENT_UART_READY_TO_WRITEの場合、開発者はUART RXバッファーからすべてのデータを読み取る必要があります。それ以外の場合、新しいデータがUART RXバッファーに入ると、このメッセージはアプリケーションに通知されません。
1.3 UART関連のAPI
1.3.1 ZYF_UartRegisterシリアルポートの登録
関数プロトタイプ
int32_t ZYF_UartRegister(Enum_SerialPort port、PsFuncPtrcallback_uart)
パラメータ
port:
[入力]シリアルポートの名前。値はEnum_SerialPort
callback_uartにあります:
[入力]シリアルポート登録コールバック関数
返される結果
ZYF_RET_OK成功
その他の値失敗
1.3.2 ZYF_UartOpenシリアルポートを開く
関数プロトタイプ
int32_t ZYF_UartOpen(Enum_SerialPort port、uint32_t baudrate、Enum_FlowCtrl flowCtrl)
パラメータ
ポート:
[入力]シリアルポートの名前。値はEnum_SerialPort
ボーレートにあります:
[入力]シリアルポートボーレート
flowCtrl:
[入力]フロー制御、値はEnum_FlowCtrlにあります
戻り結果
ZYF_RET_OK成功
その他の値失敗
1.3.3データを送信するZYF_UartWriteシリアルポート
関数プロトタイプ
int32_t ZYF_UartWrite(Enum_SerialPort port、uint8_t * data、uint32_t writeLen)
パラメータ
ポート:
[入力]シリアルポートの名前。値はEnum_SerialPort
データにあります:
[input]送信されるデータ
writeLen:
[input]送信されたデータの長さ
戻り結果
> = 0の場合、送信は成功し、送信成功のデータ長が返されます
その他の値fail
が<0の場合、送信は失敗します
1.3.4 ZYF_UartReadシリアルポート読み取りデータ
関数プロトタイプ
int32_t ZYF_UartRead(Enum_SerialPort port、uint8_t * data、uint32_t readLen)
パラメーター
ポート:
[入力]シリアルポートの名前。値はEnum_SerialPort
データにあります:
[出力]シリアルポートのデータを読み取ります
writeLen:
[入力]読み取りデータの長さ
戻り結果
> = 0の場合、オブジェクトを正常に読み取り、読み取りデータの長さを返します
その他の値失敗
<0の場合、読み取り失敗
1.3.5 ZYF_UartCloseシリアルポートを閉じる
関数プロトタイプ
int32_t ZYF_UartClose(Enum_SerialPortポート)
パラメータ
ポート:
[入力]シリアルポートの名前。値はEnum_SerialPortにあります
結果を返します
NONE
1.3.6 ZYF_UartOpenExシリアルポートプロパティを構成し、シリアルポートを開きます
関数プロトタイプ
int32_tZYF_UartOpenEx(Enum_SerialPortポート、ST_UARTDCB * dcb)
パラメーター
ポート:
[入力]シリアルポートの名前。値はEnum_SerialPort dcbにあり
ます:
[入力]シリアルポート属性パラメーター。値はST_UARTDCBにあります
結果を返します
ZYF_RET_OKが成功しました。その他の値は失敗します
1.3.7 ZYF_UartGetDCBConfigシリアルポートプロパティの取得
関数プロトタイプ
int32_t ZYF_UartGetDCBConfig(Enum_SerialPort port、ST_UARTDCB * dcb)
パラメータ
ポート:
[入力]シリアルポートの名前。値はEnum_SerialPort dcbにあり
ます:
[出力]シリアルポート属性パラメーター
戻り結果
ZYF_RET_OKが成功しました。その他の値fail
1.3.8 ZYF_UartSetDCBConfigシリアルポートプロパティの設定
関数プロトタイプ
int32_t ZYF_UartSetDCBConfig(Enum_SerialPort port、ST_UARTDCB * dcb)
パラメータ
ポート:[入力]シリアルポートの名前。値はEnum_SerialPort dcbにあり
ます:[input]シリアルポートプロパティのパラメーターを設定します
戻り結果
ZYF_RET_OKが成功しました。その他の値は失敗します
1.3.9 ZYF_UartWriteCbRegisterレジスタコールバック関数
関数プロトタイプ
int32_t ZYF_UartWriteCbRegister(Enum_SerialPort port、PsFuncPtr
write_callback、void * Param)
パラメータ
port:[input]シリアルポートの名前。値はEnum_SerialPortにあります
write_callback:[output]シリアルポート書き込みの完了のコールバック関数を指します
戻り結果
ZYF_RET_OKが成功しました。その他の値は失敗します
1.3.10 ZYF_UartWriteCallbackSwitchシリアルポート書き込み完了コールバック通知スイッチ
関数プロトタイプ
int32_t ZYF_UartWriteCallbackSwitch(Enum_SerialPort port、uint8_t on_off)
パラメーター
ポート:[入力]シリアルポートの名前。値はEnum_SerialPortにあります
on_off:[input]関数をオン/オフにします
戻り結果
ZYF_RET_OKが成功しました。その他の値は失敗します
2 UARTルーチンの紹介
この章では主に、SDKでapp_uart.cを使用してUART機能を個別にテストする方法を紹介します。
コンパイル方法:。\ examples \ build \は、ダブルクリックして実行するか、ファイルを開いてコンパイルすると、.batファイルに対応します。
生成されたファイル:。\ out \ corresponding directory \ hex \ M601_example _ **。pac
1.シリアルポートを登録し、ZYF_UartRegister()を介してデータ読み取りコールバック関数を受信します。
2. ZYF_UartWriteCbRegister()を使用して、シリアルポートのデータ送信書き込みコールバック関数を登録します。
3. ZYF_UartOpen()を使用して、ボーレートとフロー制御を構成し、シリアルポートを開きます。
4.受信したデータはUartReadCallBack()で処理されます。
5.データ送信の結果は、UartWriteCallBack()で処理されます。
#include <string.h>
#include <stdlib.h>
#include "zyf_trace.h"
#include "zyf_uart.h"
#include "zyf_error.h"
#include "zyf_thread.h"
#include "zyf_timer.h"
#include "zyf_app.h"
static Uart_Param_t g_uart1param;
static Uart_Param_t g_uart2param;
static Uart_Param_t g_uart3param;
void UartWriteCallBack(void* Param) // general com
{
Uart_Param_t *uartparam = (Uart_Param_t *)Param;
if(Param == NULL)
{
return;
}
ZYF_UartWrite(uartparam->port,(uint8_t *)"UartWrite succeed\r\n",strlen("UartWrite succeed\r\n"));
ZYF_UartWriteCallbackSwitch(uartparam->port,false);
}
void UartReadCallBack(void* Param) //
{
uint32_t recvlen = 0;
Uart_Param_t *uartparam = (Uart_Param_t *)Param;
/*
UART_PORT1 = 0,
UART_PORT2 = 1,
UART_PORT3 = 2,
*/
ZYF_LOG("Uart%d recv",uartparam->port);
while(ZYF_UartRead(uartparam->port, &(uartparam->uartbuf[recvlen]), 1))
{
ZYF_LOG("recv :%02x",uartparam->uartbuf[recvlen]);
recvlen++;
}
ZYF_UartWrite(uartparam->port,uartparam->uartbuf,recvlen);
ZYF_UartWriteCallbackSwitch(uartparam->port,true);
}
static void _AppUart1Init(void)
{
int32_t ret;
g_uart1param.port = UART_PORT1;
ZYF_UartRegister(g_uart1param.port, UartReadCallBack,&g_uart1param);
ZYF_UartWriteCbRegister(g_uart1param.port,UartWriteCallBack,&g_uart1param);
ZYF_UartOpen(g_uart1param.port, 115200, ZYF_FC_NONE);
// ST_UARTDCB uartDcb = {0};
// uartDcb.baudrate = 115200;
// uartDcb.dataBits = DB_8BIT;
// uartDcb.flowCtrl = ZYF_FC_NONE;
// uartDcb.parity = PB_NONE;
// uartDcb.stopBits = SB_ONE;
// ret = ZYF_UartOpenEx(g_uart1param.port,&uartDcb);
ZYF_LOG("_AppUart1Init");
return;
}
static void _AppUart2Init(void)
{
g_uart2param.port = UART_PORT2;
ZYF_UartRegister(UART_PORT2, UartReadCallBack,&g_uart2param);
ZYF_UartWriteCbRegister(UART_PORT2,UartWriteCallBack,&g_uart2param);
ZYF_UartOpen(UART_PORT2, 115200, ZYF_FC_NONE);
ZYF_LOG("_AppUart2Init");
return;
}
static void _AppUart3Init(void)
{
g_uart3param.port = UART_PORT3;
ZYF_UartRegister(UART_PORT3, UartReadCallBack,&g_uart3param);
ZYF_UartWriteCbRegister(UART_PORT3,UartWriteCallBack,&g_uart3param);
ZYF_UartOpen(UART_PORT3, 115200, ZYF_FC_NONE);
ZYF_LOG("_AppUart3Init");
return;
}
void ZYF_AppUartInit(void)
{
_AppUart1Init();
_AppUart2Init();
_AppUart3Init();
}
void UartThread_Example(void * Param)
{
ZYF_MsgQ_t *ptMsg;
ZYF_AppMsg_t tMsg;
int iRet = -1;
ptMsg = ZYF_MsgQCreate(10, sizeof(ZYF_AppMsg_t));
ZYF_LOG("thread enter!");
while (1) {
ZYF_LOG("in while.");
iRet = ZYF_MsgQGet(ptMsg, (void *)&tMsg);
if (iRet < 0) {
ZYF_LOG("Failed to get msg");
ZYF_ThreadSleep(1000);
}
}
}
static void prvInvokeGlobalCtors(void)
{
extern void (*__init_array_start[])();
extern void (*__init_array_end[])();
size_t count = __init_array_end - __init_array_start;
for (size_t i = 0; i < count; ++i)
__init_array_start[i]();
}
int appimg_enter(void *param)
{
ZYF_AppUartInit();
ZYF_LOG("application image enter, param 0x%x", param);
prvInvokeGlobalCtors();
ZYF_ThreadCreate("UartThread_Example", UartThread_Example, NULL, ZYF_PRIORITY_HIGH, 10*1024);
return 0;
}
void appimg_exit(void)
{
OSI_LOGI(0, "application image exit");
}