6

python 2.7 / RaspberryPiでwiringPi2割り込みをテストすると、動作しないようです。

次のコードでは、割り込みによってセグメンテーション違反が生成されます。

#!/usr/bin/env python2
import wiringpi2
import time

def my_int():
    print('Interrupt')

wpi = wiringpi2.GPIO(wiringpi2.GPIO.WPI_MODE_PINS)
wpi.pullUpDnControl(4,wpi.PUD_UP) 
wpi.wiringPiISR(4, wpi.INT_EDGE_BOTH, my_int())
while True:
    time.sleep(1)
    print('Waiting...')

Waiting...
Waiting...
Waiting...
Waiting...
Segmentation fault

「()」なしでコールバックすると、別のエラーが発生します。

wpi.wiringPiISR(4, wpi.INT_EDGE_BOTH, my_int)

> TypeError: in method 'wiringPiISR', argument 3 of type 'void (*)(void)'

私は何を間違っていますか???

4

1 に答える 1

3

私はCがあまり得意ではありませんが、ソースから理解している限りhttps://github.com/Gadgetoid/WiringPi2-Python/blob/master/wiringpi_wrap.cこのコードが原因でこのエラーが発生しました(チェックします関数が void を返し、エラーを表示する場合):

int res = SWIG_ConvertFunctionPtr(obj2, (void**)(&arg3), SWIGTYPE_p_f_void__void);
if (!SWIG_IsOK(res)) {
  SWIG_exception_fail(SWIG_ArgError(res), "in method '" "wiringPiISR" "', argument " "3"" of type '" "void (*)(void)""'");
}

したがって、Truemy_int() 関数で明示的に or 1 を返すことをお勧めします。現在、python は、関数コードの最後に達したが値を返さなかった関数に対して None を返します。

変更されたコード:

#!/usr/bin/env python2
import wiringpi2
import time

def my_int():
    print('Interrupt')
    return True
# setup
wiringpi2.wiringPiSetupGpio()
# set up pin 4 as input
wiringpi2.pinMode(4, 0)
# enable pull up down for pin 4
wiringpi2.pullUpDnControl(4, 1) 
# attaching function to interrupt
wiringpi2.wiringPiISR(4, wiringpi2.INT_EDGE_BOTH, my_int)

while True:
    time.sleep(1)
    print('Waiting...')

編集: 配線pi2を間違って初期化したようです。詳細については、チュートリアルを確認してください: http://raspi.tv/2013/how-to-use-wiringpi2-for-python-on-the-raspberry-pi-in-raspbian

于 2013-11-07T10:21:35.763 に答える