4. Uso de M601 UART

1 API y estructura de datos relacionados con UART


Para conocer la estructura de datos y la API que se presentan en este artículo, consulte el archivo zyf_uart.h en el SDK.


1.1 Resumen


En OpenCPU, los puertos serie incluyen puertos serie físicos y puertos serie virtuales. El puerto serie físico se puede conectar a dispositivos externos y el puerto serie virtual se utiliza para la comunicación entre el programa de aplicación y el sistema operativo subyacente. Uno de los puertos seriales físicos tiene una función de protocolo de enlace de hardware y los otros son interfaces de tres cables. OpenCPU admite dos puertos serie virtuales para la comunicación entre la aplicación y el núcleo. Estos puertos seriales están diseñados con información RI y DCD de acuerdo con las características de los puertos seriales físicos. El nivel de DCD puede indicar si el puerto serie virtual está en modo de datos o en modo de comando AT.


1.2 Uso


La inicialización y el uso del puerto serie físico y el puerto serie virtual se pueden completar mediante los siguientes pasos.
Paso 1: Utilice ZYF_UartRegister para registrar la función de devolución de llamada del puerto serie.
Paso 2: Utilice ZYF_UartOpen para abrir el puerto serie
Paso 3: Utilice ZYF_UartWrite para escribir datos en el puerto serie. Cuando el número real de bytes enviados es menor que el número de bytes que se enviarán, la aplicación debe dejar de enviar datos y la aplicación recibirá el evento EVENT_UART_READY_TO_WRITE de la función de devolución de llamada. Después de recibir el evento, la aplicación puede continuar enviando datos y también se envían los datos que no se han enviado antes.
Paso 4: En la función de devolución de llamada, maneje la notificación del puerto serie. Si el tipo de notificación es EVENT_UART_READY_TO_WRITE, el desarrollador debe leer todos los datos del búfer UART RX; de lo contrario, cuando nuevos datos ingresen al búfer UART RX, este mensaje no notificará a la aplicación.


1.3 API relacionada con UART


1.3.1 Registro de puerto serie ZYF_UartRegister
 Prototipo de función
int32_t ZYF_UartRegister (puerto Enum_SerialPort, PsFuncPtrcallback_uart)
 Parámetros

puerto:
[entrada] El nombre del puerto serie. El valor está en Enum_SerialPort
callback_uart:
[entrada] Función de devolución de llamada de registro de puerto serie
 Devolver resultado
ZYF_RET_OK éxito
Otros valores fallan

1.3.2 ZYF_UartOpen Abrir el puerto serie
 Prototipo de función
int32_t ZYF_UartOpen (puerto Enum_SerialPort, uint32_t baudrate, Enum_FlowCtrl flowCtrl)

Puerto de parámetro :
[entrada] El nombre del puerto serie. El valor está en Enum_SerialPort
velocidad en baudios:
[entrada] Puerto serie velocidad en baudios
flowCtrl:
[entrada] Control de flujo, el valor está en Enum_FlowCtrl
 Devolver resultado
ZYF_RET_OK éxito
Otros valores fallan

1.3.3 ZYF_UartWrite Puerto serie para enviar datos
 Prototipo de función
int32_t ZYF_UartWrite (puerto Enum_SerialPort, uint8_t * datos, uint32_t writeLen)

Puerto de parámetro :
[entrada] El nombre del puerto serie. El valor está en Enum_SerialPort
data:
[input] Los datos que se enviarán
writeLen:
[input] La longitud de los datos enviados
 El resultado devuelto
Si> = 0, la transmisión es exitosa, la longitud de los datos de la transmisión exitosa se devuelve
Otros valores fallan
Si <0, la transmisión falla

1.3.4 ZYF_UartRead datos de lectura del puerto serie
 Prototipo de función
int32_t ZYF_UartRead (puerto Enum_SerialPort, uint8_t * datos, uint32_t readLen)

Puerto de parámetro :
[entrada] El nombre del puerto serie. El valor está en Enum_SerialPort
datos:
[salida] lee los datos del puerto serie
writeLen:
[entrada] la longitud de los datos leídos
 Devuelve el resultado
