Files
mr-library/document/device/serial/serial.md
2024-02-02 16:38:44 +08:00

9.0 KiB
Raw Blame History

SERIAL设备

English

打开SERIAL设备

int mr_dev_open(const char *path, int flags);
参数 描述
path 设备路径
flags 打开设备的标志
返回值
>=0 设备描述符
<0 错误码
  • pathSERIAL设备路径一般为serialx,例如:serial1serial2serial3
  • flags:打开设备的标志,支持 MR_O_RDONLYMR_O_WRONLYMR_O_RDWRMR_O_NONBLOCK

使用时应根据实际情况为不同的任务分别打开SERIAL设备并使用适当的flags进行管理和权限控制,以确保它们不会相互影响。

关闭SERIAL设备

int mr_dev_close(int desc);
参数 描述
desc 设备描述符
返回值
=0 关闭成功
<0 错误码

控制SERIAL设备

int mr_dev_ioctl(int desc, int cmd, void *args);
参数 描述
desc 设备描述符
cmd 命令码
args 命令参数
返回值
=0 设置成功
<0 错误码
  • cmd:命令码,支持以下命令:
    • MR_IOC_SERIAL_SET_CONFIG设置SERIAL设备配置。
    • MR_IOC_SERIAL_SET_RD_BUFSZ:设置读缓冲区大小。
    • MR_IOC_SERIAL_SET_WR_BUFSZ:设置写缓冲区大小。
    • MR_IOC_SERIAL_CLR_RD_BUF:清空读缓冲区。
    • MR_IOC_SERIAL_CLR_WR_BUF:清空写缓冲区。
    • MR_IOC_SERIAL_SET_RD_CALL:设置读回调函数。
    • MR_IOC_SERIAL_SET_WR_CALL:设置写回调函数。
    • MR_IOC_SERIAL_GET_CONFIG获取SERIAL设备配置。
    • MR_IOC_SERIAL_GET_RD_BUFSZ:获取读缓冲区大小。
    • MR_IOC_SERIAL_GET_WR_BUFSZ:获取写缓冲区大小。
    • MR_IOC_SERIAL_GET_RD_DATASZ:获取读缓冲区数据大小。
    • MR_IOC_SERIAL_GET_WR_DATASZ:获取写缓冲区数据大小。
    • MR_IOC_SERIAL_GET_RD_CALL:获取读回调函数。
    • MR_IOC_SERIAL_GET_WR_CALL:获取写回调函数。

设置/获取SERIAL设备配置

SERIAL设备配置

  • baud_rate:波特率。
  • data_bits:数据位数。
  • stop_bits:停止位数。
  • parity:校验位。
  • bit_order:数据传输顺序。
  • polarity:极性反转。
/* 设置默认配置 */
struct mr_serial_config config = MR_SERIAL_CONFIG_DEFAULT;

/* 设置SERIAL设备配置 */
mr_dev_ioctl(ds, MR_IOC_SERIAL_SET_CONFIG, &config);
/* 获取SERIAL设备配置 */
mr_dev_ioctl(ds, MR_IOC_SERIAL_GET_CONFIG, &config);

不依赖SERIAL接口

/* 设置默认配置 */
int config[] = {115200, 8, 1, 0, 0, 0};

/* 设置SERIAL设备配置 */
mr_dev_ioctl(ds, MR_IOC_SCFG, &config);
/* 获取SERIAL设备配置 */
mr_dev_ioctl(ds, MR_IOC_GCFG, &config);

注:如未手动配置,默认配置为:

  • 波特率:115200
  • 数据位数:MR_SERIAL_DATA_BITS_8
  • 停止位数:MR_SERIAL_STOP_BITS_1
  • 校验位:MR_SERIAL_PARITY_NONE
  • 数据传输顺序:MR_SERIAL_BIT_ORDER_LSB
  • 极性反转:MR_SERIAL_POLARITY_NORMAL

设置/获取读/写缓冲区大小

size_t size = 256;

/* 设置读缓冲区大小 */
mr_dev_ioctl(ds, MR_IOC_SERIAL_SET_RD_BUFSZ, &size);
/* 获取读缓冲区大小 */
mr_dev_ioctl(ds, MR_IOC_SERIAL_GET_RD_BUFSZ, &size);

/* 设置写缓冲区大小 */
mr_dev_ioctl(ds, MR_IOC_SERIAL_SET_WR_BUFSZ, &size);
/* 获取写缓冲区大小 */
mr_dev_ioctl(ds, MR_IOC_SERIAL_GET_WR_BUFSZ, &size);

不依赖SERIAL接口

size_t size = 256;

/* 设置读缓冲区大小 */
mr_dev_ioctl(ds, MR_IOC_SRBSZ, &size);
/* 获取读缓冲区大小 */
mr_dev_ioctl(ds, MR_IOC_GRBSZ, &size);

/* 设置写缓冲区大小 */
mr_dev_ioctl(ds, MR_IOC_SWBSZ, &size);
/* 获取写缓冲区大小 */
mr_dev_ioctl(ds, MR_IOC_GWBSZ, &size);

注:如未手动配置,将使用 Kconfig中配置的大小默认为32Byte

清空读/写缓冲区

