Comunicação Serial com C# e Arduino - Parte 1

comunicação-serial-c-destaque
Este post faz parte da série Comunicação Serial com C# e Arduino. Leia também os outros posts da série:

Uma interface entre o arduino e um computador muitas vezes é importante durante o desenvolvimento de projeto ou para controle de dispositivos através de uma interface gráfica. Pode-se usar uma aplicação no computador para Aquisição e exibição de dados em forma de gráfico durante algum experimento em laboratório ou estudo. Como já foi visto aqui no artigo sobre o Arduino Uno e sobre comunicação Serial com Arduino, a comunicação entre a placa e o computador é feira através de uma porta serial emulada através do driver da USB. Já foi exibido aqui uma aplicação de comunicação serial desenvolvida com a plataforma JAVA. Neste artigo vamos ensinar como desenvolver uma aplicação para Windows usando a plataforma .Net usando o ambiente Visual Studio da Microsoft, com a linguagem C#. Será desenvolvido um terminal simples, onde se poderá enviar e receber caracteres através de uma interface gráfica. Esse artigo também servirá de base para desenvolvermos uma aplicação envolvendo botões e outros elementos visuais.

 

Você pode baixar a versão express dessa ferramenta diretamente no site da plataforma. Selecione a opção Express 2013 for Windows Desktop. Após o download faça a instalação, que é um processo bem simples porém um pouco demorado, basta seguir os passos de instalação.

 

Ao Iniciar o Visual Studio será exibida sua tela inicial e para iniciar um novo projeto deve-se acessar o menu FILE > New Project. Como vamos trabalhar com a linguagem C#, deve-se selecionar a opção Visual C# no menu lateral. Agora vamos iniciar o passo a passo pra criar nossa aplicação:

 

comunicação-serial-c-newproject
Figura 2 - Iniciando um novo projeto

 

Primeiro passo é iniciar um novo projeto Windows Forms Application em C#:

 

comunicação-serial-c-config-novo-projeto
Figura 2 - Configurando um novo projeto

 

Agora vamos inserir os componentes no Form. O primeiro a ser inserido será um botão e deve-se mudar a sua propriedade Name para “btConectar” e a sua propriedade Text para “Conectar”, conforme exibido a seguir:

 

Serial botão conectar
Figura 3 - Inserindo um botão para conexão

 

Inserir um comboBox logo a frente do botão btConectar, inserido anteriormente:

 

comunicação-serial-c-combobox
Figura 4 - Inserindo uma comboBox

 

Inserir outro botão, logo abaixo do btConectar, e mudar a sua propriedade Text para “Enviar” e Name para btEnviar:

 

comunicação-serial-c-btEnviar
Figura 5 - Inserindo um botão para envio de dados

 

Agora vamos inserir um textBox, que receberá os dados a serem enviados. Após ser inserido, mudar a sua propriedade Name para “textBoxEnviar”:

 

comunicação-serial-c-textBoxEnviar-660x337
Figura 6 - Inserindo um textbox para inserir dados para envio

 

Agora vamos inserir um textBox maior, que exibirá os dados recebidos. Mudar as propriedades Name para “textBoxReceber”, Multiline para “True” e ScrollBar para “Vertical”. A aparência do Form ficará da seguinte forma:

 

comunicação-serial-c-textBobReceber
Figura 7 - Textbox para recpção de dados

 

Próximo passo é inserir um componente timer que será responsável pela atualização das portas COM disponíveis no PC. Selecione o componente timer e clique dentro do Form. Será exibido logo abaixo o componente timer1. Troque a propriedade Name para “timerCOM” e Interval para 1000, conforme exibido a seguir:

 

comunicação-serial-c-timerCOM
Figura 8 - timer para atualização de COMs disponíveis

 

Por último vamos inserir o componente de comunicação serial, o SerialPort. Selecione o componente SerialPort e depois clique dentro do Form. Será exibido este componente ao lado do timerCOM:

 

