2015-05-18 3 views
0

Мой проект для управления ЖК-дисплей с ST7565 контроллером на моем малина B2 Я пытаюсь использовать это C++ код, который управляет LCD: https://github.com/stephanel/ST7565-RPiс помощью C++ код из питона в общем-Lib для управления ЖК-

К сожалению, я не знаком с программированием на C, из-за этого я хочу вызвать функции C++ из python с помощью ctypes.

Я написал простой (простой для меня) C++ код для использования в качестве общей библиотеки

lcdcontrol.cpp:

#include <iostream> 
#include <ctime> 
#include <sstream> 
#include <wiringPi.h> 
#include <wiringShift.h> 
#include "ST7565/ST7565.cpp" 

using namespace std; 
ST7565 glcd(PIN_SID, PIN_SCLK, PIN_A0, PIN_RST, PIN_CS); 

void start(); 
void drawclock(); 
void setpix(); 
void clear(); 
void drawstring(); 
void drawbitmap(); 

void start(){ 
    glcd.begin(0x18); 
    glcd.display();} 

void setpix() { 
    glcd.setpixel(10, 10, BLACK);} 

void clear() { 
    glcd.clear();} 

void drawstring() { 
    glcd.drawstring(0, 0, "Test string");} 

Мой питон код для тестирования:

#!/usr/bin/python 
import os 
from ctypes import * 
from thread import start_new_thread 

lcd_lib = cdll.LoadLibrary("lcdcontrol.so") 
mylcd = lcd_lib 

mylcd.start() 

Теперь я должны скомпилировать мой код на C++ в общий libray. Я попробовал несколько способов. Но ничто не работает без проблем. Когда я запускаю код python, он возвращает то, что он не может найти функцию «digitalwrite», которая является частью листинга wirepi lib, или я получил ошибку, что он не может найти функцию «start».

Может ли кто-нибудь помочь мне. Я схожу с ума по этому поводу ... Возможно, существует совершенно другой способ использования кода C++ для ST7565 на python. Но это кажется мне самым простым способом ... до сих пор ...

+0

Дайте Китону взгляд. Он немного привыкает, но он очень упрощает вызов C++ из Python. – zmbq

+2

«Я попробовал несколько способов» и «проблемы» ничего нам не говорят. Покажите нам, как вы его скомпилировали, и расскажите, что это за проблемы. И покажите нам код Python, который действительно вызывает ошибку, и именно эта ошибка, а не просто смутное описание. – abarnert

+1

Не можете ли вы использовать модуль Python [RPi.GPIO] (https://pypi.python.org/pypi/RPi.GPIO)? См. Например: [Python вождения ST7565 12864 LCD] (https://www.raspberrypi.org/forums/viewtopic.php?f=32&t=25029) –

ответ

0

Поскольку вы не знакомы с C, я предполагаю, что вы совершили ту же ошибку, что и я, на какое-то время. Вы не заботитесь о mangeling имени в C++.

См http://en.wikipedia.org/wiki/Nm_%28Unix%29

Пожалуйста, покажите, как функции экспортируются.

Дополнительная информация может быть найдена здесь: Python: accessing DLL function using ctypes -- access by function *name* fails

+0

Не найти 'start', вероятно, связано с именем mangling, т. Е. Не объявлять C API как' extern 'C ". Но не найти 'digitalWrite' - это другая проблема связывания. Возможно, приложение не ссылалось на библиотеку, используя '-lwiringPi'. – eryksun

+0

Спасибо за эту информацию. Я проверю имя mangeling и даю обратную связь. Я думаю, что нашел решение проблемы связывания с модифицированным make-файлом. Я проверю это позже в этот день и дам отзывы – exert

0

Спасибо за помощь, это работает!

это Makefile, я использую:

all: 
    g++ -fPIC -shared -o lcdcontrol.so -I/usr/local/include -L/usr/local/lib -lwiringPi lcdcontrol.cpp 
    sudo cp lcdcontrol.so /usr/lib/lcdcontrol.so 

нм lcdcontrol.so возвращений:

 (...) 
    U digitalWrite 
    (...) 
    00002968 T _Z10drawstringv 
    00002a04 t _Z41__static_initialization_and_destruction_0ii 
    0000293c T _Z5clearv 
    00002834 T _Z5startv 
    000028cc T _Z6setpixv 
    0000bab6 b _ZL10xUpdateMax 
    0000bab5 b _ZL10xUpdateMin 
    0000bab8 b _ZL10yUpdateMax 
    (...) 

В моем питона код теперь я могу использовать:

mylcd._Z5startv() 
mylcd._Z6setpixv() 
mylcd._Z10drawstringv() 

И оно работает!