c# mono raspberry pi GPIO с получением Raspberry# Операция недействительна

Я пытаюсь использовать библиотеку Raspberry # для выполнения основной задачи с выводом GPIO на Raspberry PI (вкл. и выкл.). Как, например, на github: https://github.com/raspberry-sharp/raspberry-sharp-io/wiki/Raspberry.IO.GeneralPurpose

Код:

        var led1 = ConnectorPin.P1Pin11.Output();
        var connection = new GpioConnection(led1);
        for (var i = 0; i < 100; i++)
        {
            connection.Toggle(led1);
            System.Threading.Thread.Sleep(250);
        }
        connection.Close();

в строке var connection = new GpioConnection(led1); я получаю исключение:

"Операция недействительна из-за текущего состояния объекта"

Трассировки стека

Unhandled Exception:
System.InvalidOperationException: Operation is not valid due to the current state of the object
at Raspberry.IO.GeneralPurpose.GpioConnectionDriver..ctor () [0x00000] in <filename unknown>:0
at Raspberry.IO.GeneralPurpose.GpioConnectionSettings.get_DefaultDriver () [0x00000] in <filename unknown>:0
at Raspberry.IO.GeneralPurpose.GpioConnectionSettings..ctor () [0x00000] in <filename unknown>:0
at Raspberry.IO.GeneralPurpose.GpioConnection..ctor (Raspberry.IO.GeneralPurpose.GpioConnectionSettings settings, IEnumerable`1 pins) [0x00000] in <filename unknown>:0
at Raspberry.IO.GeneralPurpose.GpioConnection..ctor (Raspberry.IO.GeneralPurpose.PinConfiguration[] pins) [0x00000] in <filename unknown>:0
at Hello.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.InvalidOperationException: Operation is not valid due to the current state of the object
at Raspberry.IO.GeneralPurpose.GpioConnectionDriver..ctor () [0x00000] in <filename unknown>:0
at Raspberry.IO.GeneralPurpose.GpioConnectionSettings.get_DefaultDriver () [0x00000] in <filename unknown>:0
at Raspberry.IO.GeneralPurpose.GpioConnectionSettings..ctor () [0x00000] in <filename unknown>:0
at Raspberry.IO.GeneralPurpose.GpioConnection..ctor (Raspberry.IO.GeneralPurpose.GpioConnectionSettings settings, IEnumerable`1 pins) [0x00000] in <filename unknown>:0
at Raspberry.IO.GeneralPurpose.GpioConnection..ctor (Raspberry.IO.GeneralPurpose.PinConfiguration[] pins) [0x00000] in <filename unknown>:0
at Hello.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0

Я могу переключать состояние контактов с помощью Python, поэтому с устройством все в порядке.


person Sergej Popov    schedule 31.08.2014    source источник


Ответы (1)


Выполните свою программу Mono от имени пользователя root. /dev/mem недоступен обычным пользователям.

public GpioConnectionDriver() {

        using (var memoryFile = UnixFile.Open("/dev/mem", UnixFileMode.ReadWrite | UnixFileMode.Synchronized)) {
            gpioAddress = MemoryMap.Create(
                IntPtr.Zero, 
                Interop.BCM2835_BLOCK_SIZE,
                MemoryProtection.ReadWrite,
                MemoryFlags.Shared, 
                memoryFile.Descriptor,
                Interop.BCM2835_GPIO_BASE
            );
        }
    }

Объяснение отсюда: http://www.raspberrypi.org/forums/viewtopic.php?f=29&t=22515

Чтобы открыть /dev/mem, вам нужны как обычные права доступа к файлу устройства, так и возможность безопасности CAP_SYS_RAWIO, или быть root. От этого никуда не деться, потому что полный доступ к памяти позволяет гораздо больше, чем просто GPIO. Это имеет огромное значение для безопасности.

person ttu    schedule 02.09.2014