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 casodireita.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 valortrue. 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 gerare.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://adf.ly/1UB38I

Exibições: 3348

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Ramon em 20 agosto 2013 às 19:38

Boa Noite.

Você poderia me ajudar ?

como faço para ler o que vem na serial do Arduíno  no visual ??

tentei  SerialPort1.Read () 

Comentário de MIRELLA LINS DIAS DOS SANTOS em 15 agosto 2013 às 12:33

Nossa vlw mesmo! De muita ajuda!

© 2021   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço