4. M601 UARTの使用

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");
}


 

おすすめ

転載: blog.csdn.net/w_hizyf_m/article/details/107083189
おすすめ