Si> = 0, lee el objeto correctamente, devuelve la longitud de los datos leídos
Otros valores fallan
Si <0, lee fracaso

1.3.5 ZYF_UartClose Cerrar el puerto serie
 Prototipo de función
int32_t ZYF_UartClose (puerto Enum_SerialPort)

Puerto de parámetro :
[entrada] El nombre del puerto serie. El valor está en Enum_SerialPort
 Devolver resultado
NINGUNO
1.3.6 ZYF_UartOpenEx Configurar las propiedades del puerto serie y abrir el puerto serie
 Prototipo de función
int32_tZYF_UartOpenEx (puerto Enum_SerialPort, ST_UARTDCB * dcb)

Puerto de parámetro :
[entrada] El nombre del puerto serie. El valor está en Enum_SerialPort dcb
:
[entrada] parámetro de atributo de puerto serie. El valor está en ST_UARTDCB
 Devolver resultado

ZYF_RET_OK se realizó correctamente. Otros valores fallan

1.3.7 ZYF_UartGetDCBConfig Obtener propiedades del puerto serie
 Prototipo de función
int32_t ZYF_UartGetDCBConfig (puerto Enum_SerialPort, ST_UARTDCB * dcb)

Puerto de parámetro :
[entrada] El nombre del puerto serie. El valor está en Enum_SerialPort dcb
:
[Salida] Parámetro de atributo de puerto serie
 El resultado
devuelto ZYF_RET_OK es exitoso. Otros valores fallan
1.3.8 ZYF_UartSetDCBConfig Establecer las propiedades del puerto serie
 Prototipo de función
int32_t ZYF_UartSetDCBConfig (puerto Enum_SerialPort, ST_UARTDCB * dcb)

Puerto de parámetro : [entrada] El nombre del puerto serie. El valor está en Enum_SerialPort dcb
: [entrada] Establecer parámetros de propiedad del puerto serie
 El resultado
devuelto ZYF_RET_OK es exitoso. Otros valores fallan

1.3.9 Función de devolución de llamada de registro ZYF_UartWriteCbRegister
 Prototipo de función
int32_t ZYF_UartWriteCbRegister (puerto Enum_SerialPort, PsFuncPtr
write_callback, void * Param)
 Parámetros

puerto: [entrada] El nombre del puerto serie. El valor está en Enum_SerialPort
write_callback: [salida] Apunta a la función de devolución de llamada de la finalización de la escritura del puerto serie
 El resultado
devuelto ZYF_RET_OK es exitoso. Otros valores fallan

1.3.10 ZYF_UartWriteCallbackSwitch Interruptor de notificación de devolución de llamada de finalización de escritura del puerto serie
 Prototipo de función
int32_t ZYF_UartWriteCallbackSwitch (puerto Enum_SerialPort, uint8_t on_off)

Puerto de parámetro : [entrada] El nombre del puerto serie. El valor está en Enum_SerialPort
on_off: [entrada] Activar / desactivar la función
 El resultado
devuelto ZYF_RET_OK es exitoso. Otros valores fallan

2 Introducción a la rutina UART


Este capítulo presenta principalmente cómo usar app_uart.c en SDK para probar la función UART por separado.
Método de compilación:. \ Examples \ build \ corresponde al archivo .bat haciendo doble clic para ejecutarlo o abriéndolo para compilar.
Archivo generado:. \ Out \ directorio correspondiente \ hex \ M601_example _ **. Pac


1. Registre el puerto serie y reciba la función de devolución de llamada de lectura de datos a través de ZYF_UartRegister ().
2. Registre la función de devolución de llamada de escritura de datos de envío del puerto serie a través de ZYF_UartWriteCbRegister ().
3. Utilice ZYF_UartOpen () para configurar la velocidad en baudios y el control de flujo, y abra el puerto serie.
4. Los datos recibidos se procesan en UartReadCallBack ().
5. El resultado del envío de datos se procesa en 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");
}


 

Supongo que te gusta

Origin blog.csdn.net/w_hizyf_m/article/details/107083189
Recomendado
Clasificación