Найти - Пользователи
Полная версия: Подскажите как сформировать структуру.
Начало » Python для новичков » Подскажите как сформировать структуру.
1 2
AnMD
Доброго времени суток. Есть девайс с сенсором, который необходимо конфигурировать по twi интерфейсу. То есть необходимо передавать в драйвер ссылку на структуру(говоря языком СИ), которая включает в себя три переменных char Reg, char Page, и int Data. Объясню иначе:
1)Когда мы хотим прочитать определенную информацию, мы создаем структуру в которую записываем номер Reg(регистра) и номер Page(страницы) откуда мы будем читать, Data заполняется просто нулями. Тем самым мы выделяем буфер под те данные которые мы будем дальше читать. Затем вызывая функцию чтения из файла (так как все устройства в linux представлены как обычные файлы), мы передаем в неё указатель на созданную нами структуру. В процессе чтения драйвер сначала проверят размер созданной нами структуры, если все в норме то он вычитывает номер регистра и страницы, а затем записывает в Data данные которые располагаются по переданному нами адресу(регистр страница).
2)Операция записи происходит аналогично, только в Data мы изначально записываем те данные которые затем необходимо передать в драйвер.

Проблема в том что в питоне я новичок и пока не знаю всех тонкостей работы со структурами. Сразу оговорюсь что использую python 2.7.1.
Что пытался сделать:
Создавать структуру в виде списка, словаря….но указать типизацию при этом сложно и тем более передавать адреса страницы и регистра в виде 0x а не ввиде строки. Пробовал пользоваться модулем struct, но успеха пока тоже не добился.
Вот примерно как я пытаюсь читать:
from struct import *
input = open(r'/dev/camera', 'rb')
twidata = pack('CCH', 0x1, 0x97, 0x0)
print twidata
twidata = input.read(4) #еще у меня большие сомнения по поводу данной операции, передается ли указатель на структуру twidata при такой попытке чтения. Если не передается то как его передать явно?
print twidata
В итоге, не зависимо от того какие адреса регистра и страницы я записал в структуру, при чтении я всегда получаю 4 первых байта.
Прошу помощи, как из питона управлять сишным драйвером, требующим структуру с адресами.
s0rg
Мне кажется, что в данном конкретном случае, лучше всего будет написать модуль на С, чтобы но обеспечивал работу на низком уровне. А потом уже использовать его из Python'а.
maxwell
AnMD, конкретно прием-передачу можно написать на C как это описал s0rg.
А потом уже — http://aplawrence.com/Girish/c-functions-from-python.html
AnMD
Спасибо, наверное так и придется писать интерфейс на Си и потом вызывать функции из питона.
doza_and
сишные структуры получатся при использовании модуля ctypes
AnMD
В процессе чтения драйвер сначала проверят размер созданной нами структуры
.
Интересно - а как он это делает?

AnMD
при чтении я всегда получаю 4 первых байта
Так вы 4 байта и читаете:
twidata = input.read(4)
Если по русски вы делаете так:
1 открываете девайс
2 делаете строку с данными
3 выкидываете строку с данными и создаете новую - 4 байта прочитанных из девайса
4 почемуто не закрываете девайс.

Резюме - проблемы у вас не со структурами, а с чтением и записью. Прочитайте подробнее разделы мануала про ввод вывод.

p.s.
на с у вас будут те-же проблемы, только в несколько раз сложнее будет их преодолеть
s0rg
Не нужно мне приписывать чужие слова )
ТС все правильно написал, то что вы написали про ‘по-русски’ это происходит в питоне, ctypes ТСу не поможет - да он формирует структуры, но не дает возможности передать ее адрес в ‘read’
то есть на C это должно выглядеть как-то так:
struct somestruct my_data;

init_data(&my_data);
fd = open_device();
read(fd, &my_data, sizeof(somestruct));
...
doza_and
Приношу извинения. Я вроде жал кнопку цитировать только у TC. :( . Исправлю. Передавать данные в девайс операцией read? Такого не встречал, слабо верится что это так. Сам так делать ни за чтобы не стал. Но всяко может быть…. Однако ctypes может облегчить жизнь и в этом случае. Импортируете из crt read (собственно единственное что вам надо от С) os.open()- дает дескриптор, и у ситайповской структуры можно взять адрес: ctypes.addressof ну и вызывайте read. Плюс подхода - работа со структурой и отсутствие компиляции (если есть динамически загружаемая crt :) ).
s0rg
Опа - а про такие тонкости я не знал, спасибо.
AnMD
doza_and
Приношу извинения. Я вроде жал кнопку цитировать только у TC. . Исправлю. Передавать данные в девайс операцией read? Такого не встречал, слабо верится что это так. Сам так делать ни за чтобы не стал. Но всяко может быть…. Однако ctypes может облегчить жизнь и в этом случае. Импортируете из crt read (собственно единственное что вам надо от С) os.open()- дает дескриптор, и у ситайповской структуры можно взять адрес: ctypes.addressof ну и вызывайте read. Плюс подхода - работа со структурой и отсутствие компиляции (если есть динамически загружаемая crt ).
Интересный метод, хочу попробовать, вот только что такое crt?

UPD.Кажется разобрался, это динамически подгружаемая библиотека C.
doza_and
crt === с runtime library
Вам надо в директории gcc среди so файлов найти тот, который экспортирует read и загрузить read из него.

Но советую еще раз проверить - в самом ли деле данные в девайс передаются вызовом read. :) Это все равно что бырызгаться против ветра :). Обычно данные идут в другую сторону. Почему вы решили что это необходимо? Если передача не нужна тогда и питоновский open подойдет и не надо будет динамическую библиотеку цеплять.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB