openharmony用ubuntu编写串口
第一部分:代码结构
软件部分目录结构
UART
├─ BUILD.gn
└─UART.c
我们打开文件
代码打开voltage_buttons_thread.c
hi3861 其中 UART 端口有 3 个,其中 UART0 用于调试,每个 GPIO 可复用成 UART 的端口如下:
Pin 管脚名称 复用信号
2 GPIO_00 UART1_TXD
3 GPIO_01 UART1_RXD
4 GPIO_02 UART1_RTS, UART1 的流控管脚,发送请求信号,输出
5 GPIO_03 复用信号 0:UART0_LOG_TXD,数据发送, Debug 和下载串口接口
复用信号 1:UART1_CTS, UART1 的流控管脚,清除发送信号,输入
6 GPIO_04 UART0_LOG_RXD 数据接收, Debug 和下载串口接口
17 GPIO_05 UART1_RXD,数据接收口
18 GPIO_06 UART1_TXD,数据发送口
19 GPIO_07 UART1_CTS,清除发送信号,通信串口
20 GPIO_08 UART1_RTS,发送请求信号,通信串口
27 GPIO_09 UART2_RTS,发送请求信号,通信串口,输出信号
28 GPIO_10 UART2_CTS,发送清除信号,通信串口,输入信号
29 GPIO_11 UART2_TXD
30 GPIO_12 UART2_RXD
31 GPIO_13 复用信号 1:UART2_RTS
复用信号 2:UART0_LOG_TXD
32 GPIO_14 复用信号 1:UART2_CTS
复用信号 2:UART0_LOG_RXD
主要函数
头文件
#include <stdio.h> // 标准输入输出
#include <unistd.h> // POSIX标准接口
#include "ohos_init.h" // 用于初始化服务(services)和功能(features)
#include "cmsis_os2.h" // CMSIS-RTOS API V2
#include "iot_gpio.h" // OpenHarmony API:IoT硬件设备操作接口-GPIO
#include "hi_io.h" // 海思 Pegasus SDK:IoT硬件设备操作接口-IO
#include "hi_adc.h" // 海思 Pegasus SDK:IoT硬件设备操作接口-ADC
函数1 串口初始化
hi_u32 hi_uart_init(hi_uart_idx id, const hi_uart_attribute *param, const hi_uart_extra_attr *extra_attr);
备注:还需要初始化串口tx为输出模式加串口模式,rx为输入模式加串口模式
id:表示串口号
HI_UART_IDX_0, /**< Physical port number 0.CNcomment:物理端口号0 CNend */
HI_UART_IDX_1, /**< Physical port number 1.CNcomment:物理端口号1 CNend */
HI_UART_IDX_2, /**< Physical port number 2.CNcomment:物理端口号2 CNend */
HI_UART_IDX_MAX /**< Maximum physical port number, which cannot be used. CNcomment:物理端口号最大值,
*param:指定串口属性
这个为结构体
.baud_rate =填波特率比如115200
.data_bits = 数据位 HI_UART_DATA_BIT_5,HI_UART_DATA_BIT_6,HI_UART_DATA_BIT_7,HI_UART_DATA_BIT_8,
.stop_bits = 停止位 HI_UART_STOP_BIT_1,HI_UART_STOP_BIT_2
.parity = 奇偶校验位 HI_UART_PARITY_NONE = 0, /**无校验CNend */ HI_UART_PARITY_ODD = 1, /**校验位,奇校验CNend */ HI_UART_PARITY_EVEN = 2, /**偶校验CNend */
*extra_attr:表示高级功能配置
不常用一般直接填null,具体看文章末尾
返回值 成功0失败1
函数2 串口读取
hi_s32 hi_uart_read(hi_uart_idx id, hi_u8 *data, hi_u32 data_len);
id:表示串口号
HI_UART_IDX_0, /**< Physical port number 0.CNcomment:物理端口号0 CNend */
HI_UART_IDX_1, /**< Physical port number 1.CNcomment:物理端口号1 CNend */
HI_UART_IDX_2, /**< Physical port number 2.CNcomment:物理端口号2 CNend */
HI_UART_IDX_MAX /**< Maximum physical port number, which cannot be used. CNcomment:物理端口号最大值,
*data:读取的数据保存数据的指针
data_len:读取字节数的长度
返回值 成功大于0 失败-1
函数3 串口写
hi_s32 hi_uart_write(hi_uart_idx id, const hi_u8 *data, hi_u32 data_len);
id:表示串口号
看上方
*data:写入的数据保存数据的指针
data_len:写入字节数的长度
返回值 成功大于0 失败-1
函数4 关闭串口
hi_u32 hi_uart_deinit(hi_uart_idx id);
id:表示串口号
看上方
补充:
关于串口初始化高级功能
typedef struct {
hi_uart_fifo_line tx_fifo_line;
hi_uart_fifo_line rx_fifo_line;
hi_uart_fifo_line flow_fifo_line;
hi_uart_block_state tx_block;
hi_uart_block_state rx_block;
hi_u16 tx_buf_size;
hi_u16 rx_buf_size;
hi_uart_dma_state tx_use_dma;
hi_uart_dma_state rx_use_dma;
} hi_uart_extra_attr;
1、tx_fifo_line、rx_fifo_line、flow_fifo_line
HI_FIFO_LINE_ONE_EIGHT = 1, /**< FIFO interruption limitation, FIFO LINE = 1/8full.
CNcomment:FIFO中断门限,FIFO LINE = 1/8full CNend */
HI_FIFO_LINE_ONE_QUARTER, /**< FIFO interruption limitation, FIFO LINE = 1/4full.
CNcomment:FIFO中断门限,FIFO LINE = 1/4full CNend */
HI_FIFO_LINE_HALF, /**< FIFO interruption limitation, FIFO LINE = 1/2full.
CNcomment:FIFO中断门限,FIFO LINE = 1/2full CNend */
HI_FIFO_LINE_THREE_QUARTERS, /**< FIFO interruption limitation, FIFO LINE = 3/4full.
CNcomment:FIFO中断门限,FIFO LINE = 3/4full CNend */
HI_FIFO_LINE_SEVEN_EIGHTS, /**< FIFO interruption limitation, FIFO LINE = 7/8full.
CNcomment:FIFO中断门限,FIFO LINE = 7/8full CNend */
2、tx_block和rx_block
HI_UART_BLOCK_STATE_NONE_BLOCK = 1, /**< block mode, none-block. CNcomment:UART阻塞模式,非阻塞传输 CNend */
HI_UART_BLOCK_STATE_BLOCK, /**< block mode, block. CNcomment:UART阻塞模式,阻塞传输 CNend */
3、hi_u16 tx_buf_size;hi_u16 rx_buf_size;
设置缓冲区大小
4、tx_use_dma、rx_use_dma
HI_UART_NONE_DMA = 1, /**< None-DMA mode. CNcomment:DMA传输,不使用DMA CNend */
HI_UART_USE_DMA, /**< DMA mode. CNcomment:DMA传输,使用DMA CNend */