串行发送按钮

本文关键字:按钮 | 更新日期: 2023-09-27 18:29:41

我想制作RC并使用串行通信对其进行远程控制。我想:

  • 如果我在键盘上按"W",发送"1000"
  • 如果我按键盘上的"S",发送"0100"
  • 如果我在键盘上按"A",发送"0010"
  • 如果我在键盘上按"D",则发送"0001"
  • 如果我按"W"answers"A",发送"1010"
  • 如果我按"W"answers"D",发送"1001"
  • 等等,就像我们玩游戏一样

我制作了一个代码,但当我同时按下a和W时,它不起作用。代码没有发送"1010",只发送了"1000"

private void SEND_KeyPress(object sender, KeyPressEventArgs e)
{
    string tx;
    if (e.KeyChar == (char)Keys.W & e.KeyChar == (char)Keys.A)
    {
        tx = "1010";
        serialPort1.Write(tx);
    }
    if (e.KeyChar == (char)Keys.W & e.KeyChar == (char)Keys.D)
    {
        tx = "1001";
        serialPort1.Write(tx);
    }
    if (e.KeyChar == (char)Keys.S & e.KeyChar == (char)Keys.A)
    {
        tx = "0110";
        serialPort1.Write(tx);
    }
    if (e.KeyChar == (char)Keys.W & e.KeyChar == (char)Keys.A)
    {
        tx = "0101";
        serialPort1.Write(tx);
    }
    if (e.KeyChar == (char)Keys.W)
    {
        tx = "1000";
        serialPort1.Write(tx);
    }
    if (e.KeyChar == (char)Keys.S)
    {
        tx = "0100";
        serialPort1.Write(tx);
    }
    if (e.KeyChar == (char)Keys.A)
    {
        tx = "0010";
        serialPort1.Write(tx);
    }
    if (e.KeyChar == (char)Keys.D)
    {
        tx = "0001";
        serialPort1.Write(tx);
    }
}

串行发送按钮

A和W永远不可能同时按下,无论你怎么尝试,它们都会关闭。一个总是发生在另一个之前。每次按键都会触发按键。

您需要订阅keydown和keyup。当keydown发生时,将按下的键记录在哈希列表中。当keyup发生时,检查哈希列表是否包含A和W,然后发送1010。

在处理较短的组合键之前,请先检查最高的组合键,然后再检查单个组合键。在Keyup中这样做很重要,因为用户需要一个机会按下所有组合键并按住它们。如果你尝试在keydown中执行此操作,你会遇到同样的问题(每次总是1)。

//DetectCombination like this:
    public DateTime PrevPress { get; set; }
    public DateTime CurrentPress { get; set; }
    public string PrevKey { get; set; }
    private void SEND_KeyPress(object sender, KeyPressEventArgs e)
    {
        string keycomb = DetectCombination(e.KeyChar.toString);
    }
    public string DetectCombination(string currentKey)
    {
        CurrentPress = DateTime.Now;
        if(CurrentPress.CompareTo(PrevPress) < //100ms)
        {
            PrevKey+=currentKey;
        }
        else
        {
            PrevKey = currentKey;
            PrevPress = CurrentPress;
        }
        return PrevKey;
    }

//还需要一个函数来应用您的逻辑,但似乎您已经处理好了。

来自MSDN文档:

字符时发生。按下空格键或退格键,同时控制具有焦点。

每个键触发一次此事件处理程序。这意味着这条线路

if (e.KeyChar == (char)Keys.W & e.KeyChar == (char)Keys.A)

将始终评估为false。更不用说一个变量不能同时为多个值这一事实了。

因此,如果你想检测多个关键点,你必须用另一种方法。一种方法是,每次按键时,都将值存储在缓冲区中,首先检查缓冲区是否已经有值,如果已经有,则相应地修改发送值。然后运行一个计时器,所以每次计时器结束时,它都会发送缓冲区中的任何数据,然后将其清除。

A和W永远不能真正同时按下,首先检查W,然后检查A,最后通过值1010

if(e.KeyChar==(char)Keys.W)

   if(e.KeyChar == (char)Keys.A)
    { 
      tx = "1010";
      serialPort1.Write(tx);
    }

}