串行发送按钮
本文关键字:按钮 | 更新日期: 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);
}
}