如何使用控件.KeyUp事件在我的代码
本文关键字:我的 代码 事件 KeyUp 何使用 控件 | 更新日期: 2023-09-27 18:17:19
我的c#代码有问题(或缺乏人才)。我用这个代码来控制机器人通过蓝牙,我有它的工作很好,当我按:W - forward,S -向后,A -左,D -对,左前锋,E -向右前进,Z -向左后退,X -向后右,O -抬起机械臂,放下手臂,N -打开手柄,M -握紧握把,停止上面的所有命令,
现在这些是通过Keydown命令处理的,它们工作得很好。问题是,我不知道如何停止任何这些命令,当我不按任何键。作为临时修复,我一直使用"Y"键停止所有动作,但我确信有一个更好的方法来解决这个问题,使用keyUp或类似的东西。
你能不能给我举一个例子,也许我的命令W,我应该如何处理,如果W不再按下,我想让机器人停止?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using AForge.Video;
namespace RoverControl
{
public partial class Form1 : Form
{
MJPEGStream stream;
public Form1()
{
InitializeComponent();
}
// Declare the comands for Rover control//
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode.ToString() == "W") // Keyboard characeter "W" //
try
{
serialPort1.Write("F"); // Passing the command "Forward" through letter "F" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover."); // Exception in the case letter "W" is pressed without connection being established//
}
if (e.KeyCode.ToString() == "S") // Keyboard characeter "S" //
try
{
serialPort1.Write("B"); // Passing the command "Backward" through letter "B" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "A") // Keyboard characeter "A" //
try
{
serialPort1.Write("L"); // Passing the command "Left" through letter "L" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "D") // Keyboard characeter "D" //
try
{
serialPort1.Write("R"); // Passing the command "Right" through letter "R" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "Q") // Keyboard characeter "Q" //
try
{
serialPort1.Write("G"); // Passing the command "Forward Left" through letter "G" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "E") // Keyboard characeter "E" //
try
{
serialPort1.Write("I"); // Passing the command "Forward Right" through letter "I" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "Z") // Keyboard characeter "Z" //
try
{
serialPort1.Write("H"); // Passing the command "Backward Left" through letter "H" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "X") // Keyboard characeter "X" //
try
{
serialPort1.Write("J"); // Passing the command "Backward Right" through letter "J" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "O") // Keyboard characeter "O" //
try
{
serialPort1.Write("O"); // Passing the command "Up" through letter "O" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "P") // Keyboard characeter "P" //
try
{
serialPort1.Write("P"); // Passing the command "Down" through letter "P" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "N") // Keyboard characeter "N" //
try
{
serialPort1.Write("N"); // Passing the command "Open" through letter "N" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "M") // Keyboard characeter "M" //
try
{
serialPort1.Write("M"); // Passing the command "Close" through letter "M" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "C") // Keyboard characeter "C" //
try
{
serialPort1.Write("C"); // Passing the command "" through letter "C" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "c") // Keyboard characeter "c" //
try
{
serialPort1.Write("c"); // Passing the command "" through letter "c" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "V") // Keyboard characeter "V" //
try
{
serialPort1.Write("V"); // Passing the command "" through letter "V" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "v") // Keyboard characeter "v" //
try
{
serialPort1.Write("v"); // Passing the command "" through letter "v" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "U") // Keyboard characeter "U" //
try
{
serialPort1.Write("U"); // Passing the command "" through letter "U" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "u") // Keyboard characeter "u" //
try
{
serialPort1.Write("u"); // Passing the command "" through letter "u" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "Y") // Keyboard characeter "Y" //
try
{
serialPort1.Write("S"); // Passing the command "Stop" through letter "S" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
}
void stream_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
Bitmap bmp = (Bitmap) eventArgs.Frame.Clone();
pictureBox1.Image = bmp;
}
private void Start_Click(object sender, EventArgs e)
{
string IP = "";
IP = textBox3.Text;
stream = new MJPEGStream(IP);
stream.NewFrame += stream_NewFrame;
try
{
stream.Start();
}
catch (Exception)
{
MessageBox.Show("Please enter valid IP address.");
}
}
private void Stop_Click(object sender, EventArgs e)
{
stream.Stop();
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
string COM = "";
COM = comboBox1.Text;
serialPort1.PortName = COM;
serialPort1.BaudRate = 9600;
}
private void button1_Click(object sender, EventArgs e)
{
try
{
serialPort1.Open();
}
catch (Exception)
{
var dialogResult = MessageBox.Show("Please select correct Comunication Port.");
}
}
private void Disconnect_Click(object sender, EventArgs e)
{
serialPort1.Close();
}
}
}
好的,所以当我添加你建议的代码时,我仍然有同样的问题。我按W键向前移动,当我释放W键时,它仍然向前移动。我的代码编辑错了吗?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using AForge.Video;
namespace RoverControl
{
public partial class Form1 : Form
{
MJPEGStream stream;
public Form1()
{
InitializeComponent();
}
// Declare the comands for Rover control//
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode.ToString() == "W") // Keyboard characeter "W" //
try
{
serialPort1.Write("F"); // Passing the command "Forward" through letter "F" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover."); // Exception in the case letter "W" is pressed without connection being established//
}
if (e.KeyCode.ToString() == "S") // Keyboard characeter "S" //
try
{
serialPort1.Write("B"); // Passing the command "Backward" through letter "B" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "A") // Keyboard characeter "A" //
try
{
serialPort1.Write("L"); // Passing the command "Left" through letter "L" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "D") // Keyboard characeter "D" //
try
{
serialPort1.Write("R"); // Passing the command "Right" through letter "R" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "Q") // Keyboard characeter "Q" //
try
{
serialPort1.Write("G"); // Passing the command "Forward Left" through letter "G" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "E") // Keyboard characeter "E" //
try
{
serialPort1.Write("I"); // Passing the command "Forward Right" through letter "I" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "Z") // Keyboard characeter "Z" //
try
{
serialPort1.Write("H"); // Passing the command "Backward Left" through letter "H" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "X") // Keyboard characeter "X" //
try
{
serialPort1.Write("J"); // Passing the command "Backward Right" through letter "J" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "O") // Keyboard characeter "O" //
try
{
serialPort1.Write("O"); // Passing the command "Up" through letter "O" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "P") // Keyboard characeter "P" //
try
{
serialPort1.Write("P"); // Passing the command "Down" through letter "P" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "N") // Keyboard characeter "N" //
try
{
serialPort1.Write("N"); // Passing the command "Open" through letter "N" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "M") // Keyboard characeter "M" //
try
{
serialPort1.Write("M"); // Passing the command "Close" through letter "M" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "C") // Keyboard characeter "C" //
try
{
serialPort1.Write("C"); // Passing the command "" through letter "C" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "c") // Keyboard characeter "c" //
try
{
serialPort1.Write("c"); // Passing the command "" through letter "c" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "V") // Keyboard characeter "V" //
try
{
serialPort1.Write("V"); // Passing the command "" through letter "V" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "v") // Keyboard characeter "v" //
try
{
serialPort1.Write("v"); // Passing the command "" through letter "v" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "U") // Keyboard characeter "U" //
try
{
serialPort1.Write("U"); // Passing the command "" through letter "U" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "u") // Keyboard characeter "u" //
try
{
serialPort1.Write("u"); // Passing the command "" through letter "u" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
if (e.KeyCode.ToString() == "Y") // Keyboard characeter "Y" //
try
{
serialPort1.Write("S"); // Passing the command "Stop" through letter "S" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
}
void Form1_KeyUp(object sender, KeyEventArgs e)
{
try
{
serialPort1.Write("S"); // Passing the command "Stop" through letter "S" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
}
void stream_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
Bitmap bmp = (Bitmap) eventArgs.Frame.Clone();
pictureBox1.Image = bmp;
}
private void Start_Click(object sender, EventArgs e)
{
string IP = "";
IP = textBox3.Text;
stream = new MJPEGStream(IP);
stream.NewFrame += stream_NewFrame;
try
{
stream.Start();
}
catch (Exception)
{
MessageBox.Show("Please enter valid IP address.");
}
}
private void Stop_Click(object sender, EventArgs e)
{
stream.Stop();
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
string COM = "";
COM = comboBox1.Text;
serialPort1.PortName = COM;
serialPort1.BaudRate = 9600;
}
private void button1_Click(object sender, EventArgs e)
{
try
{
serialPort1.Open();
}
catch (Exception)
{
var dialogResult = MessageBox.Show("Please select correct Comunication Port.");
}
}
private void Disconnect_Click(object sender, EventArgs e)
{
serialPort1.Close();
}
}
}
首先,不建议使用非实时系统来控制移动的东西。这包括蓝牙通信协议和PC本身(更具体地说,Windows操作系统)。由于明显的安全问题,这样的系统永远无法通过任何商业或工业测试。
现在回到你的问题。我要做的是,以"状态"方式定义PC与机器人控制器之间的协议,而不是以事件驱动的方式。例如,我们不应该发送"前进"键刚刚被按下或释放的事件,而应该发送描述"前进"键是否被按下的状态。机器人侧不需要知道按键何时被按下或释放,它只需要知道是否应该向前移动。
在PC端,维护一个状态机,当处于运行模式时,定期发送密钥状态,例如每10ms。
来检测当前的键状态,如果你使用WPF,你可以直接通过Keyboard.IsKeyDown()方法来检测它,或者用WinForm
来维护你自己的KeyUp/KeyDown事件的状态。在机器人控制器方面,事情变得相对容易,因为它们大多数以状态机的方式运行,最终你必须将控制命令转换成单比特数字输出到电机或伺服。基于状态的通信协议与此完美配合。例如,"前进键正在被按下"的状态直接转换为"打开X轴电机的数字输出xxx"。
希望能有所帮助。
替换构造函数:
public Form1()
{
InitializeComponent();
this.KeyUp += new KeyEventHandler(Form1_KeyUp);
}
然后添加
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode.ToString() == "S" || e.KeyCode.ToString() == "W")//Check conditions
{
try
{
serialPort1.Write("S"); // Passing the command "Stop" through letter "S" in arduino code//
}
catch (Exception)
{
MessageBox.Show("Please establish the connection with rover.");
}
}
}