Jump to content
Sign in to follow this  
terran

Teclas direccionais com porta de série

Recommended Posts

terran

Boas pessoal,

Ando a fazer um código meio manhoso mas não sei bem como estruturar isto e se está na melhor maneira. O que tenho de fazer é o seguinte:

Usar as teclas direccionais e de cada vez que pressiono uma tecla envio um determinado vector, tenho 4 vectores, Frente, trás, Esquerda e Direita, se for só uma tecla envia o vector correspondente, se forem duas, envia os dois, por exemplo esquerda e frente.

Neste programa estou a enviar só um vector de cada vez que faço o evento down da tecla, haverá outra maneira de colocar a enviar sempre? Em relação ao envio, o tempo de resposta do envio pelo C# por série é muito maior do que se enviar por terminal. Haverá como coloca-lo mais rápido.

O código é o seguinte:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO.Ports;

namespace Carro
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll")]
        //static extern ushort GetAsyncKeyState(int vKey);
        static extern bool GetAsyncKeyState(System.Windows.Forms.Keys vKey);
        public SerialPort port = new SerialPort("COM5", 19200, Parity.None, 8, StopBits.One);
        public char[] Frente = new char[4];
        public char[] Tras = new char[4];
        public char[] Esquerda = new char[4];
        public char[] Direita = new char[4];
        


        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, System.EventArgs e)
        {
            
            port.Open();
            Frente[0] = (char)035; Frente[1] = (char)083; Frente[2] = (char)009; Frente[3] = (char)003;
            Tras[0] = (char)035; Tras[1] = (char)083; Tras[2] = (char)009; Tras[3] = (char)003;
            Esquerda[0] = (char)035; Esquerda[1] = (char)083; Esquerda[2] = (char)009; Esquerda[3] = (char)003;
            Direita[0] = (char)035; Direita[1] = (char)083; Direita[2] = (char)002; Direita[3] = (char)190;
            if (port.IsOpen)
                MessageBox.Show("Olá");
            this.KeyPreview = true;
            //this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyPress);
            this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);
            this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyUP);
            textBox1.Enabled = false;
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (GetAsyncKeyState(Keys.Up) && (!GetAsyncKeyState(Keys.Left)) && (!GetAsyncKeyState(Keys.Right)) && (!GetAsyncKeyState(Keys.Down))){
                this.KeyPreview = true;
            }
            if (!GetAsyncKeyState(Keys.Up) && (!GetAsyncKeyState(Keys.Left)) && (!GetAsyncKeyState(Keys.Right)) && (GetAsyncKeyState(Keys.Down))){
                this.KeyPreview = true;
            }
            if (!GetAsyncKeyState(Keys.Up) && (GetAsyncKeyState(Keys.Left)) && (!GetAsyncKeyState(Keys.Right)) && (!GetAsyncKeyState(Keys.Down))){
                this.KeyPreview = true;
                port.Write(Esquerda, 0, 4);
            }
            if (!GetAsyncKeyState(Keys.Up) && (!GetAsyncKeyState(Keys.Left)) && (GetAsyncKeyState(Keys.Right)) && (!GetAsyncKeyState(Keys.Down))){
                this.KeyPreview = true;
                port.Write(Direita, 0, 4);
            }

            ///
            if (GetAsyncKeyState(Keys.Up) && (GetAsyncKeyState(Keys.Left)) && (!GetAsyncKeyState(Keys.Right)) && (!GetAsyncKeyState(Keys.Down))){
                this.KeyPreview = true;
            }
            if (GetAsyncKeyState(Keys.Up) && (!GetAsyncKeyState(Keys.Left)) && (GetAsyncKeyState(Keys.Right)) && (!GetAsyncKeyState(Keys.Down))){
                this.KeyPreview = true;
            }
            ///
            if (!GetAsyncKeyState(Keys.Up) && (GetAsyncKeyState(Keys.Left)) && (!GetAsyncKeyState(Keys.Right)) && (GetAsyncKeyState(Keys.Down))){
                this.KeyPreview = true;
            }
            if (!GetAsyncKeyState(Keys.Up) && (!GetAsyncKeyState(Keys.Left)) && (GetAsyncKeyState(Keys.Right)) && (GetAsyncKeyState(Keys.Down))){
                this.KeyPreview = true;
            }
        }
        private void Form1_KeyUP(object sender, KeyEventArgs e)
        {
            if (GetAsyncKeyState(Keys.Up) && (!GetAsyncKeyState(Keys.Left)) && (!GetAsyncKeyState(Keys.Right)) && (!GetAsyncKeyState(Keys.Down))){
                this.KeyPreview = false;
            }
            if (!GetAsyncKeyState(Keys.Up) && (GetAsyncKeyState(Keys.Left)) && (!GetAsyncKeyState(Keys.Right)) && (!GetAsyncKeyState(Keys.Down))){
                this.KeyPreview = false;
            }
            if (!GetAsyncKeyState(Keys.Up) && (!GetAsyncKeyState(Keys.Left)) && (GetAsyncKeyState(Keys.Right)) && (!GetAsyncKeyState(Keys.Down))){
                this.KeyPreview = false;
            }
            if (GetAsyncKeyState(Keys.Up) && (!GetAsyncKeyState(Keys.Left)) && (!GetAsyncKeyState(Keys.Right)) && (GetAsyncKeyState(Keys.Down))){
                this.KeyPreview = false;
            }
        }
    }
}

Se alguém me conseguir elucidar e ajudar/alterar este programa para uma melhor forma, agradecia.

Obrigado

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.