你好我的c#app控制的机器人轮椅有问题。 我可以通过按钮来控制汽车,这是很好的。问题是通过键盘字母控制。 当我按住W,A,S,D c#constantlly发送命令到arduino并且可以产生电机冻结和连续驱动。 问题是我可以修改c#代码只发送一个命令(而不是每秒发送大约10次相同的命令)就像我按下按钮一样。
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.W:
Arduino.Write("R");
break;
case Keys.S:
Arduino.Write("A");
break;
case Keys.A:
Arduino.Write("I");
break;
case Keys.D:
Arduino.Write("S");
break;
}
}
答案 0 :(得分:0)
您是否考虑过实施定时器以在写入Arduino之间造成延迟?您可以比较按下按键的时间,以及返回特定时间段是否已经过去的函数(如果有,则返回true或false),如果为true,则可以调用Arduino.Write函数。虽然该功能会连续调用,但Arduino的写入将根据您的计时器而延迟。
问题的格式不同,但我相信这可能会对您有所帮助:How can I get rid of character repeat delay in C#?
答案 1 :(得分:0)
试试这个:
// Add this before all the methods
private bool canSend = true;
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
var timer = new Timer();
timer.Interval = 5000; // Example value, multiply number of seconds by 1000 to get a value
timer.Tick += new EventHandler(TimerTick);
if (!canSend) return;
switch (e.KeyCode)
{
case Keys.W:
Arduino.Write("R");
break;
case Keys.S:
Arduino.Write("A");
break;
case Keys.A:
Arduino.Write("I");
break;
case Keys.D:
Arduino.Write("S");
break;
}
canSend = false;
timer.Start();
}
private void TimerTick(object sender, EventArgs e)
{
canSend = true;
}
这样做是检查它是否可以发送命令。如果可以,它将启动一个新的计时器(在我做的例子中为5秒)并重置bool以便它可以再次发送它。
答案 2 :(得分:0)
最佳解决方案是在特定时间内设置超时或锁定资源(使用Mutex / Lock)
private bool isArduinoFree=true;
private int _timeOut=500; //equal to half second
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (isArduinoFree)
{
isArduinoFree=false;
switch (e.KeyCode)
{
case Keys.W:
Arduino.Write("R");
break;
case Keys.S:
Arduino.Write("A");
break;
case Keys.A:
Arduino.Write("I");
break;
case Keys.D:
Arduino.Write("S");
break;
}
Thread.Sleep(_timeOut);
_isArduinoFree=true;
}
}
警告:如果您使用睡眠它会冻结您可以创建任务并启动它。