《HarmonyOS开发 – 小凌派-RK2206开发笔记》第4章 串口应用开发

开发环境:

开发系统:Ubuntu 20.04
开发板:小凌派-RK2206开发板
OpenHarmony版本:3.0.0-LTS

4.1串口简介

串口是一个泛称,UART、TTL、RS232、RS485、RS422都可以说是串口。一般的MCU内部集成了UART接口,即通用异步收发器(Universal Asynchronous Receiver/Transmitter);MCU的串口一般为遵循TTL电平的TTL串口;RS232、RS485、RS485则通常作为设备的外设串口使用。当然啦,要想了解更多串口的信息,请自行查阅相关资料吧,RK2206开发板板载2路串口,UART1用做了debug接口,UART0可以供用户使用,其接口如下:

XZg0fJ.md.png

本文将使用UART0来讲解。

4.2串口驱动介绍

RK2206硬件相关的驱动写好了的,是通过静态库的方式给出的,在device/rockchip/hardware目录下,库的名字是libhardware.a。

串口相关函数的头文件是在device/rockchip/rk2206/adapter/include/lz_hardware/目录下的uart.h文件中。

串口的使用需要了解UartAttribute结构体,这个结构用于配置串口的各个参数。

/**
 * @brief Defines basic attributes of a UART port.
 *
 * @since 2.2
 * @version 2.2
 */
typedef struct {
    /** Baud rate */
    unsigned int baudRate; //波特率
    /** Data bits */
    UartIdxDataBit dataBits;  //数据长度
    /** Stop bit */
    UartStopBit stopBits; //停止位
    /** Parity */
    UartParity parity; //校验位
    /** Rx block state */
    UartBlockState rxBlock;
    /** Tx block state */
    UartBlockState txBlock;
    /** Padding bit */
    unsigned char pad;
} UartAttribute;

主要有以下API:

unsigned int LzUartInit(unsigned int id, const UartAttribute *param);//串口初始化
unsigned int LzUartRead(unsigned int id, unsigned char *data, unsigned int dataLen);//读定长字符
unsigned int LzUartWrite(unsigned int id, const unsigned char *data, unsigned int dataLen);//写定长字符
unsigned int LzUartPutc(unsigned int id, char c);//读取当字符
unsigned int LzUartDeinit(unsigned int id);//释放串口

4.3串口实例

RK2206开发板的仓库中已经有串口的例子,简单配置下就可以使用了。

XZgrlR.md.png

修改 vendor/lockzhiner/rk2206/samples 路径下 BUILD.gn 文件,指定 uart_example 参与编译。

"./b6_uart:uart_example",

修改 device/rockchip/rk2206/sdk_liteos路径下 Makefile 文件,添加 -luart_example 参与编译。

hardware_LIBS = -lhal_iothardware -lhardware -luart_example

值得注意的是,官方的文档有误,请根据实际情况修改信息。

然后就可以使用串口了。

官方的例子默认是使用的串口0,笔者这里稍微修改uart_example.c的uart_process()函数。

void uart_process(void)
{
    unsigned int ret;
    UartAttribute attr;
    unsigned char txStr[] = "HelloWorld!\n";
    unsigned char rxStr[10];
    LzUartDeinit(UART_ID);

    attr.baudRate = 115200;
    attr.dataBits = UART_DATA_BIT_8;
    attr.pad = FLOW_CTRL_NONE;
    attr.parity = UART_PARITY_NONE;
    attr.rxBlock = UART_BLOCK_STATE_NONE_BLOCK;
    attr.stopBits = UART_STOP_BIT_1;
    attr.txBlock = UART_BLOCK_STATE_NONE_BLOCK;

    PinctrlSet(GPIO0_PB6, MUX_FUNC2, PULL_KEEP, DRIVE_LEVEL2);
    PinctrlSet(GPIO0_PB7, MUX_FUNC2, PULL_KEEP, DRIVE_LEVEL2);

    ret = LzUartInit(UART_ID, &attr);
    if (ret != LZ_HARDWARE_SUCCESS)
    {
        printf("%s, %d: LzUartInit(%d) failed!\n", __FILE__, __LINE__, ret);
        return;
    }

    memset(rxStr, 0, sizeof(rxStr));
    while (1)
    {
        printf("write: %s \n",txStr);
        ret = LzUartWrite(UART_ID, txStr, strlen(txStr));
        if (ret != LZ_HARDWARE_SUCCESS)
        {
            printf("%s, %d: LzUartInit(%d) failed!\n", __FILE__, __LINE__, ret);
            return;
        }

    ret = LzUartRead(UART_ID, rxStr, 10);
    printf("Read: %s\n",rxStr);

    LOS_Msleep(2000);
    }

    return;
}

接下来根据前面的文件编译,下载固件。

Debug串口信息如下:

XZgcm6.md.png

UART0串口信息如下:

XZgWkD.md.png

当我们使用UART0发送信息,UART0和UART1打印信息如下:

XZghfH.md.png

UART0将接收到的信息通过debug串口又打印出来。

好了,串口的使用就到这里了。


欢迎访问我的网站

BruceOu的哔哩哔哩
BruceOu的主页
BruceOu的博客
BruceOu的CSDN博客
BruceOu的简书
BruceOu的知乎


欢迎订阅我的微信公众号

1.关注公众号[嵌入式实验楼]获取更多资讯

Related posts

Leave a Comment