【问题标题】:c# (Windows IoT) - Sleep() or Delay()?c# (Windows IoT) - Sleep() 还是 Delay()?
【发布时间】:2020-01-09 04:08:38
【问题描述】:

如何使用 C# 为 Windows IoT 编写一个 timecritic 后台应用程序?

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

另外,如果我们实现一个计时器,那么每一步的步骤之间的时间是不一样的。

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

我怎样才能对他动作正确的电机进行编程?

数据:

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

驱动程序:A4988

【问题讨论】:

标签: c# windows raspberry-pi2 iot time-critical


【解决方案1】:

我们在iot-devices project 中添加了对软件 PWM 和硬件 PWM 的 C# 支持。您可能还会看到 this C++ example 使用 Windows IoT Core 驱动步进电机。如有必要,您可以使用System.Threading.Tasks.Task.Delay 实现类似于 Thread.Sleep 的功能。

【讨论】:

    【解决方案2】:

    也许是这样:

    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);
            }
    

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

    10ms delay

    如果这个电机用外置伺服驱动会更好,带步进方向接口。

    【讨论】:

      【解决方案3】:

      您应该有一个将 I/O 状态与时间联系起来的法则,以及一个具有适当分辨率的时钟。然后你有一个线程不断循环并用时钟检查经过的时间。通过应用该定律,您可以根据需要升高/降低 I/O。

      【讨论】:

      • 你能用代码的形式解释一下吗?因为我在 C# 中有一个后台应用程序,并且我无法执行任何 timecritic 任务,所以没有睡眠或其他东西。请举个例子。
      【解决方案4】:

      我们可以使用ThreadPoolTimer

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

      By Rick Lesniak

      【讨论】:

        【解决方案5】:

        看起来是这样的:

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

        我习惯这样做:

        Thread.Sleep(1000);
        

        那么为什么 C# IoT 编码如此复杂? 我还在 Raspberry Pi 上使用 C++ 进行编程,看起来物联网的未来是 Linux,如果 MS-10 C# 期望 6 行代码在一个线程中执行固定延迟。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-02
          • 2018-02-22
          • 1970-01-01
          • 1970-01-01
          • 2018-05-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多