c#向下键命令到arduino

本文关键字:arduino 命令 | 更新日期: 2023-09-27 18:21:00

你好,我的c#应用程序控制的机器人轮椅有问题。我可以按按钮控制汽车,这很好。问题是通过键盘字母控制。当我按住W、A、S、D时,会不断地向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;
        }
    }

c#向下键命令到arduino

您有没有想过实现一个定时器,以在写入Arduino之间造成延迟?您可以将按键的时间与一个返回特定时间段是否已过的函数进行比较(如果已过,则返回true或false),如果为true,则可以调用Arduino.Write函数。尽管该函数将持续调用,但写入Arduino的操作将根据您的计时器而延迟。

问题的格式有所不同,但我相信这可能会对您有所帮助:如何消除C#中的字符重复延迟?

试试这个:

// 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,这样它就可以再次发送。

最佳解决方案是在特定时间内设置超时锁定资源(使用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;
           }
   }

注意:如果你使用睡眠,它会冻结,你可以创建一个任务并启动它。