mr_dev_ioctl(ds, MR_IOC_SERIAL_CLR_RD_BUF, MR_NULL);
mr_dev_ioctl(ds, MR_IOC_SERIAL_CLR_WR_BUF, MR_NULL);

不依赖SERIAL接口

mr_dev_ioctl(ds, MR_IOC_CRBD, MR_NULL);
mr_dev_ioctl(ds, MR_IOC_CWBD, MR_NULL);

获取读/写缓冲区数据大小

size_t size = 0;

/* 获取读缓冲区数据大小 */
mr_dev_ioctl(ds, MR_IOC_SERIAL_GET_RD_DATASZ, &size);

/* 获取写缓冲区数据大小 */
mr_dev_ioctl(ds, MR_IOC_SERIAL_GET_WR_DATASZ, &size);

不依赖SERIAL接口

size_t size = 0;

/* 获取读缓冲区数据大小 */
mr_dev_ioctl(ds, MR_IOC_GRBDSZ, &size);

/* 获取写缓冲区数据大小 */
mr_dev_ioctl(ds, MR_IOC_GWBDSZ, &size);

设置/获取读/写回调函数

/* 定义回调函数 */
void fn(int desc, void *args)
{
    /* 获取缓冲区数据大小 */
    ssize_t data_size = *(ssize_t *)args;
    
    /* 处理中断 */
}
void (*callback)(int desc, void *args);

/* 设置读回调函数 */
mr_dev_ioctl(ds, MR_IOC_SERIAL_SET_RD_CALL, &fn);
/* 获取读回调函数 */
mr_dev_ioctl(ds, MR_IOC_SERIAL_GET_RD_CALL, &callback);

/* 设置写回调函数 */
mr_dev_ioctl(ds, MR_IOC_SERIAL_SET_WR_CALL, &fn);
/* 获取写回调函数 */
mr_dev_ioctl(ds, MR_IOC_SERIAL_GET_WR_CALL, &callback);

不依赖SERIAL接口

/* 定义回调函数 */
void fn(int desc, void *args)
{
    /* 获取缓冲区数据大小 */
    ssize_t data_size = *(ssize_t *)args;
    
    /* 处理中断 */
}
void (*callback)(int desc, void *args);

/* 设置读回调函数 */
mr_dev_ioctl(ds, MR_IOC_SRCB, &fn);
/* 获取读回调函数 */
mr_dev_ioctl(ds, MR_IOC_GRCB, &callback);

/* 设置写回调函数 */
mr_dev_ioctl(ds, MR_IOC_SWCB, &fn);
/* 获取写回调函数 */
mr_dev_ioctl(ds, MR_IOC_GWCB, &callback);

读取SERIAL设备数据

ssize_t mr_dev_read(int desc, void *buf, size_t count);
参数 描述
desc 设备描述符
buf 读取数据缓冲区
count 读取数据大小
返回值
>=0 读取数据大小
<0 错误码
char buf[128];
/* 读取SERIAL设备数据 */
ssize_t size = mr_dev_read(ds, buf, sizeof(buf));
/* 是否读取成功 */
if (size < 0)
{
    
}

注:当未设置读缓冲区时将使用轮询方式同步读取数据。当设置读缓冲区后将从读缓冲区读取指定数量的数据(返回实际读取的数据大小)。

写入SERIAL设备数据

ssize_t mr_dev_write(int desc, const void *buf, size_t count);
参数 描述
desc 设备描述符
buf 写入数据缓冲区
count 写入数据大小
返回值
>=0 写入数据大小
<0 错误码
char buf[] = {"hello world"};
/* 写入SERIAL设备数据 */
ssize_t size = mr_dev_write(ds, buf, sizeof(buf));
/* 是否写入成功 */
if (size < 0)
{
    
}

注:当使用 MR_O_NONBLOCK 打开时会将数据写入写缓冲区返回实际写入的数据大小通过中断或DMA异步发送数据发送完成后会触发写回调函数。 当有数据在异步发送时,写入锁将自动上锁,此时无法同步写入,直至异步发送完成。

使用示例

#include "include/mr_lib.h"

/* 定义串口设备描述符 */
int serial_ds = -1;

void serial_init(void)
{
    /* 初始化串口 */
    serial_ds = mr_dev_open("serial1", MR_O_RDWR); 
    if (serial_ds < 0)
    {
        mr_printf("serial open failed: %s\r\n", mr_strerror(serial_ds));
        return;
    }
    /* 设置串口配置 */
    struct mr_serial_config config = MR_SERIAL_CONFIG_DEFAULT;
    int ret = mr_dev_ioctl(serial_ds, MR_IOC_SERIAL_SET_CONFIG, &config);
    if (ret < 0)
    {
        mr_printf("serial set config failed: %s\r\n", mr_strerror(ret));
    }
}
/* 导出到自动初始化APP级 */
MR_INIT_APP_EXPORT(serial_init);

int main(void)
{
    /* 自动初始化serial_init函数将在此处自动调用 */
    mr_auto_init();

    while (1)
    {
        /* 回环测试 */
        char buf[64];
        ssize_t ret = mr_dev_read(serial_ds, buf, sizeof(buf));
        mr_dev_write(serial_ds, buf, ret);
    }
}

连接串口1在串口软件中进行回环测试发送数据后会在串口软件中显示接收到的数据。