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

serial
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.

 

Para aprender mais

 

Arduino - Primeiros Passos

Arduino UNO

Arduino - Entradas Analógicas

 

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:
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Fábio Souza
Engenheiro com experiência no desenvolvimento de projetos eletrônicos embarcados. Hoje é diretor de operações do portal Embarcados, onde trabalha para levar conteúdos de eletrônica, sistemas embarcados e IoT para o Brasil. Também atua no ensino eletrônica e programação pelo Brasil. É entusiastas do movimento maker, da cultura DIY e do compartilhamento de conhecimento, publica diversos artigos sobre eletrônica e projetos open hardware, como o projeto Franzininho Participou da residência hacker 2018 no Redbull Basement. Quando não está ministrando palestras, cursos ou workshops, dedica seu tempo “escovando bits” ou projetando placas eletrônicas.

92
Deixe um comentário

avatar
 
41 Comment threads
51 Thread replies
2 Followers
 
Most reacted comment
Hottest comment thread
38 Comment authors
Guilherme VascoFábio SouzaBruno OliveiraLaraFabu Dias Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Bruno Oliveira
Membro
Bruno Oliveira

Muito Bom,

Obrigado pelas dicas, tive que fazer algumas alterações mas tudo 100% agora.

Lara
Visitante
Lara

Olá, a função private void AtualizaListaCOMs() não está sendo chamada no meu código. Coloquei uma MessageBox para teste e ela não aparece. Como posso fazer para o código chamar as funções?

Vinícius Brinhol
Visitante
Vinicius 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

Matheus Garcia
Visitante
Matheus Garcia

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

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Olá Matheus, Você verificou se a porta COM é exibida no gerenciador de dispositivos? Se sim, verifique se a função de atualização das portas está sendo chamada.

Vai e falando o que consegue.

Abraços,

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?

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Olá Suelen, Verifique se o Arduino realmente está enviando a informação correta. Você pode fazer a depuração ou exibir a mensagem em outro formato.

Qualquer coisa me fala aqui.

samuel
Visitante
samuel

Mesmo problema, cheguei a copiar e colar todo o código, garantindo que todos os nomes dos objetos permanecessem os mesmos, integrando ainda o timer e o serialport, com as devidas alterações no timer. Consigo enviar, mas não consigo receber nada. Até pisca o led do arduino quando ele recebe, mas quando ele envia não vem nada na caixa. Tem certeza que é só incluir a função serialport1_datareceived e a tratadadorecebido? Não tem que mudar nada quanto ao evento em algum lugar?
Consegui até já implementar uma modificação de alteração de baudrate, mas receber dado que é bom eu não estou conseguindo.

Alzanlorensi
Visitante
André Zanlorensi

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?

Bruno Oliveira
Membro
Bruno Oliveira

Opa,

Esta entrando em loop, tive esse problema e resolvi criando uma variavel de controle e fazendo a seguinte condição

private void textBoxReceber_TextChanged(object sender, EventArgs e)
{

if (LerSerial != RxString)
{
LerSerial = RxString;
textBoxReceber.AppendText(RxString);

Guilherme Vasco
Visitante
GUILHERME RODRIGUES VASCO

Olá, adicionei essa condição e ainda fica em branco textBoxReceber...

Pedro Junior
Visitante
Pedro Bruhmuller Junior

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

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Olá Pedro, é possível sim. Você pode criar outros forms para sua aplicação e mater a comunicação serial. Abraços

Pedro Junior
Visitante
Pedro Bruhmuller Junior

ok, é que porque ao abrir uma nova form, a comunicação não está se mantendo.

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

A comunicação cai? Qual o efeito?

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Olá Fabu, você pode fazer um aplicação em Python, QT ou até mesmo java. Abraços

Mário Oliveira
Visitante
mario

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

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Olá Mario, você pode usar a comunicação softserial, porém terá que ter um conversor externo para comunicação com o computador. Abraços

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?