c# (Windows IoT) - Sleep() or Delay()?

本文关键字:or Delay Sleep IoT Windows | 更新日期: 2023-09-27 18:15:11

如何在c#中为Windows IoT编写时间关键型后台应用程序?

目标是通过c#在Raspberry Pi 2上使用Windows IoT和Visual Studio 2015编程步进电机。编程通过远程调试工作良好,但没有睡眠或延迟可用。另外System.Threading.Thread.Sleep(time)是不可能的。

如果我们实现一个定时器,那么每一步之间的时间就不一样了。

就像5步快- 2步慢- 5步快- 2步慢- 5步快-等等....

我如何编程电机,他是正确的行为?

数据:

电机:HSY214 - F0.8 A NEMA8 -步进电机

Driver: A4988

c# (Windows IoT) - Sleep() or Delay()?

我们在物联网设备项目中增加了c#对软件PWM和硬件PWM的支持。您还可以看到使用Windows IoT Core驱动步进电机的c++示例。如果有必要,你可以实现一个类似Thread的功能。使用System.Threading.Tasks.Task.Delay休眠。

可以这样:

Task.Delay(-1).Wait(100);

Task.Delay(100).Wait(-1);

Task.Delay(100).Wait();

在所有情况下结果都是相同的。

我做了一个简单的测试:

while (true)
        {
            pin26.Write(GpioPinValue.High);
            Task.Delay(-1).Wait(100);
            pin26.Write(GpioPinValue.Low);
            Task.Delay(-1).Wait(100);
        }

脉冲宽度的结果不太好-从98ms到116ms,更糟糕的结果是延迟时间短…100毫秒的延迟

10 ms的延时

将更好,如果您使用外部伺服驱动器的电机与步进方向接口。

您应该有一个将I/O状态与时间联系起来的法律,以及一个具有适当分辨率的时钟。然后,您有一个线程不断循环并使用时钟检查经过的时间。

我们可以使用ThreadPoolTimer

任务也可以称为线程,特别是当它们存在于任务中时。Windows中的一个标准线程对象是Timer....在Windows中,我们可以启动一个计时器线程,而不是使用延迟。一旦线程启动,我们就可以去做其他有用的事情,计时器会在周期到期时提醒我们。计时器通过timer Tick事件完成此操作。

看起来是这样的:

var t = Task.Run(async delegate
         {
             await Task.Delay(1000);
             return 42;
          });
  t.Wait();

我习惯这样做:

Thread.Sleep(1000);

那么为什么c#物联网编码如此复杂?我也在树莓派上使用c++编程,看起来物联网的未来是Linux,如果MS-10 c#期望6行代码在线程中做固定延迟。