comunicação-serial-c-serialPort
Figura 9 - Inserindo o componente SerialPort responsável pela comunicação serial

 

 

Com os componentes inseridos no Form, vamos para a codificação.

 

Antes de conectar a porta Serial, é necessário verificar as portas COMs disponíveis para uso, e qual a porta o usuário deseja conectar. Para isso vamos atualizar a cada segundo a ComboBox com as portas disponíveis. Vamos criar um método privado dentro da classe Form1, que será chamado de atualizaListaCOMs. Clique com o botão direito no Form e selecione a opção View code. Insira o método atualizaListaCOMs(), conforme exibido no código a seguir:

 

 

Para testar a aplicação é necessário clicar no botão Start ou pressionar a tecla F5. Se tiver alguma porta disponível para comunicação, esta será listada dentro da comBox, conforme exibido a seguir:

 

omunicação-serial-c-testeAtualizaCOM
Figura 10 - Teste de atualização das portas COMs disponíveis

 

Na imagem acima nota-se que apenas a COM5 estava disponível. Caso uma placa Arduino seja inserida, é necessário que atualize automaticamente a lista. Para isso vamos usar o timerCOM que está configurado para gerar um evento a cada segundo. Inicialmente deve-se habilitar o timer logo após a inicialização do Form e colocar o método de atualização dentro do evento timerCOM_tick, conforme exibido a seguir:

 

Obs.: Para gerar o evento timerCOM_tick basta dar duplo clique no componente timerCOM na aba design.

 

 

Insira outro Arduino ou crie uma porta COM virtual para verificar que é atualizado automaticamente o comboBox:

 

teste de atualização de porta COM do Arduino e portas virtuais
Figura 11 - teste de atualização de porta COM do Arduino e portas virtuais

 

No exemplo acima foi criada uma COM virtual com o auxílio do programa VSPE, que pode ser baixado aqui.

 

Agora já se pode escolher em qual porta a aplicação vai conectar. O evento click do btConectar será usado para  fazer a conexão. Para criar esse evento, selecione a aba de design do Form e dê um duplo clique no botão conectar. Será gerado o evento e agora deve-se  inserir o código para conexão. O botão conectar também servirá para desconectar quando a porta já estiver conectada, confira o código a seguir:

 

 

-comunicação-serial-c-testConectar
Figura 12 - Teste de conexão

 

É necessário colocar uma proteção para que o programa não seja fechado e deixe a porta COM aberta, dessa forma impedindo que outros programas possam usá-la. Para isso vamos fechar a porta dentro do evento Form1_FormClosed:

 

 

O processo para conexão e fechamento da porta serial já está feito, e o próximo passo é fazer o programa enviar para o Arduino o que for digitado dentro do textBoxEnviar. Para isso, dentro do evento btEnviar_Click, deve-se inserir o seguinte código:

 

 

A recepção de dados requer um pouco mais de atenção. Inicialmente deve-se criar um evento serialPort1_DataReceived e uma variável global do tipo String. O processo de recepção acontece em uma Thread diferente da atualização dos componentes. A atualização do textBoxRebecer deve ser feita fora do evento de recepção da serial. Para isso criamos uma função trataDadoRecebido. Confira como ficará o código completo da aplicação:

 

 

Para testar a aplicação junto ao Arduino, vamos fazer o upload do seguinte sketch:

 

 

Nesse programa o Arduino simplesmente retornará o dado que ele receber. Dessa forma, quando enviarmos dados pelo programa, estes serão exibidos no computador por meio do textBoxRecebe. A figura abaixo exibe os dados enviados e recebidos pela aplicação:

 

comunicação-serial-c-testeComunicação
Figura 13 - Teste de envio recebimento de dados do Arduino

 

