5. UART_ioctl

5.1. 总览

本示例主要介绍如何设置UART1的多种模式。

5.2. 相关配置

  • 配置参考 uart_echo 中的配置。

  • 使用步骤

  • 将板子的 gpio3gpio4GND 分别与 USB转TTL 串口线的 TXDRXDGND 分别连接起来;

  • 编译 customer_app/sdk_app_uart_ctl 工程并下载工程;

  • 打开一个串口终端窗口A(波特率为115200,用于接收和发送uart消息),打开另一个串口终端窗口B(波特率为2000000,用于打印log)。例如使用应用实现中case1中的配置,在窗口A中输入 123456789abcdef ,在窗口A中可以看到接收到的数据,同时窗口B中打印出接收数据的个数。

5.3. 应用实例

aos_ioctl选项为 IOCTL_UART_IOC_WAITRD_MODEIOCTL_UART_IOC_WAITRDFULL_MODE

while (1) {
    //log_info("ready to read.\r\n");
    waitr_arg.buf = buf_recv;
    waitr_arg.read_size = sizeof(buf_recv);
    waitr_arg.timeout = 0;
    res = aos_ioctl(fd, IOCTL_UART_IOC_WAITRD_MODE, (unsigned long)(&waitr_arg));
    //res = aos_ioctl(fd, IOCTL_UART_IOC_WAITRDFULL_MODE, (unsigned long)(&waitr_arg));
    if (res > 0) {
        log_info("%s name.length = %d:\r\n", name, res);
        aos_write(fd, buf_recv, res);
    }
}
  • case1: waitr_arg.timeout = 0 case1中调用 aos_ioctl(fd, IOCTL_UART_IOC_WAITRD_MODE, (unsigned long)(&waitr_arg)) 表示当串口中的数据都读完或者读取到sizeof(buf_recv)长度的数据时立即返回。调用 aos_ioctl(fd, IOCTL_UART_IOC_WAITRDFULL_MODE, (unsigned long)(&waitr_arg)) 用法与 IOCTL_UART_IOC_WAITRD_MODE 一致。

  • case2: waitr_arg.timeout = AOS_WAIT_FOREVER case2中调用 aos_ioctl(fd, IOCTL_UART_IOC_WAITRD_MODE, (unsigned long)(&waitr_arg)) 表示当串口中的数据都读完或者读取到sizeof(buf_recv)长度的数据时立即返回,串口中无数据则一直等待。调用 aos_ioctl(fd, IOCTL_UART_IOC_WAITRDFULL_MODE, (unsigned long)(&waitr_arg)) 表示一直等待直到读取到sizeof(buf_recv)长度的数据时立即返回。

  • case3: waitr_arg.timeout = 5000 case3中调用 aos_ioctl(fd, IOCTL_UART_IOC_WAITRD_MODE, (unsigned long)(&waitr_arg)) 表示当串口中的数据都读完或者读取到sizeof(buf_recv)长度的数据或者到达超时时间(超时时间从调用此接口算起,不是数据发送结束后算起)时立即返回。调用 aos_ioctl(fd, IOCTL_UART_IOC_WAITRDFULL_MODE, (unsigned long)(&waitr_arg)) 表示读取到sizeof(buf_recv)长度的数据或者到达超时时间(超时时间从调用此接口算起,不是数据发送结束后算起)时立即返回。

aos_ioctl选项为 UART_IOC_BAUD_MODE

aos_ioctl(fd, IOCTL_UART_IOC_BAUD_MODE, 9600);

配置如上, 9600 表示波特率。

aos_ioctl选项为 IOCTL_UART_IOC_READ_BLOCKIOCTL_UART_IOC_READ_NOBLOCK

while (1) {
    length = aos_read(fd, buf_recv, sizeof(buf_recv));
    if (length > 0) {
        log_info("%s name.length = %d:\r\n", name, length);
        aos_write(fd, buf_recv, length);
    }
    vTaskDelay(500);
    log_info("test.\r\n");
    count++;

    if (count == 5) {
        log_info("set noblock.\r\n");
        aos_ioctl(fd, IOCTL_UART_IOC_READ_NOBLOCK, 0);
    }

    if (count == 10) {
        log_info("set block.\r\n");
        aos_ioctl(fd, IOCTL_UART_IOC_READ_BLOCK, 0);
    }
}

aos_ioctl(fd, IOCTL_UART_IOC_READ_BLOCK, 0) 表示读取到sizeof(buf_recv)长度的数据立即返回,否则一致等待。 aos_ioctl(fd, IOCTL_UART_IOC_READ_NOBLOCK, 0) 表示当串口中的数据都读完或者读取到sizeof(buf_recv)长度的数据时立即返回。