如何在我的代码中使用Control.KeyUp事件?

时间:2016-11-11 06:00:09

标签: c#

我的C#代码存在问题(或缺乏人才)。我正在使用此代码通过蓝牙控制机器人,当我按下时,我工作正常: W - 前进, S - 向后, A - 左, D - 对, Q - 前进左, E - 前进权, Z - 向后走, X - 向后右, O - 抬起机器人手臂, P - 放下手臂, 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();
        }

    }
}

2 个答案:

答案 0 :(得分:1)

首先,不建议使用非实时系统来控制移动物体。这包括蓝牙通信协议和PC本身(更具体地说,Windows操作系统)。这些系统永远无法通过任何商业或工业测试 - 出于明显的安全问题。

现在回到你的问题。我会做的是,

  • 在"状态"中定义PC和机器人控制器之间的协议。方式,而不是事件驱动的方式。例如,而不是发送"前进的事件"刚刚按下或释放了键,我们应该发送一个描述是否"前进的状态"钥匙被压了。机器人方面不需要知道何时按下或释放钥匙,只需要知道它是否应该向前移动。

  • 在PC端,
  • 维护状态机,当处于运行模式时,定期发送密钥状态,比如每10ms发送一次。

  • 检测当前密钥状态,如果使用WPF,可以通过Keyboard.IsKeyDown()方法直接检测,或者使用WinForm

    在机器人控制器方面,
  • 事情变得相对容易,因为大多数都以状态机方式运行,最终你必须将控制命令转换成电机或伺服的单位数字输出。并且基于状态的通信协议与此完美配合。例如,正在按下"前进键"状态直接转换为"打开X轴电机的数字输出xxx"。

希望它有所帮助。

答案 1 :(得分:0)

Repalce构造函数:

        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.");
                    }
                }
            }