Agora que a aplicação está completa, ou seja, já conseguimos enviar e receber dados, vamos a um exemplo funcional. Conforme foi exibido no Artigo sobre comunicação serial no Arduino, vamos aproveitar o exemplo que acenderá o led através do comando vindo pela serial. Carregue o seguinte exemplo no Arduino:

 

 

Execute a aplicação, conectando a porta na qual o Arduino está ligado e envie o caractere ‘A’. Verifique o resultado no LED conectado ao pino 13 da placa Arduino:

 

comunicação-serial-c-testeArduino
Figura 14 - Envio de comando apra o Arduino

 

O download da aplicação completa pode ser feito através do link: Aplicação C# para interface serial com Arduino.

Lembre-se, você deve ser registrado e estar logado no site para fazer o download.

 

 

Conclusão sobre a Comunicação Serial C# e Arduino

 

A ferramenta Visual Studio da Microsoft permite criar facilmente uma interface de comunicação Serial entre o Arduino e um computador (com sistema operacional Windows). A partir do exemplo apresentado, pode-se fazer aplicações para enviar e receber comandos para o Arduino ou outro dispositivo conectado a uma porta serial. No próximo artigo vamos fazer uma aplicação envolvendo botões e outros componentes que deixarão nossa interface mais elegante.

 

Continue lendo sobre o mesmo assunto no artigo Parte 2 de Comunicação Serial com C# .

 

 

Para aprender mais

 

Arduino - Primeiros Passos

Arduino - O documentário

Placas Arduino - trajetória até o UNO

Arduino UNO

Arduino - Entradas/Saídas digitais

Arduino - Entradas Analógicas

Arduino - Saídas PWM

Arduino - Comunicação Serial

Arduino - ArduBlock

Arduino no Proteus 8.1

Simulador de Arduino: Virtual Breadboard

Arduino Leonardo

Arduino MEGA 2560

Acionamento de uma lâmpada com Arduino

Arduino - Controle de uma lâmpada com LDR

Placa Arduino da Robocore - BlackBoard

Criando suas próprias bibliotecas para Arduino

Arduino UNO - Taxa de amostragem do conversor A/D

Arduino UNO - Sensor de temperatura interno

Medindo o nível de água com Arduino

Comunicação Serial com C# e Arduino - Parte 1

Comunicação Serial com C# e Arduino - Parte 2

Arduino: Expandindo os I/Os - Parte 1

Arduino Esplora

Arduino - Teclado touch capacitivo

Arduino - Interface com acelerômetro e giroscópio

Arduino: RS-232/RS-485 - Hardware

Trinket - Uma pequena poderosa placa compatível com Arduino

Nova Arduino Zero Pro - Disponível no site arduino.org

Embrio: Uma ferramenta de programação visual para Arduino

Comunicação serial com Arduino utilizando Qt5 Console Application

Utilizando microcontroladores para controle de conversores DC-DC personalizados, parte II

Móveis de escritório + IoT - Uma impressora de recibo com NFC e Wifi

LightBlue Bean - Placa compatível com Arduino

BR-Arduino.org: Sua nova fonte de conhecimento sobre Arduino

Shield Arduino YÚN

Arduino Yún

Novo Shield Arduino Wi-Fi com controlador Atmel

Python + Arduino - Comunicação Serial

Arduino vs Raspberry Pi: entenda as diferenças

Papilio - Arduino + FPGA

Intel Galileo Gen 2 - Placa Arduino

Arduino TRE Developer Edition - Lançamento!

Novo Arduino - Arduino Zero lançado

Intel Galileo - Placa Arduino

Arduino TRE

Arduino Due

Comunicação Serial Java + Arduino

UDOO - Arduino, Linux e Android em uma mesma placa

 

 

Referências

 

SerialPort Class

Classe SerialPort

 

Outros artigos da série

