Перейти к основному содержимому

RI_SDK_connector_i2c_ReadBytes

Информация

RI_SDK - библиотека Robo Intellect Software Development Kit
connector - название группы устройств коннекторов
i2c - название устройства i2c адаптера
ReadBytes - название метода чтения массива байт по указанному адресу

Сигнатура функции

RI_SDK_connector_i2c_ReadBytes(descriptor, addr, buf, len, readBytesLen, errorText):errorCode

Описание метода

Читает с i2c адаптера len байтов по адресу addr и записывает их в buf

Параметры и возвращаемые значения

ПараметрТип для Shared objectТип для Golang gRPCОписание
descriptorint (тип C)int64Дескриптор компонента, с которого будет производиться чтение
addruint8_t (тип C)uint8Адрес, с которого будет производиться чтение
buf*long long unsigned[len] (тип C)[]byteУказатель на массив байт, в который будет записаны прочитанные байты
lenint (тип C)int64Длина массива buf
readBytesLen*int (тип C)int64Указатель на количество прочитанных байтов
errorTextchar[1000] (тип C)stringТекст ошибки (передается как параметр, если происходит ошибка метод записывает в этот параметр текст ошибки)
errorCodeint (тип C)int64Код ошибки

Примеры

Пример №1 - Чтение массива байт buf на i2c адаптере по адресу 0x40

В данном примере осуществляется чтение массива байт buf на i2c адаптере по адресу 0x40. Выводиться количество прочитанных байтов readBytesLength и прочитанные байты.

# Чтение массива из 16 байт с i2c адаптера по адресу 0x40 
b = c_ulonglong()
errCode = lib.RI_SDK_connector_i2c_ReadBytes(descriptor, 0x40, b, 16, readBytesLen, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)
# Конвертируем полученное значение c_ulonglong в массив байт
buf = b.value.to_bytes(readBytesLen.value, "little")
print("read bytes len : ", readBytesLen.value)
print("read bytes: ", buf)

Полный текст примера


from ctypes.util import find_library
import platform
import sys
from ctypes import *

# Подключаем внешнюю библиотеку для работы с SDK
platform = platform.system()
if platform == "Windows":
libName = "librisdk.dll"
if platform == "Linux":
libName = "librisdk.so"

pathLib = find_library(libName)
lib = cdll.LoadLibrary(pathLib)


# Указываем типы аргументов для функций библиотеки RI_SDK
lib.RI_SDK_InitSDK.argtypes = [c_int, c_char_p]
lib.RI_SDK_CreateModelComponent.argtypes = [c_char_p, c_char_p, c_char_p, POINTER(c_int), c_char_p]
lib.RI_SDK_connector_i2c_Open.argtypes = [c_int, c_uint8, c_char_p]
lib.RI_SDK_connector_i2c_ReadBytes.argtypes = [c_int, c_uint8, POINTER(c_ulonglong), c_int, POINTER(c_int), c_char_p]
lib.RI_SDK_connector_i2c_Close.argtypes = [c_int, c_uint8, c_char_p]

def main():
errTextC = create_string_buffer(1000) # Текст ошибки. C type: char*
descriptor = c_int()
readBytesLen = c_int()

# Инициализация библиотеки RI SDK с уровнем логирования 3
errCode = lib.RI_SDK_InitSDK(3, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

# Создание компонента i2c адаптера модели ch341
errCode = lib.RI_SDK_CreateModelComponent("connector".encode(), "i2c_adapter".encode(), "ch341".encode(), descriptor, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

print("descriptor: ", descriptor.value)

# Открытие соединения i2c адаптера по адресу 0x40
errCode = lib.RI_SDK_connector_i2c_Open(descriptor, 0x40, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

# Чтение массива из 16 байт с i2c адаптера по адресу 0x40
b = c_ulonglong()
errCode = lib.RI_SDK_connector_i2c_ReadBytes(descriptor, 0x40, b, 16, readBytesLen, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)
# Конвертируем полученное значение c_ulonglong в массив байт
buf = b.value.to_bytes(readBytesLen.value, "little")
print("read bytes len : ", readBytesLen.value)
print("read bytes: ", buf)

# Закрытие соединения i2c адаптера по адресу 0x40
errCode = lib.RI_SDK_connector_i2c_Close(descriptor, 0x40, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

print("Success")

main()