0

次のコードと StopWatch オブジェクトがあり、再起動しようとすると、この例外がスローされます。

保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています

コードは次のとおりです。

public sealed partial class MainPage : Page
    {
        private const int ECHO_PIN = 23;
        private const int TRIGGER_PIN = 18;
        private GpioPin pinEcho;
        private GpioPin pinTrigger;
        private DispatcherTimer timer;
        private Stopwatch sw;

        public MainPage()
        {
            this.InitializeComponent();


            InitGPIO();

            timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromMilliseconds(400);
            timer.Tick += Timer_Tick;
            if (pinEcho != null && pinTrigger != null)
            {
                timer.Start();
            }


        }

        private async void Timer_Tick(object sender, object e)
        {
            pinTrigger.Write(GpioPinValue.High);
            await Task.Delay(10);
            pinTrigger.Write(GpioPinValue.Low);
            while (pinEcho.Read() == GpioPinValue.Low)
            {
                sw.Restart();

            }

            while (pinEcho.Read() == GpioPinValue.High)
            {
            }
            sw.Stop();

            var elapsed = sw.Elapsed.TotalSeconds;
            var distance = elapsed * 34000;

            distance /= 2;
            distancetb.Text = "Distance: " + distance + " cm";

        }
        private async void InitGPIO()
        {
            var gpio = GpioController.GetDefault();
            if (gpio == null)
            {
                pinEcho = null;
                pinTrigger = null;
                gpioStatus.Text = "no hay controlador GPIO en este dispositivo";
                return;
            }

            pinEcho = gpio.OpenPin(ECHO_PIN);
            pinTrigger = gpio.OpenPin(TRIGGER_PIN);


            pinTrigger.SetDriveMode(GpioPinDriveMode.Output);
            pinEcho.SetDriveMode(GpioPinDriveMode.Input);

            gpioStatus.Text = "controlador GPIO inicializado";

            pinTrigger.Write(GpioPinValue.Low);

            await Task.Delay(100);
        }
    }
4

1 に答える 1

0

切り取ったコードでは、Stopwatch sw の初期化が見られません。

追加してみる

sw = new Stopwatch();

コンストラクターまたは Timer_Tick が実行される前のどこかで。

于 2016-07-21T01:11:20.737 に答える