我正在试图找到一种方法来创建一个2赫兹的方波发光二极管(基本上在高和低之间切换2赫兹)我有一个一般的感觉,我认为它应该如何去,但不是真的确定该做什么,因为我是新手C#,任何帮助将不胜感激!
以下是我的总体思路:
While(Programruns){
read input
(I feel like there should be a for loop here to keep the square wave going forever until I stop it)
if(button is pressed){
output square wave
}
else {
off}
}发布于 2021-09-09 12:48:55
您需要一个包含睡眠操作的循环。
您没有告诉我们如何打开和关闭发光二极管,所以我假设您有一个名为SetLED(val)的方法。val为0将关闭发光二极管,1将打开发光二极管。并且,我们有一个名为ButtonPressed()的方法,它在按钮被按下时返回true。
要得到2 2Hz的方波,你需要每250毫秒翻转一次val。这段代码会帮你做到这一点。
var ledState = 1;
while (ButtonPressed()) {
SetLED(ledState);
Thread.Sleep(250); //milliseconds
ledState = 1 - ledState; //flip the value
}
SetLED(0); // turn the LED off when done.这基本上是可行的。但是有一个复杂的问题: C#和它的各种底层操作系统不是hard real-time systems。因此,Thread.Sleep()有时会醒得有点晚。这些延迟唤醒可能会累积,使你的方波有点抖动,累积起来不到2赫兹。你不能对抖动做太多的事情。
但是,您可以通过查看时间时钟并计算每个循环中的休眠时间来避免频率下降。
表达式DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond以毫秒为单位得到当前时间(从很久以前的时期开始)。
因此,您可以在代码中计算下一次睡眠的毫秒数。这纠正了.Sleep()睡过头的问题。
var ledState = 1;
long nextTickTime = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
while (ButtonPressed()) {
SetLED(ledState);
nextTickTime += 250;
long nowTime = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
int sleepInterval = nextTickTime - nowTime;
if (sleepInterval > 0)
Thread.Sleep(sleepInterval);
ledState = 1 - ledState; //flip the value
}
SetLED(0); // turn the LED off when done.这是一个相当强健的闪光灯。您也可以在循环运行时引发priority of the thread,但这是另一天的问答。
https://stackoverflow.com/questions/69110243
复制相似问题