Ядро dotnet не имеет доступа к gpio - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь заставить приложение ядра aspnet работать на моем Raspberry Pi.Приложение использует Bifrost для взаимодействия с GPIO малины, но каждый раз, когда я делаю sudo dotnet run, происходит сбой с ошибкой

Using launch settings from /home/pi/Desktop/keypad-alarm/keypad-alarm-server/Properties/launchSettings.json...     
Write value High to pin at /sys/class/gpio/gpio17/value

Unhandled Exception: System.UnauthorizedAccessException: Access to the path '/sys/class/gpio/gpio17/value' is denied. ---> System.IO.IOException: Operation not permitted    
--- End of inner exception stack trace ---    at 
System.IO.FileStream.WriteNative(ReadOnlySpan`1 source)    at 
System.IO.FileStream.FlushWriteBuffer()    at 
System.IO.FileStream.FlushInternalBuffer()    at 
System.IO.FileStream.Flush(Boolean flushToDisk)    at 
System.IO.FileStream.Flush()    at 
System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)    at 
System.IO.StreamWriter.Dispose(Boolean disposing)  at 
System.IO.TextWriter.Dispose()   
 at System.IO.File.WriteAllText(String path, String contents)    at 
Bifrost.Devices.Gpio.GpioPin.Write(GpioPinValue pinValue)    at 
keypad_alarm_server.TweetController.Tweet(Int32 milliseconds) in 
/home/pi/Desktop/keypad-alarm/keypad-alarm-server/TweetController.cs:line 25    at 
keypad_alarm_server.Program.Main(String[] args) in /home/pi/Desktop/keypad-alarm/keypad-alarm-server/Program.cs:line 15

. Я должен упомянуть, что я немедленно включаю GPIO 17 с высокой силой, чтобы прозвучал звуковой сигнал до того, какЯ даже запускаю веб-сервер в Program.cs.

Как я могу убедиться, что у dotnet достаточно прав для доступа к gpio's?

1 Ответ

0 голосов
/ 01 декабря 2018

Хорошо, как всегда, после того, как вы потратили время на публикацию вопроса, вы где-то нашли ответ ...

Исключение unauthorizedex ужасно вводит в заблуждение, поскольку в c # отсутствовало следующее утверждение: pin.SetDriveMode(GpioPinDriveMode.Output);

public class TweetController
{
    private static IGpioController _gpio = null;
    private const int PIN = 17;

    public TweetController()
    {
        _gpio = GpioController.Instance;
    }

    public void Tweet(int milliseconds){
        var pin = _gpio.OpenPin(PIN);
        pin.SetDriveMode(GpioPinDriveMode.Output); // open the gpio pin before writing or unauthorizedexception occurs
        pin.Write(GpioPinValue.High);
        Thread.Sleep(milliseconds);
        pin.Write(GpioPinValue.Low);
    }
}
...