1

所以我在编程 micro:bit 时遇到了问题。我在网页上对其进行编码,然后下载 hex 文件并将其传输到 micro:bit。在互联网模拟器上一切正常。显然,当我将其传输到 micro:bit 代码时,它不起作用。代码非常简单,看起来像这样。

  • 动画在变量为 0 时重复(这部分效果很好)

  • A按钮使变量为1,B使其为2(这部分有效)

  • 当变量不为 0 时,它会中断第一个动画循环。(这部分也有效)

  • 然后进入第二个循环,该循环在变量不是 0 时重复(它永远不会是 0,因为没有使变量为 0 的按钮)所以它永远重复(这有效)

  • 在第二个循环中,还有 2 个循环。第一次在变量为 1 时重复,第二次在变量为 2 时重复。这使我可以随时在这两个循环之间切换。(问题出现在这里:例如,我在循环 2 中,我无法切换到第一个循环,否则。)

在传输代码时,所有这些错误都发生在 micro:bit 机器人中。在互联网模拟器代码中完美运行。是否可以在 micro:bit 中执行该代码,我是否达到了限制?还是机器人有缺陷?感谢您的回答,如果有不清楚的地方请告诉我。

4

2 回答 2

1

这当然很难在没有看到任何块/代码的情况下进行调试,因为我不知道您如何检测在第二个循环中按下的按钮。

但是,由于您在按下按钮时更改变量的方式,这可能是一个调度问题。也许考虑重组你的块,使它们更受事件驱动,利用按钮 A 上的块按下更好一点,总是最好避免无限循环。另外,也许考虑在 while 循环中放置一个pause(100) 。

希望这可以帮助 ;)

编辑:

OP 确认pause(100)有效(请参阅此答案的评论),证明这是一个调度问题!

对于那些感兴趣的人 ;) ...这是因为 CPU 正忙于执行 while 循环并且没有时间考虑被按下的按钮。pause(100)允许 CPU 休息一会儿,而不是考虑 while 循环,给它处理按钮按下所需的时间。这就是所谓的合作调度!

您可以在以下位置找到有关协作调度的更多信息:

https://www.microbit.co.uk/device/reactive

于 2017-10-10T09:32:18.793 回答
-1

如果您的代码看起来像这样,您将永远无法更改您的状态变量。您将陷入其中一个内部循环,无法更改控制变量。:

while (unset):
  Animate
  Check for button
While (set): // Intend to be stuck in this loop forever
  While (one):
    Do first
  While (two):
    Do Second

您需要的是能够更新您的状态:

...
  While (one):
    Do First
    if (button_b.was_pressed()):
      state = two
...

这仍然不是完美的,您可能想考虑如果以“不寻常”的顺序按下按钮会发生什么。模拟器应该是相同的,但是对于按钮按下的处理方式以及破坏模拟器的代码可能会有一些不寻常的地方。如果模拟器真的坏了,你需要与 micro:bit 团队共享一个测试用例。

于 2017-10-10T12:49:14.350 回答