Форум сайта python.su
Доброго времени суток. Есть девайс с сенсором, который необходимо конфигурировать по 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
Отредактировано (Сен. 29, 2011 09:48:59)
Офлайн
Мне кажется, что в данном конкретном случае, лучше всего будет написать модуль на С, чтобы но обеспечивал работу на низком уровне. А потом уже использовать его из Python'а.
Офлайн
AnMD, конкретно прием-передачу можно написать на C как это описал s0rg.
А потом уже — http://aplawrence.com/Girish/c-functions-from-python.html
Офлайн
Спасибо, наверное так и придется писать интерфейс на Си и потом вызывать функции из питона.
Офлайн
сишные структуры получатся при использовании модуля ctypes
AnMD.
В процессе чтения драйвер сначала проверят размер созданной нами структуры
AnMDТак вы 4 байта и читаете:
при чтении я всегда получаю 4 первых байта
twidata = input.read(4)
Отредактировано (Сен. 30, 2011 20:42:39)
Офлайн
Не нужно мне приписывать чужие слова )
ТС все правильно написал, то что вы написали про ‘по-русски’ это происходит в питоне, ctypes ТСу не поможет - да он формирует структуры, но не дает возможности передать ее адрес в ‘read’
то есть на C это должно выглядеть как-то так:
struct somestruct my_data;
init_data(&my_data);
fd = open_device();
read(fd, &my_data, sizeof(somestruct));
...
Офлайн
Приношу извинения. Я вроде жал кнопку цитировать только у TC. :( . Исправлю. Передавать данные в девайс операцией read? Такого не встречал, слабо верится что это так. Сам так делать ни за чтобы не стал. Но всяко может быть…. Однако ctypes может облегчить жизнь и в этом случае. Импортируете из crt read (собственно единственное что вам надо от С) os.open()- дает дескриптор, и у ситайповской структуры можно взять адрес: ctypes.addressof ну и вызывайте read. Плюс подхода - работа со структурой и отсутствие компиляции (если есть динамически загружаемая crt :) ).
Отредактировано (Сен. 30, 2011 20:53:24)
Офлайн
Опа - а про такие тонкости я не знал, спасибо.
Офлайн
doza_andИнтересный метод, хочу попробовать, вот только что такое crt?
Приношу извинения. Я вроде жал кнопку цитировать только у TC. . Исправлю. Передавать данные в девайс операцией read? Такого не встречал, слабо верится что это так. Сам так делать ни за чтобы не стал. Но всяко может быть…. Однако ctypes может облегчить жизнь и в этом случае. Импортируете из crt read (собственно единственное что вам надо от С) os.open()- дает дескриптор, и у ситайповской структуры можно взять адрес: ctypes.addressof ну и вызывайте read. Плюс подхода - работа со структурой и отсутствие компиляции (если есть динамически загружаемая crt ).
Отредактировано (Окт. 3, 2011 10:54:31)
Офлайн
crt === с runtime library
Вам надо в директории gcc среди so файлов найти тот, который экспортирует read и загрузить read из него.
Но советую еще раз проверить - в самом ли деле данные в девайс передаются вызовом read. :) Это все равно что бырызгаться против ветра :). Обычно данные идут в другую сторону. Почему вы решили что это необходимо? Если передача не нужна тогда и питоновский open подойдет и не надо будет динамическую библиотеку цеплять.
Отредактировано (Окт. 3, 2011 16:25:34)
Офлайн