Comunicação Serial com C# e Arduino - Parte 2 >>
Este post faz da série Comunicação Serial com C# e Arduino. Leia também os outros posts da série:
Engenheiro com experiência no desenvolvimento de projetos eletrônicos embarcados. Também atuou no ensino técnico de eletrônica e programação. Hoje é responsável pelo operacional do Embarcados, onde trabalha para levar conteúdo de eletrônica, programa de sistemas embarcados e IoT para o Brasil. Entusiastas do movimento maker, DIY e do compartilhamento de conhecimento, publica diversos artigos sobre eletrônica e sistemas Embarcados, além de projetos open hardware. Realiza palestras e workshops onde leva conhecimento para as pessoas de forma presencial.

Deixe um comentário

85 Comentários em "Comunicação Serial com C# e Arduino - Parte 1"

Notificar
avatar
 
Ordenar por:   recentes | antigos | mais votados
Vinícius Brinhol
Membro
Vinícius Brinhol

Olá Fabio, estou com uma duvida...Existe diferença entre Arduino UNO e Leonardo, no que diz respeito a comunicação serial? Pergunto porque, estou utilizando Arduino Leonardo e não consigo fazer a comunicação funcionar.... a porta COM aparece na lista, ao clicar no btConectar o LED RX do Leonardo pisca indicando que o a informação foi recebida, acontece que o Arduino não transmite nada, isto acontece no programa que criei seguindo os passos do artigo e também testei com os arquivos disponibilizados para download.
abs

matheusGG39
Membro
matheusGG39

Olá Fabio , estou com um problema, nenhuma porta COM aparece, mesmo havendo Arduinos conectados, teria como me ajudar?

Suelen Braga
Visitante
Suelen Braga

Olá Fabio, estou com um problema. Meu textBoxReceber não mostra o que vem do Arduino, fica em branco. Fiz o código como mostrado no artigo. Poderia me ajudar?

alzanlorensi
Membro
alzanlorensi

Olá Fabio, estou implementando esse exemplo em um outro script em um projeto meu, mas eu preciso que que os dados da caixa de envio sejam enviados automaticamente, ou seja, eu n quero ficar clicando para enviar o código, quero clicar uma vez e ele fique em um loop, por exemplo eu digite "A" e a caixa envia "AAAAAAAAAAAAAA" ate eu clicar em parar. Como faço isso?

Pedro Junior
Membro
Pedro Junior

Olá,
queria uitilizar outras forms, porem com a mesma comunicacao serial, é possivel?

mario1593
Membro
mario1593

boa tarde, é possível receber dados através da comunicação serial e enviar esses mesmo dados pela comunicação software serial??

Fabu Dias
Visitante
Fabu Dias

Olá, só tenho Mac... e não rola instalar Visual Studio. Tem alguma outra IDE com ambiente parecido, mas no Mac?

Roberto Ferreira Filho
Visitante
Roberto Ferreira Filho

Ola Fabio, estou com uma dificuldade aqui, meu arduino manda uma série variável de prints. A ideia é receber essa informação no programa e baseado no primeiro código dar split e tratar em um switch. Porem as vezes o programa recebe os dados pela metade, no exemplo
Serial.print("130");
Serial.print(",");
Serial.print(hour);
Serial.print(",");
Serial.print(minute);
Serial.print(",11111");

As vezes ele recebe a string toda, eventualmente ele quebra a string em duas. Como eu posso fazer pra isso nao ocorrer?? De preferencia sem alterar o programa do arduino.

Roberto Ferreira Filho
Visitante
Roberto Ferreira Filho

Atualizando minha propria duvida, eu acabei mudando no arduino para println no ultimo print e mudei no programa para o comando readline 😉 resolvido

Guilherme Zucco
Membro
Guilherme Zucco

Oi,

Tem alguma noção de porque quando coloco pra rodar em .Net 2.0 o programa roda mas não lê

desconfiava do lixo que aparece junto do "COM1", até coloquei pra pegar o nome de uma textbox, mas tem alguma coisa com as Threads q n to descobrindo

Obrigado

wpDiscuz