Crie seu próprio programa de comunicação serial em C# - Tutorial 2(teclas direcionais)

É uma pergunta recorrente aqui no fórum, principalmente entre os que estão fazendo teste com carrinhos, ou robôs que precisem de orientação sobre o uso das teclas direcionais do PC.

Neste tutorial, estarei mostrando como identificar que essas teclas foram pressionadas. Mostrarei dois exemplos, o primeiro mais rápido e fácil de criar, e o outro mais geral.

Primeiro exemplo: Formulário “limpo”, sem outros componentes gráficos.

Nesse exemplo o único componente extra será o SerialPort usado pra a comunicação com o arduino. Ajustem nas propriedades o nome da porta e o baudRate.No meu caso alterei também o nome de serialPort1 para Porta.

 Na lista de eventos do formulário existe um evento chamado KeyDown que é chamado quando uma tecla é pressionada quando o formulário tem foco.

Clicando nele, será aberto o código para a edição desse evento, modifique de forma que fique semelhante a isso:

private void Form1_KeyDown(object sender, KeyEventArgs e)

        {

            try

            {

                Porta.Open();

                if (e.KeyCode == Keys.Up)

                {

                    Porta.Write("U");

                    Text = "Up";

                }

                if (e.KeyCode == Keys.Down)

                {

                    Porta.Write("D");

                    Text = "Down";

                }

                if (e.KeyCode == Keys.Right)

                {

                    Porta.Write("R");

                    Text = "Right";

                }

                if (e.KeyCode == Keys.Left)

                {

                    Porta.Write("L");

                    Text = "Left";

                }

                Porta.Close();

            }

            catch

            {

                Text = "Erro na comunicação";

            }

        }

Pegarei para a explicação o seguinte trecho:

               if (e.KeyCode == Keys.Right)

                {

                    Porta.Write("R");

                    Text = "Right";

                }

Trata-se de uma condição simples, o objeto e guarda entre outras coisas, a informação de qual tecla disparou esse evento. O que foi feito foi comparar essa informação com “Keys.Right” que representa o código da tecla direcional, nesse caso direita.Como resultado afirmativo podemos enviar o dado que nos for conveniente para o arduino, nesse caso enviei a um caráter R’ e escrevi no titulo do formulário “Right”.

Porta.Open(),Porta.Close() e try ... catch já expliquei no tutorial passado.

Todo o programa se resume a isso.

Segundo exemplo: Formulário que contenha outros componentes gráficos.

Para casos onde temos que usar outros elementos gráficos como botões, listas, caixas de texto no formulário, o método passado não funciona porque ele não receberá mais foco, e sim algum outro elemento já listado.

Nesses casos devemos escolher quais dos elementos vão gerar o evento de KeyDown para usarmos o método passado. Nesse segundo exemplo adicionei 4 botões.

Pra quem já escreveu o Form1_KeyDown primeiro exemplo, podemos usa-lo como KeyDown de todos os quatro botões, aqui renomeei para teclado.

Selecionando todos e relacionando aos eventos de KeyDown a mesma rotina teclado.

 

Até aqui alguem poderia pensar que não há diferença entre o primeiro exemplo e o segundo.

De fato se fossemos usar outras teclas, por exemplo, as de caracteres, isso resolveria nosso caso.

Porém queremos usar as direcionais que por padrão são usadas para navegar(mudar o foco) entre os controles, nesse caso botões. Sendo assim a priori não geram um evento de KeyDown.

Isso pode ser revertido usando um evento que ocorre antes do KeyDown, o PreviewKeyDown.

Acesse esse evento de qualquer controle  edite o código da seguinte forma:

        private void detectar_tecla(object sender, PreviewKeyDownEventArgs e)

        {

            if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right)

            {

                e.IsInputKey =  true;

            }        

        }

Aqui troquei o nome da função para detectar_tecla mas não é obrigatório.O mais importante é entender como ela funciona.

Foi feita uma comparação para saber se a tecla que gerou o evento foi uma direcional, se sim, atribua a e.IsInputKey o valor true. O que significa que será gerado também um evento KeyDown logo em seguida.

Repito, para teclas, como as alfabéticas, não se precisa usar o evento PreviewKeyDown que por padrão iram gerar e.IsInputKey = true para essas teclas, desencadeando assim o KeyDown automaticamente .

Depois atribua detectar_tecla aos PreviewKeyDown de todos os botões.

No evento do Click de cada botão coloquem o comando correspondente a sua tecla direcional, por exemplo:

        private void button3_Click(object sender, EventArgs e)

        {

            try

            {

                Porta.Open();

                Porta.Write("R");

                Text = "Right";

                Porta.Close();

            }

            catch

            {

                Text = "Erro na comunicação";

            }

        }

Assim o evento do Click faz a mesma coisa do teclado, com uma pequena diferença. Caso o usuário mantenha o teclado pressionado o programa enviará informações de forma continua da mesma forma de quando se mantém pressionada uma tecla alfanumérica num editor de texto.

Assim conseguimos enviar informações para o arduino, através de comando por teclado, adaptem a suas necessidades. Até a próxima.

Código completo:

http://pastebin.com/HNSwwJ9v

Exibições: 1585

Responder esta

Respostas a este tópico

Show Yure!!!!!
Muito bacana.....

É dificil fazer uma especie de um "select" nas portas seriais e deixar que o usuario escolha em qual porta quer utilizar?

Abs..
Eu tenho a solução para sua duvida, só queria mostrar no final dos tutoriais, mas já que vc falou será o tema do próximo:)

Valeu Yure vou aguardar o próximo tutorial.

Abs!

Qual o programa que você usa para fazer esta aplicação?

Visual Studio

Yure muito bom , eu estou iniciando no visual Studio , mas estou com um pequeno probleminha , estou iniciando pelo básico e gostaria de fazer uma aplicação onde ao pressionar um botão será impresso uma msg num  Label , coisa bem simples mesmo , gostaria de saber qual a linha de comando para fazer isso o programa ficou assim  :

private void button1_Click(object sender, EventArgs e)
{
label1.Text = "ola";
}

So que da erro , como leigo não sei o que pode ser , poderia me ajudar? , é so um exemplo bem simples mesmo. No que eu estaria errando?

Qual a descrição do erro?

yure  , foi um bug estranhíssimo , quando fui pegar para mexer agora funcionou , achei estranho , fechei e abri o visual studio novamente e funcionou normalmente , mas posso lhe incomodar mais vezes se preciso , muito obrigado e continue com este belo trabalho que tem feito , estou esperando por mais tutoriais.

Cara, muito bom isso. Valeu mesmo. 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço