Hisport 接口文档
更新时间: 2026/03/04
在Gitcode上查看源码

Hisport接口文档

init函数

函数形式

  • void Hisport::init(const HISPORT_INIT_S &init_data, std::string bus_name)

描述

  • 初始化Hisport设备。该函数用于配置Hisport设备的参数,并创建共享内存互斥锁。

参数

参数类型描述
init_dataHISPORT_INIT_S&包含初始化参数的结构体。
bus_namestring总线名称,用于创建互斥锁,进行多进程并发管理。

HISPORT_INIT_S结构体介绍如下:

c++
struct tag_hisport_init_s {
    uint32_t bus_num;             //I2C通道数量(范围为[1, 128])
    uint32_t reg_num;             //send寄存器和recv寄存器使用的字节数(范围为[1, 10])
    uint32_t flag_num;            //flag寄存器使用的字节数(范围为[1, 2])
    uint32_t send_reg_addr;       //send寄存器起始地址, 寄存器的最大使用地址不能超过64K
    uint32_t recv_reg_addr;       //recv寄存器起始地址, 寄存器的最大使用地址不能超过64K
    uint32_t flag_reg_addr;       //flag寄存器起始地址, 寄存器的最大使用地址不能超过64K
    uint32_t max_batch_len;       //单帧读写最大字节数(范围为[1, 2])
    uint32_t max_data_len;        //单次读写请求的最大字节数(范围为[1, 1024])
    uint32_t max_offset_width;    //最大偏移宽度(范围为[1, 2])
    uint32_t max_length_width;    //最大数据长度宽度(范围为[1, 2])
};

返回

  • 初始化成功时无返回值,失败时通过错误引擎抛错,需要调用方进行异常捕获

示例

c++
HISPORT_INIT_S init_config = {0};
init_config.bus_num = 128;
init_config.reg_num = 10;
init_config.flag_num = 2;
init_config.max_batch_len = 2;
init_config.max_data_len = 1024;
init_config.max_offset_width = 2;
init_config.max_length_width = 2;
init_config.send_reg_addr = 0x00;
init_config.recv_reg_addr = 0x10;
init_config.flag_reg_addr = 0x1A;

Hisport hisport;
try {
    hisport.init(init_config, "hisport_bus");
    std::cout << "HISPORT 初始化成功" << std::endl;
} catch (const std::runtime_error& e) {
    std::cout << "异常:" << e.what() << std::endl;
}

相关日志介绍(linux_kernel_log)

  • 入参init_data校验失败时记录日志:init parameter error: bus_num=%d, reg_num=%d, flag_num=%d, max_batch_len=%d, max_data_len=%d, max_offset_width=%d, max_length_width=%d
  • 初始化成功记录日志:hisport init success

read函数

函数形式

  • std::string Hisport::read(HISPORT_DATA_S &read_data)

描述

  • 从Hisport设备读取数据,该函数支持重试机制,确保数据读取的可靠性。

参数

参数类型描述
read_dataHISPORT_DATA_S&包含读请求参数的结构体

HISPORT_DATA_S结构体介绍如下:

c++
typedef struct tag_hisport_s {
    uint32_t bus_id;               /* I2C控制器的编号,取值范围为0~127 */
    uint32_t addr;                 /* 器件地址 */
    uint32_t offset;               /* 偏移地址 */
    const uint8_t *tx_buffer;      /* 写操作发送的数据 */
    uint32_t tx_len;               /* 发送命令中数据长度 */
    uint8_t *rx_buffer;            /* 回传数据缓存 */
    uint32_t rx_len;               /* 回传数据长度 */
    uint8_t offset_width;          /* 偏移位宽 */
    uint8_t data_width;            /* 数据位宽,写入字节数或待读取的字节数 */
    uint8_t rw_flag;               /* 读写请求标志,写请求为0,读请求为1 */
    int32_t re_read_cnt;           /* 重读次数,>=1 */
    int32_t re_write_cnt;          /* 重写次数,>=1 */
    uint8_t write_delay;           /* 写操作后是否进行延时,单位:ms */
} HISPORT_DATA_S;

