micro:bit 可以一会儿读一会儿吗?
Can micro:bit read while in another while?
所以我在编程时遇到了问题 micro:bit。我在网页上编码,然后下载十六进制文件并将其传输到 micro:bit。在互联网模拟器上一切正常。显然,当我将其转移到 micro:bit 时,代码无法正常工作。代码真的很简单,看起来像这样。
当变量为 0 时动画重复(这部分工作完美)
A按钮使变量1,B使变量2(这部分有效)
当变量不为 0 时,它会中断第一个动画循环。 (这部分也有效)
然后进入第二个循环,当变量不为 0 时重复(它永远不会是 0,因为没有使变量为 0 的按钮)所以它永远重复(这个有效)
在第二个循环中,还有2个循环。当变量为 1 时第一次重复,当变量为 2 时第二次重复。这使我可以随时在这两个循环之间切换。 (问题出现在这里:例如,我在循环 2 中,我无法切换到第一个循环,否则。)
所有这些错误都发生在 micro:bit 机器人中,当代码被传输时。在互联网模拟器代码中完美运行。是否可以在 micro:bit 中执行该代码,我达到了限制吗?还是机器人有缺陷?感谢您的回答,如果有不清楚的地方请告诉我。
这当然很难在没有看到任何 blocks/code 的情况下进行调试,因为我不知道您如何检测在 第二个循环 中按下的按钮.
但是,由于您在按下按钮时更改变量的方式,这可能是一个调度问题。也许考虑重组您的块,使它们更受事件驱动,利用 on button A Pressed 等块更好一点,最好避免无限循环。另外,也许考虑在 while 循环中放置一个 pause(100)。
希望这对您有所帮助 ;)
编辑:
OP 确认 pause(100) 有效(请参阅此答案的评论),表明这是一个调度问题!
有兴趣的朋友;)...这是因为CPU忙于执行while循环,没时间考虑按钮被按下。 pause(100) 允许 CPU 休息一下,而不是考虑 while 循环,给它处理按钮按下所需的时间。这就是所谓的合作调度!
您可以在以下位置找到有关合作调度的更多信息:
如果您的代码看起来像这样,您将永远无法更改状态变量。您将陷入内部循环之一,无法更改控制变量。:
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
...
这仍然不完美,您可能需要考虑如果按 'unusual' 次序列会发生什么情况。模拟器 应该 是相同的,但是按钮按下的处理方式和破坏模拟器的代码可能有些不寻常。如果模拟器真的坏了,你需要与 micro:bit 团队分享一个测试用例。
所以我在编程时遇到了问题 micro:bit。我在网页上编码,然后下载十六进制文件并将其传输到 micro:bit。在互联网模拟器上一切正常。显然,当我将其转移到 micro:bit 时,代码无法正常工作。代码真的很简单,看起来像这样。
当变量为 0 时动画重复(这部分工作完美)
A按钮使变量1,B使变量2(这部分有效)
当变量不为 0 时,它会中断第一个动画循环。 (这部分也有效)
然后进入第二个循环,当变量不为 0 时重复(它永远不会是 0,因为没有使变量为 0 的按钮)所以它永远重复(这个有效)
在第二个循环中,还有2个循环。当变量为 1 时第一次重复,当变量为 2 时第二次重复。这使我可以随时在这两个循环之间切换。 (问题出现在这里:例如,我在循环 2 中,我无法切换到第一个循环,否则。)
所有这些错误都发生在 micro:bit 机器人中,当代码被传输时。在互联网模拟器代码中完美运行。是否可以在 micro:bit 中执行该代码,我达到了限制吗?还是机器人有缺陷?感谢您的回答,如果有不清楚的地方请告诉我。
这当然很难在没有看到任何 blocks/code 的情况下进行调试,因为我不知道您如何检测在 第二个循环 中按下的按钮.
但是,由于您在按下按钮时更改变量的方式,这可能是一个调度问题。也许考虑重组您的块,使它们更受事件驱动,利用 on button A Pressed 等块更好一点,最好避免无限循环。另外,也许考虑在 while 循环中放置一个 pause(100)。
希望这对您有所帮助 ;)
编辑:
OP 确认 pause(100) 有效(请参阅此答案的评论),表明这是一个调度问题!
有兴趣的朋友;)...这是因为CPU忙于执行while循环,没时间考虑按钮被按下。 pause(100) 允许 CPU 休息一下,而不是考虑 while 循环,给它处理按钮按下所需的时间。这就是所谓的合作调度!
您可以在以下位置找到有关合作调度的更多信息:
如果您的代码看起来像这样,您将永远无法更改状态变量。您将陷入内部循环之一,无法更改控制变量。:
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
...
这仍然不完美,您可能需要考虑如果按 'unusual' 次序列会发生什么情况。模拟器 应该 是相同的,但是按钮按下的处理方式和破坏模拟器的代码可能有些不寻常。如果模拟器真的坏了,你需要与 micro:bit 团队分享一个测试用例。