• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

terran

Teclas direccionais com porta de série

1 mensagem neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora