Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 29, 2011 09:46:53

AnMD
От:
Зарегистрирован: 2011-09-28
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите как сформировать структуру.

Доброго времени суток. Есть девайс с сенсором, который необходимо конфигурировать по 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 первых байта.
Прошу помощи, как из питона управлять сишным драйвером, требующим структуру с адресами.



Отредактировано (Сен. 29, 2011 09:48:59)

Офлайн

#2 Сен. 29, 2011 10:54:49

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Подскажите как сформировать структуру.

Мне кажется, что в данном конкретном случае, лучше всего будет написать модуль на С, чтобы но обеспечивал работу на низком уровне. А потом уже использовать его из Python'а.

Офлайн

#3 Сен. 29, 2011 14:55:06

maxwell
От:
Зарегистрирован: 2008-08-26
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите как сформировать структуру.

AnMD, конкретно прием-передачу можно написать на C как это описал s0rg.
А потом уже — http://aplawrence.com/Girish/c-functions-from-python.html



Офлайн

#4 Сен. 30, 2011 11:21:19

AnMD
От:
Зарегистрирован: 2011-09-28
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите как сформировать структуру.

Спасибо, наверное так и придется писать интерфейс на Си и потом вызывать функции из питона.



Офлайн

#5 Сен. 30, 2011 19:51:09

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Подскажите как сформировать структуру.

сишные структуры получатся при использовании модуля ctypes

AnMD
В процессе чтения драйвер сначала проверят размер созданной нами структуры
.
Интересно - а как он это делает?

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

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

p.s.
на с у вас будут те-же проблемы, только в несколько раз сложнее будет их преодолеть



Отредактировано (Сен. 30, 2011 20:42:39)

Офлайн

#6 Сен. 30, 2011 20:17:00

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Подскажите как сформировать структуру.

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

struct somestruct my_data;

init_data(&my_data);
fd = open_device();
read(fd, &my_data, sizeof(somestruct));
...

Офлайн

#7 Сен. 30, 2011 20:42:08

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Подскажите как сформировать структуру.

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



Отредактировано (Сен. 30, 2011 20:53:24)

Офлайн

#8 Сен. 30, 2011 22:21:08

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Подскажите как сформировать структуру.

Опа - а про такие тонкости я не знал, спасибо.

Офлайн

#9 Окт. 3, 2011 10:45:36

AnMD
От:
Зарегистрирован: 2011-09-28
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите как сформировать структуру.

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

UPD.Кажется разобрался, это динамически подгружаемая библиотека C.



Отредактировано (Окт. 3, 2011 10:54:31)

Офлайн

#10 Окт. 3, 2011 16:23:35

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Подскажите как сформировать структуру.

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

Но советую еще раз проверить - в самом ли деле данные в девайс передаются вызовом read. :) Это все равно что бырызгаться против ветра :). Обычно данные идут в другую сторону. Почему вы решили что это необходимо? Если передача не нужна тогда и питоновский open подойдет и не надо будет динамическую библиотеку цеплять.



Отредактировано (Окт. 3, 2011 16:25:34)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version