全部文档
OneOS简介 硬件支持 编译构造工具 API参考文档 高级语言 用户编程手册 应用笔记 FAQ

Serial设备


API列表

接口 说明
os_device_find() 查找设备
os_device_open() 打开设备
os_device_read() 读取数据
os_device_write() 写入数据
os_device_control() 控制设备
os_device_set_rx_indicate() 设置接收回调函数
os_device_set_tx_complete() 设置发送完成回调函数
os_device_close() 关闭设备

os_device_find

该函数根据串口名查找对应的串口设备,函数原型如下:

os_device_t *os_device_find(const char *name);
参数 说明
name 串口名(uart1,uart2 等)
返回 说明
设备指针 成功返回对应的设备指针
OS_NULL 没有找到指定的串口

os_device_open

该函数用于打开设备,第一次打开设备会调用设备初始化接口,函数原型如下:

os_err_t os_device_open(os_device_t *dev, os_uint16_t oflag);
参数 说明
dev 设备指针
oflag 设备模式标志
返回 说明
OS_EOK 设备打开成功
OS_EBUSY 设备忙,即:带有独占属性的设备不允许被重复打开
其他错误码 设备打开失败

oflag 参数支持下列取值 (串口收发支持轮询、中断、DMA,如果不指定标志,默认使用轮询模式):

#define OS_DEVICE_FLAG_INT_RX           0x100           /**< INT mode on Rx */
#define OS_DEVICE_FLAG_DMA_RX           0x200           /**< DMA mode on Rx */
#define OS_DEVICE_FLAG_INT_TX           0x400           /**< INT mode on Tx */
#define OS_DEVICE_FLAG_DMA_TX           0x800           /**< DMA mode on Tx */

os_device_read

该函数用于从串口中读取数据,函数原型如下:

os_size_t os_device_read(os_device_t *dev, os_off_t pos, void *buffer, os_size_t size);
参数 说明
dev 设备指针
pos 读取数据偏移量,此参数串口设备未使用
buffer 缓冲区指针,读取的数据将会被保存在缓冲区中
size 读取数据的大小
返回 说明
读到数据的实际大小 如果是字符设备,返回大小以字节为单位
0 需要读取当前线程的 errno 来判断错误状态

os_device_write

该函数用于向串口中写入数据,函数原型如下:

os_size_t os_device_write(os_device_t *dev, os_off_t pos, const void *buffer, os_size_t size);
参数 说明
dev 设备指针
pos 写入数据偏移量,此参数串口设备未使用
buffer 内存缓冲区指针,放置要写入的数据
size 写入数据的大小
返回 说明
写入数据的实际大小 如果是字符设备,返回大小以字节为单位;
0 需要读取当前线程的 errno 来判断错误状态

os_device_control

该函数用于对串口设备进行配置,如波特率、数据位、校验位、接收缓冲区大小、停止位等参数,函数原型如下:

os_err_t os_device_control(os_device_t *dev, int cmd, void *arg);
参数 说明
dev 设备指针
cmd 命令控制字,可取值:OS_DEVICE_CTRL_CONFIG
arg 控制的参数,可取类型: struct serial_configure
返回 说明
OS_EOK 函数执行成功
OS_ENOSYS 执行失败,设备不支持 control 接口
其他错误码 执行失败

控制参数结构体 struct serial_configure 原型如下:

struct serial_configure
{
    os_uint32_t baud_rate;

    os_uint32_t data_bits               :4;
    os_uint32_t stop_bits               :2;
    os_uint32_t parity                  :2;
    os_uint32_t bit_order               :1;
    os_uint32_t invert                  :1;
    os_uint32_t rx_bufsz                :16;
    os_uint32_t tx_bufsz                :16;
    os_uint32_t reserved                :6;
};

配置参数可取值如下:

#define BAUD_RATE_2400                  2400
#define BAUD_RATE_4800                  4800
#define BAUD_RATE_9600                  9600
#define BAUD_RATE_19200                 19200
#define BAUD_RATE_38400                 38400
#define BAUD_RATE_57600                 57600
#define BAUD_RATE_115200                115200
#define BAUD_RATE_230400                230400
#define BAUD_RATE_460800                460800
#define BAUD_RATE_921600                921600
#define BAUD_RATE_2000000               2000000
#define BAUD_RATE_3000000               3000000

#define DATA_BITS_5                     5
#define DATA_BITS_6                     6
#define DATA_BITS_7                     7
#define DATA_BITS_8                     8
#define DATA_BITS_9                     9

#define STOP_BITS_1                     0
#define STOP_BITS_2                     1
#define STOP_BITS_3                     2
#define STOP_BITS_4                     3

os_device_set_rx_indicate

该函数用于设置数据接收回调,当串口收到数据时,通知上层应用线程有数据到达,函数原型如下:

os_err_t os_device_set_rx_indicate(os_device_t *dev, os_err_t (*rx_ind)(os_device_t *dev, os_size_t size));
参数 说明
dev 设备指针
rx_ind 回调函数指针
dev 回调函数参数:设备指针
size 回调函数参数:接收缓冲区数据量(字节)
返回 说明
OS_EOK 设置成功

os_device_set_tx_complete

该函数用于设置数据发送完毕回调,当串口数据发送完毕时,通知上层应用线程,函数原型如下:

os_err_t os_device_set_tx_complete(os_device_t *dev, os_err_t (*tx_done)(os_device_t *dev, void *buffer));
参数 说明
dev 设备指针
tx_done 回调函数指针
返回 说明
OS_EOK 设置成功

os_device_close

该函数用于关闭设备,函数原型如下:

os_err_t os_device_close(os_device_t *dev);
参数 说明
dev 设备指针
返回 说明
OS_EOK 关闭设备成功
OS_ERROR 设备已经完全关闭,不能重复关闭设备
其他错误码 关闭设备失败

使用示例

串口轮询收发数据

本例中将测试串口 uart2 的 tx rx 信号线还回,进行自收自发。

#include <drv_cfg.h>
#include <os_tick.h>
#include <shell.h>

static int serial_test(int argc, char *argv[])
{
    int tx_cnt;
    int rx_cnt;
    unsigned char rx_buff[32];
    os_device_t *uart;
    const char *dev_name = "uart2";

    if (argc != 1 && argc != 2)
    {
        os_kprintf("usage: serial_test <dev> \r\n");
        os_kprintf("       dev default is uart2 \r\n");
        return -1;
    }

    if (argc == 2)
    {
        dev_name = argv[1];
    }

    uart = os_device_find(dev_name);
    OS_ASSERT(uart);

    /* open serial device with int rx flag */
    os_device_open(uart, OS_DEVICE_FLAG_INT_RX | OS_DEVICE_OFLAG_RDWR);

    /* tx */
    tx_cnt = os_device_write(uart, 0, "Hello World!\n", sizeof("Hello World!\n"));

    /* wait rx complete */
    os_task_msleep(100);

    /* rx */
    rx_cnt = os_device_read(uart, 0, rx_buff, sizeof(rx_buff));

    os_kprintf("tx_cnt: %d, rx_cnt: %d\n", tx_cnt, rx_cnt);

    if (rx_cnt == sizeof("Hello World!\n"))
    {
        os_kprintf("rx buff:%s\n", rx_buff);
    }
    else
    {
        os_kprintf("rx failed\n");
    }

    os_device_close(uart);

    return 0;
}
SH_CMD_EXPORT(serial_test, serial_test, "serial_test");

运行结果如下:

sh>serial_test uart2
tx_cnt: 14, rx_cnt: 14
rx buff:Hello World!

串口中断收发数据

本例中将测试串口 uart2 的 tx rx 信号线还回,进行自收自发。

#include <drv_cfg.h>
#include <os_tick.h>
#include <shell.h>

static int rx_size = 0;
static int tx_complete = 0;

static os_err_t tx_done(os_device_t *uart, void *buffer)
{    
    os_kprintf("tx done\r\n");
    tx_complete = 1;
    return 0;
}

static os_err_t rx_done(os_device_t *uart, os_size_t size)
{
    os_kprintf("rx done\r\n");
    rx_size = size;
    return 0;
}

static int serial_int_test(int argc, char *argv[])
{
    int tx_cnt;
    int rx_cnt;
    unsigned char rx_buff[32];
    os_device_t *uart;
    const char *dev_name = "uart2";

    if (argc != 1 && argc != 2)
    {
        os_kprintf("usage: serial_test <dev> \r\n");
        os_kprintf("       dev default is uart2 \r\n");
        return -1;
    }

    if (argc == 2)
    {
        dev_name = argv[1];
    }

    uart = os_device_find(dev_name);
    OS_ASSERT(uart);

    rx_size = 0;
    tx_complete = 0;

    /* open serial device with int rx, int tx flag */
    os_device_open(uart, OS_DEVICE_FLAG_INT_RX | OS_DEVICE_FLAG_INT_TX | OS_DEVICE_OFLAG_RDWR);

    os_device_set_rx_indicate(uart, rx_done);
    os_device_set_tx_complete(uart, tx_done);

    /* tx */
    tx_cnt = os_device_write(uart, 0, "Hello World!\n", sizeof("Hello World!\n"));

    /* wait tx complete */
    while (tx_complete == 0);

    if (rx_size == sizeof("Hello World!\n"))
    {
        /* rx */
        rx_cnt = os_device_read(uart, 0, rx_buff, sizeof(rx_buff));

        os_kprintf("tx_cnt: %d, rx_cnt: %d\n", tx_cnt, rx_cnt);

        os_kprintf("rx buff:%s\n", rx_buff);
    }
    else
    {
        os_kprintf("rx failed\n");
    }

    os_device_close(uart);

    return 0;
}
SH_CMD_EXPORT(serial_int_test, serial_int_test, "serial_int_test");

运行结果如下:

sh>serial_int_test uart2
rx done
rx done
rx done
rx done
rx done
rx done
rx done
rx done
rx done
rx done
rx done
rx done
rx done
rx done
tx done
tx_cnt: 14, rx_cnt: 14
rx buff:Hello World!

results matching ""

    No results matching ""

    返回顶部