返回

  • 读取到的数据,类型为string

示例

c++
HISPORT_DATA_S read_config = {0};
read_config.addr = 174;
read_config.offset = 12;
read_config.bus_id = 0;
read_config.offset_width = 2;
read_config.re_write_cnt = 10;
read_config.re_read_cnt = 10;
read_config.rw_flag = 1;    // 读操作
read_config.rx_buffer = new uint8_t[10];
read_config.rx_len = 10;
read_config.data_width = 10;

Hisport hisport;
try {
    std::string read_result = hisport.read(read_config);
    std::cout << "读取到的数据:" << read_result << std::endl;
    delete[] read_config.rx_buffer;
} catch (const std::runtime_error& e) {
    delete[] read_config.rx_buffer;
    std::cout << "异常:" << e.what() << std::endl;
}

相关日志介绍(linux_kernel_log)

  • 执行读请求前需等待初始化完成,如未完成初始化会记录日志:wait init
  • 如果存储数据的rx_buffer为空,则记录错误日志:read request need respond data
  • 如果读请求的数据长度超过限制长度,则记录错误日志:need read data is too long, rx_len:%d, max_data_len:%d
  • 如果执行读请求,但tx_buffer不为空,则记录错误日志:read request don't need write data
  • 如果请求结构体中设置的rw_flag既不为0,也不为1,则记录错误日志:request type error, rw_flag=%d

write函数

函数形式

  • void Hisport::write(HISPORT_DATA_S &write_data, const std::string_view &tx)

描述

  • 向Hisport设备写入数据,该函数支持重试机制,确保数据写入的可靠性

参数

参数类型描述
write_dataHISPORT_DATA_S&包含写请求参数的结构体
txstring_view&待写入的数据

HISPORT_DATA_S结构体介绍如下:

c++
typedef struct tag_hisport_s {
    uint32_t bus_id;               /* I2C控制器的编号,取值范围为0~127 */
    uint32_t addr;                 /* 器件地址 */
    uint32_t offset;               /* 偏移地址 */
    const uint8_t *tx_buffer;      /* 写操作发送的数据 */
    uint32_t tx_len;               /* 发送命令中数据长度 */
    uint8_t *rx_buffer;            /* 回传数据缓存 */
    uint32_t rx_len;               /* 回传数据长度 */
    uint8_t offset_width;          /* 偏移位宽 */
    uint8_t data_width;            /* 数据位宽,写入字节数或待读取的字节数 */
    uint8_t rw_flag;               /* 读写请求标志,写请求为0,读请求为1 */
    int32_t re_read_cnt;           /* 重读次数,>=1 */
    int32_t re_write_cnt;          /* 重写次数,>=1 */
    uint8_t write_delay;           /* 写操作后是否进行延时,单位:ms */
} HISPORT_DATA_S;

返回

示例

c++
HISPORT_DATA_S write_config = {0};
write_config.bus_id = 0;
write_config.addr = 174;
write_config.offset = 12;
write_config.offset_width = 2;
write_config.re_write_cnt = 10;
write_config.re_read_cnt = 10;
write_config.rw_flag = 0;    // 写操作

Hisport hisport;
try {
    hisport.write(write_config, "hello");
    std::cout << "写入成功" << std::endl;
} catch (const std::runtime_error& e) {
    std::cout << "异常:" << e.what() << std::endl;
}

相关日志介绍(linux_kernel_log)

  • 执行写请求前需等待初始化完成,如未完成初始化,则记录日志:wait init
  • 如果写请求的tx_buffer为空,记录日志:write request need send data
  • 如果写请求的数据长度超过限制长度,则记录日志:need send data is too long, tx_len:%d, max_data_len:%d
  • 如果执行写请求,但rx_buffer不为空,则记录日志:write request don't need respond data
  • 如果请求结构体中设置的rw_flag既不为0,也不为1,则记录日志:request type error, rw_flag=%d