Todas as Discussões Marcadas 'C#' - Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)2024-03-29T09:03:23Zhttps://labdegaragem.com/forum/topic/listForTag?tag=C%23&feed=yes&xn_auth=noEviar uma String e receber pela porta serial do VBtag:labdegaragem.com,2018-04-15:6223006:Topic:6671172018-04-15T21:32:59.967ZMaiquelhttps://labdegaragem.com/profile/Maiquel158
<p>Boa Noite galera estou tentando criar um mini supervisório no qual eu envio uma strig pela porta serial e ele aciona uma saída do meu micro controlador e então se esta saída acionou eu quero dar um feedback no meu supervisório acendendo um LED ou apresentar a palavra ligado, o comando de enviar eu já consegui fazer agora não estou sabendo receber esta informação e tratar no meu caso eu to recebendo de volta do controlador só a letra A</p>
<p>Boa Noite galera estou tentando criar um mini supervisório no qual eu envio uma strig pela porta serial e ele aciona uma saída do meu micro controlador e então se esta saída acionou eu quero dar um feedback no meu supervisório acendendo um LED ou apresentar a palavra ligado, o comando de enviar eu já consegui fazer agora não estou sabendo receber esta informação e tratar no meu caso eu to recebendo de volta do controlador só a letra A</p> Novo sistema para PID com Arduino.tag:labdegaragem.com,2016-05-19:6223006:Topic:5356472016-05-19T19:44:22.672ZAlessandro La Rocca Silveirahttps://labdegaragem.com/profile/AlessandroLaRoccaSilveira
<p>Galera, sempre tive muita dificuldade para usar a interface do processing para PID. Sempre que saia uma nova versão do processing, o sistema parava de funcionar e lá ia eu catar o código, para ajustar uma ou outra classe que teve alguma mudança na nova versão. Sendo assim, depois de quebrar muita cabeça, resolvi desenvolver minha própria interface. Para isso usei o C# da microsoft(infelizmente não portei para MAC). Segue abaixo um vídeo do sistema funcionando. Eu estou disponibilizando o…</p>
<p>Galera, sempre tive muita dificuldade para usar a interface do processing para PID. Sempre que saia uma nova versão do processing, o sistema parava de funcionar e lá ia eu catar o código, para ajustar uma ou outra classe que teve alguma mudança na nova versão. Sendo assim, depois de quebrar muita cabeça, resolvi desenvolver minha própria interface. Para isso usei o C# da microsoft(infelizmente não portei para MAC). Segue abaixo um vídeo do sistema funcionando. Eu estou disponibilizando o código no github e gostaria de contar com a ajuda dessa comunidade para, em conjunto, fazermos um sistema cada vez melhor. Espero que ajude vocês em seus projetos de controle PID.</p>
<p><a href="https://www.facebook.com/l.php?u=https%3A%2F%2Fyoutu.be%2FfjDR-vx0Pf0&h=9AQHJoQtCAQEyq2kAV398CsJhSsLND4mOS9J9x2zcz9T9Yg&enc=AZOQHIVG4UBEkyJPX7Tkin8jTojEFBSPCPRjj__DsJbODz28v-3De-pRZr592gb7Ksj7zzfDnRJHMiOKpVBLVQL0uwstwDwX-g650DFcTOR6rkmKjRyvnem9ZIPlHJc7sxohc65IaAFH9RX1-GWaXgGj4akk4HH1Z5cC4KCyYKCTzA&s=1" target="_blank" rel="nofollow">https://youtu.be/fjDR-vx0Pf0</a></p>
<p>Na descrição do vídeo tem os links para download.</p> SENSOR DE TEMPERATURA > ARDUINO > C# > KINECT HACKtag:labdegaragem.com,2015-01-13:6223006:Topic:4118242015-01-13T18:54:38.386ZLUIZ GUSTAVO GOMES PONTEShttps://labdegaragem.com/profile/LUIZGUSTAVOGOMESPONTES
<pre class="postbody">Pessoal, to com um problema no meu T<a href="https://www.robocore.net/modules.php?name=Forums&file=viewtopic&t=1069" target="_blank">C</a> e queria saber se alguém pode me ajudar... <br></br><br></br><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802477953?profile=original" target="_self"><img class="align-full" src="http://storage.ning.com/topology/rest/1.0/file/get/1802477953?profile=original" width="664"></img> </a><br></br>Como podem ver estou controlando através do kinect os comandos do Arduino. Mas se eu deixar o serial monitor do…</pre>
<pre class="postbody">Pessoal, to com um problema no meu T<a href="https://www.robocore.net/modules.php?name=Forums&file=viewtopic&t=1069" target="_blank">C</a> e queria saber se alguém pode me ajudar... <br/><br/><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802477953?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802477953?profile=original" width="664" class="align-full"/></a><br/>Como podem ver estou controlando através do kinect os comandos do Arduino. Mas se eu deixar o serial monitor do <a href="https://www.robocore.net/modules.php?name=Forums&file=viewtopic&t=3129" target="_blank">Arduino</a> aberto, por algum erro de comunicação, o programa feito em visual studio (c#) nao funciona. Entretanto, este não é exatamente o problema. Estou precisando de alguma ajuda sobre enviar os valores obtidos pelo <a href="https://www.robocore.net/modules.php?name=Forums&file=viewtopic&t=1009" target="_blank">sensor</a> de temperatura para o programa e assim nao depender mais do serial monitor. Até achei um programa que usava o mesmo conceito (<a href="https://www.electronicsblog.net/digital-voltmeter-arduino-">https://www.electronicsblog.net/digital-voltmeter-arduino-</a>…/) mas nao consegui adaptar a minha realidade. OU SEJA, <a href="https://www.robocore.net/modules.php?name=Forums&file=viewtopic&t=1012" target="_blank">NA</a> INTERFACE DO MEU PROGRAMA EU GOSTARIA DE COLOCAR A TEMPERATURA QUE O SENSOR ESTÁ LENDO!</pre> Crie seu próprio programa de comunicação serial em C# - Tutorial 4(Leitura e Gráficos)tag:labdegaragem.com,2014-03-02:6223006:Topic:3326752014-03-02T13:01:42.966ZYure Vieirahttps://labdegaragem.com/profile/YureVieiraSampaioAlbuquerque
<p>Depois de tanto tempo um tutorial sobre leitura, após muita pesquisa e uma força de um membro da comunidade este tutorial saiu.</p>
<p>Queria agradecer ao Marlon Tiedt que sugeriu a forma de leitura que será usada aqui, a forma mais simples e eficiente que encontrei até agora.</p>
<p>No tutorial de hoje além de ler a porta serial, vamos trabalhar com o controle Chart afim de plotar gráficos dos valores que forem chegando.</p>
<p>Hoje serão usados os seguintes…</p>
<p>Depois de tanto tempo um tutorial sobre leitura, após muita pesquisa e uma força de um membro da comunidade este tutorial saiu.</p>
<p>Queria agradecer ao Marlon Tiedt que sugeriu a forma de leitura que será usada aqui, a forma mais simples e eficiente que encontrei até agora.</p>
<p>No tutorial de hoje além de ler a porta serial, vamos trabalhar com o controle Chart afim de plotar gráficos dos valores que forem chegando.</p>
<p>Hoje serão usados os seguintes controles:</p>
<ul>
<li><b>SerialPort</b></li>
<li><b>Chart</b></li>
</ul>
<p>O Chart só foi adicionado a partir do Visual Studio 2010, espero que tenham seguido a dica que dei no primeiro tutorial!</p>
<p>O programa do arduino é o exemplo <strong>Graph, </strong>aumentem o delay para mais de 50, para melhorar a visualização.</p>
<p>Chart pode ser encontrado em <b>dados.</b></p>
<p></p>
<p></p>
<p><b><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802471089?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802471089?profile=original" width="335" class="align-full"/></a></b></p>
<p></p>
<p>Redimensionem para que cubra todo o formulário.</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802472013?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802472013?profile=original" width="499" class="align-full"/></a></p>
<p>Logo após ancorem o chart1 marcando todas as quatro barras na propriedade <b>Anchor</b>.</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802475083?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802475083?profile=original" width="338" class="align-full"/></a></p>
<p>Isso fará com que ele seja redimensionado acompanhando o tamanho do formulário.</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802475217?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802475217?profile=original" width="570" class="align-full"/></a></p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802477806?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802477806?profile=original" width="570" class="align-full"/></a></p>
<p>Retirem a legenda, pois achei desnecessário para este exemplo.</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802480194?profile=original" target="_self"><img width="750" src="http://storage.ning.com/topology/rest/1.0/file/get/1802480194?profile=RESIZE_1024x1024" width="750" class="align-full"/></a></p>
<p>Na rotina de <b>DataReceived</b> é a que usaremos para ler a porta serial. </p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802482890?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802482890?profile=original" width="333" class="align-full"/></a></p>
<p>Nesta rotina temos que ler o buffer e atualizar o gráfico, então a rotina de vê ficar parecida com essa:</p>
<p><span style="color: #0000ff;">private void Porta_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> BeginInvoke(new Action(() =></span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> try</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> int limite = 50;//Número máximo de pontos que o gráfico pode ter.</span></p>
<p><span style="color: #0000ff;"> string dados = Porta.ReadLine();//Pegue o que tem no buffer até um '\n'.</span></p>
<p><span style="color: #0000ff;"> Text = dados;//Mostrar o valor na barra de titulo.</span></p>
<p><span style="color: #0000ff;"> int num = Convert.ToInt16(dados);//Converta a string para int.</span></p>
<p><span style="color: #0000ff;"> chart1.Series[0].Points.AddY(num);//Adiciona o valor lido como um novo Y;</span></p>
<p><span style="color: #0000ff;"> </span></p>
<p><span style="color: #0000ff;"> //Se o gráfico tiver número de pontos maior que o limite...</span></p>
<p><span style="color: #0000ff;"> if (chart1.Series[0].Points.Count > limite)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> chart1.Series[0].Points.RemoveAt(0);//Remova o primeiro ponto.</span></p>
<p><span style="color: #0000ff;"> chart1.Update();//Atualiza o grafico.</span></p>
<p><span style="color: #0000ff;"> </span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> catch { }</span></p>
<p><span style="color: #0000ff;"> }));</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p>O funcionamento é simples, caso chegue algo pela serial (uma string do valor contendo '\n' no final) a rotina adiciona um ponto ao gráfico, com Y equivalente ao valor lido.</p>
<p>O variável limite esta relacionada ao limite de quantos pontos o gráfico mostrará, ao superar este limite o primeiro ponto do gráfico é apagado e este é atualizado.</p>
<p>BeginInvoque(new Action(()=>{//rotina...})); faz essa tarefa “paralelamente” ao fluxo(thread) principal do programa, pois caso fosse feito no principal o usuário perderia o controle sobre sua aplicação causando travamentos.</p>
<p>Apesar de ser orientado a eventos, um evento só pode ser atendido caso o programa esteja disponível para atendê-lo. Imaginem se chegassem dados tão rápido que não houvesse tempo nem mesmo de mover o aplicativo! Por isso fez o uso de outro seguimento que pode executar suas instruções “ao mesmo tempo” do seguimento principal.</p>
<p>Ao final, o resultado será parecido com esse:</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802483021?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802483021?profile=original" width="571" class="align-full"/></a></p>
<p>Mudem o estilo do gráfico para <b>Range</b>, acessando a propriedade <b>Series</b> .</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802483254?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802483254?profile=original" width="571" class="align-full"/></a></p>
<p>O aspecto mudou, parecendo uma função continua:</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802483226?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802483226?profile=original" width="571" class="align-full"/></a></p>
<p>Para mudar a cor do gráfico escolham uma cor em <b>PaletteCustonColors</b>:</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802485783?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802485783?profile=original" width="737" class="align-full"/></a></p>
<p>E depois mudem <b>Palette</b> para <b>none</b></p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802485955?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802485955?profile=original" width="311" class="align-full"/></a></p>
<p>O resultado:</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802489317?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802489317?profile=original" width="571" class="align-full"/></a></p>
<p><span>Assim conseguimos plotar gráficos com dados vindos do arduino, adaptem a suas necessidades. Até a próxima.</span></p>
<p></p>
<p><span>Código completo:</span></p>
<p><a href="http://pastebin.com/cbzt5UJZ">http://pastebin.com/cbzt5UJZ</a></p> Indicação de Projetos (Java, C#, Arduino, LabVIEW, PIC)tag:labdegaragem.com,2014-01-09:6223006:Topic:3194142014-01-09T18:27:12.883ZCamilo de Lellis Barreto Juniorhttps://labdegaragem.com/profile/CamilodeLellisBarretoJunior
<p>Boa tarde pessoal.</p>
<p></p>
<p>Estou em periodo de férias, e não tem quase nada para fazer, está um tédio. rsrsrrs</p>
<p>Gostaria que vocês me indicasse algum projeto em qualquer plataforma, para mim </p>
<p>ir passando o tempo. Quando o projeto for finalizado, posto aqui para vocês baixarem.</p>
<p></p>
<p>Obrigado pela atenção!</p>
<p>Boa tarde pessoal.</p>
<p></p>
<p>Estou em periodo de férias, e não tem quase nada para fazer, está um tédio. rsrsrrs</p>
<p>Gostaria que vocês me indicasse algum projeto em qualquer plataforma, para mim </p>
<p>ir passando o tempo. Quando o projeto for finalizado, posto aqui para vocês baixarem.</p>
<p></p>
<p>Obrigado pela atenção!</p> Conexão bluetooth com o PC em C#tag:labdegaragem.com,2013-10-02:6223006:Topic:2880932013-10-02T03:07:54.775ZJHKhttps://labdegaragem.com/profile/NathielPaulinodeBarros
<ul class="xg_messageList">
<li class="message brief"><p class="_message">alguém sabe como eu posso criar um programa em C# que eu mande textos via bluetooth ?</p>
</li>
<li class="message brief">Exemplo eu quero enviar palavras via bluetooth através de um adaptador ! se alguém puder me ajudar,agradeço !</li>
</ul>
<ul class="xg_messageList">
<li class="message brief"><p class="_message">alguém sabe como eu posso criar um programa em C# que eu mande textos via bluetooth ?</p>
</li>
<li class="message brief">Exemplo eu quero enviar palavras via bluetooth através de um adaptador ! se alguém puder me ajudar,agradeço !</li>
</ul> Crie seu próprio programa de comunicação serial em C# - Tutorial 3(Seleção de porta, Reset via serial)tag:labdegaragem.com,2013-08-16:6223006:Topic:2670912013-08-16T01:37:25.314ZYure Vieirahttps://labdegaragem.com/profile/YureVieiraSampaioAlbuquerque
<p>Até agora sempre definíamos as propriedades como o nome da porta e BaudRate no projeto, para fins de testes funciona muito bem. Porém isso deixa o programa pouco flexível, já que a porta que o arduino usa pode mudar dependendo do PC onde ele tem os drives instalados.</p>
<p>Neste tutorial estarei mostrando como dar o poder de escolha ao usuário de qual porta e baud rate usar, e para aqueles que usam o arduino, a escolha de habilitar ou não o reset via serial.</p>
<p>Vou aproveitar e mostrar…</p>
<p>Até agora sempre definíamos as propriedades como o nome da porta e BaudRate no projeto, para fins de testes funciona muito bem. Porém isso deixa o programa pouco flexível, já que a porta que o arduino usa pode mudar dependendo do PC onde ele tem os drives instalados.</p>
<p>Neste tutorial estarei mostrando como dar o poder de escolha ao usuário de qual porta e baud rate usar, e para aqueles que usam o arduino, a escolha de habilitar ou não o reset via serial.</p>
<p>Vou aproveitar e mostrar também o como salvar essas configurações para que da próxima vez que o programa for executado ele “lembre” delas e as tome como default.</p>
<p><b>Primeiro passo:</b> adicionar novos itens.</p>
<p>Depois de criar um novo projeto, no menu <b><i><u>projeto</u></i></b> escolham a opção <b><i><u>adicionar novo item</u></i></b>.</p>
<p>Adicionem um novo formulário e coloquem o nome de <b><i>“Config_Serial.cs”</i></b>.</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802463883?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802463883?profile=original" width="571" class="align-full"/></a></p>
<p>Depois adicionem um novo <b><i><u>arquivo de configurações</u></i></b> e coloquem o nome de <b><i>“Minhas_Config.settings”</i></b>.</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802464026?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802464026?profile=original" width="571" class="align-full"/></a></p>
<p>Antes trabalhar com esses novos itens adicionem os seguintes controles no formulario1(<b><i>Form1</i></b>).</p>
<ul>
<li><b><i>MenuStrip</i></b></li>
<li><b><i>SerialPort</i></b></li>
</ul>
<p>Alterei o nome de <b><i>serialPort1</i></b> para <b><i>Porta</i></b> fiz algumas modificações no <b><i>menuStrip1</i></b> para que ficasse assim:</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802464159?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802464159?profile=original" width="308" class="align-full"/></a></p>
<p>Apenas troquei a cor atribuindo a propriedade <b><i>BackColor</i></b> a cor <b><i>GradientActiveCaption</i></b> e criei um menu <b><i>conexão</i></b> adicionei as opções <b><i>configurar</i></b> e <b><i>conectar</i></b>.</p>
<p>Dando um duplo click na opção <b><i>configurar</i></b> teremos acesso ao evento dele (Click).</p>
<p>Qual é a ideia? Configurar qual porta e velocidade que vamos usar. Só que eu preferi fazer esse procedimento em outro formulário pra ganhar mais espaço no principal, pra isso adicionamos o formulário <b><i>Config_Serial</i></b> anteriormente.</p>
<p>Bom, precisamos chamar esse novo formulário através do menu então façam o seguinte:</p>
<p><span style="color: #0000ff;">private void configurarToolStripMenuItem_Click(object sender, EventArgs e)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> Config_Serial janela2 = new Config_Serial(this);</span></p>
<p><span style="color: #0000ff;"> janela2.ShowDialog();</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p>Primeiro declaramos uma nova variável do tipo <b><i>Config_serial</i></b>, que corresponde ao nome que demos ao segundo formulário, com o nome <b><i>janela2</i></b> e inicializamos ela passando este formulário (<b><i>Form1</i></b>) como parâmetro usando a palavra <b><i>this</i></b>. Na segunda linha o segundo formulário é exibido.</p>
<p>É importante entender porque passar o Form1 como parâmetro neste caso. O que acontece é que as variáveis de um formulário não podem ser acessadas por outro. Como vamos mudar duas propriedade do objeto <b><i>Porta</i></b> através do segundo formulário, e aquele esta no primeiro, com esse procedimento poderemos mudar campos desse objeto. Também é importante que mudem a propriedade <b><i>Modifiers</i></b> do objeto <b><i>Porta</i></b> para <b><i>public</i></b>.</p>
<p>No evento da opção <b><i>Conectar</i></b> do menu deixem parecido com isso:</p>
<p><span style="color: #0000ff;">private void conectarToolStripMenuItem_Click(object sender, EventArgs e)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> try</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> if (Porta.IsOpen)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> Porta.Close();</span></p>
<p><span style="color: #0000ff;"> conectarToolStripMenuItem.Text = "Conectar";</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> else</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> Porta.Open();</span></p>
<p><span style="color: #0000ff;"> if (reset)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> Porta.DtrEnable = true;</span></p>
<p><span style="color: #0000ff;"> Porta.DtrEnable = false;</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> conectarToolStripMenuItem.Text = "Desconectar";</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> catch(SystemException erro)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> MessageBox.Show(erro.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p>Traduzindo: se estiver conectado, desconecta e muda o texto do menu para “Conectar”.</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802464353?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802464353?profile=original" width="302" class="align-full"/></a></p>
<p>Senão, conecta e muda o texto para “Desconectar”.</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802464388?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802464388?profile=original" width="302" class="align-full"/></a></p>
<p>Se ocorrer algum erro mostra a descrição dele, que esta na variável <b><i>erro.Message</i></b> num formulário com titulo “Erro”, que tem um botão de <i>ok</i> e um ícone de <i>Error</i>.</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802464399?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802464399?profile=original" width="270" class="align-full"/></a></p>
<p>Assim podemos iniciar e encerrar a comunicação quando quisermos.</p>
<p>Abro um parêntese para falar do seguinte trecho:</p>
<p><span style="color: #0000ff;"> if (reset)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> Porta.DtrEnable = true;</span></p>
<p><span style="color: #0000ff;"> Porta.DtrEnable = false;</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p>Aqueles que usam o arduino, devem ter notado que o <i>Serial Monitor</i> é capaz de resetar o arduino assim que é aberto.</p>
<p>Esse trecho de código faz o mesmo, se a variável reset for verdadeira, reseta o arduino ao conectar.</p>
<p>Declarem essa variável com antecedência:</p>
<p><span style="color: #0000ff;">public bool reset = false;</span></p>
<p><b><i>public</i></b> porque vamos acessa-la também no segundo formulário.</p>
<p><b><i>2º passo:</i></b> segundo formulário.</p>
<p>Agora que terminamos o formulário principal, vamos trabalhar o segundo que é onde faremos as configurações da porta.</p>
<p>Adicionem os seguintes controles:</p>
<ul>
<li>1 x GroupBox</li>
<li>2 x Label:</li>
<li>2 x ComboBox</li>
<li>1 x Checkbox</li>
<li>1 x Timer</li>
</ul>
<p>Redimensionem e mudem os <b><i>text</i></b> para que fique dessa forma:</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802464610?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802464610?profile=original" width="205" class="align-full"/></a></p>
<ul>
<li>Mudem a propriedade <b><i>FormBorderStyle</i></b> para <b><i>FixedToolWindow</i></b> para impedir redimensionamento em tempo de execução, e retirar os botões de maximizar e minimizar.</li>
<li>Mudem também para <b><i>DropDownList</i></b> da propriedade <b><i>DropDownStyle</i></b> dos dois <b><i>comboBox’s</i></b></li>
<li>No timer1 deixem um intervalo de 1000 ms e deixem a propriedade <b><i>enabled</i></b> em <b><i>true</i></b>.</li>
</ul>
<p>Esse timer vai servir para atualizar a lista de portas que o PC tem disponível.</p>
<p>No comboBox correspondente ao baud rate, no meu caso o <b><i>comboBox</i></b><b><i>2</i></b>, coloquei as velocidades padrão do <i>Serial Monitor</i> na propriedade <b><i>items</i></b>.</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802464617?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802464617?profile=original" width="571" class="align-full"/></a></p>
<p>Vejam o resultado:</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802464853?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802464853?profile=original" width="316" class="align-full"/></a></p>
<p>Como nós não sabemos de inicio quantas e qual porta o arduino esta conectado devemos usar uma função que pelo menos nos retorne os nomes das portas existentes. Essa função é usada nesse trecho:</p>
<p><span style="color: #0000ff;">void busca_de_portas(bool x)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> int num = portas.Length;</span></p>
<p><span style="color: #0000ff;"> portas = SerialPort.GetPortNames();</span></p>
<p><span style="color: #0000ff;"> if (num != portas.Length || x)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> comboBox1.Items.Clear();</span></p>
<p><span style="color: #0000ff;"> for (int i = 0; i < portas.Length; i++)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> comboBox1.Items.Add(portas[i]);</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p>O segredo esta nesta função: <b><i>SerialPort.GetPortNames()</i></b>. Ela retorna um array do tipo string contendo os nomes das portas existentes. Tendo posse dos nomes, basta preencher o comboBox1 com eles, e é isso que a rotina <b><i>busca_de_portas</i></b> fará. Mas fará somente se o número de portas variar. O campo <b><i>Length</i></b> quer dizer o tamanho de um determinado array.</p>
<p>Não esquecer de declarar <b><i>portas</i></b> antes de usar:</p>
<p><span style="color: #0000ff;">string[] portas = {""};</span></p>
<p>Para poder usar <b><i>SerialPort.GetPortNames()</i></b> é necessário incluir uma classe fazendo .</p>
<p>using System.IO.Ports;</p>
<p>Ok, agora no evento de <b><i>Load</i></b> do formulário e no <b><i>Tick</i></b> do timer1 é só chamar a rotina acima:</p>
<p><span style="color: #0000ff;">private void Config_Serial_Load(object sender, EventArgs e)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> busca_de_portas(true);</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> </span></p>
<p><span style="color: #0000ff;">private void timer1_Tick(object sender, EventArgs e)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> busca_de_portas(false);</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p>Assim será feita uma pesquisa pelos nomes ao carregar e também num intervalo de 1000 ms.</p>
<p>Ao carregar é importante passar o <b><i>true</i></b> porque mesmo no caso de o número de portas ser 1(numero inicial de elementos do array <b><i>portas</i></b>)ele possa atualizar o comboBox1.</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802464775?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802464775?profile=original" width="326" class="align-full"/></a></p>
<p>No meu caso só existe a porta que o arduino está, mas quem tiver mais de uma, pode acontecer de os nomes ficarem fora de ordem. Pra corrigir isso basta mudar a propriedade <b><i>Sorted</i></b> do <b><i>comboBox1</i></b> para <b><i>true</i></b>.</p>
<p>No evento <b><i>checkBox1_CheckedChanged</i></b> façam o mesmo que o exemplo abaixo:</p>
<p><span style="color: #0000ff;">private void checkBox1_CheckedChanged(object sender, EventArgs e)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> if(checkBox1.Checked)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> reset2 = true;</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> else</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> reset2 = false;</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p>Declarem antes a variável <b><i>bool reset2 = false;</i></b> que será responsável por habilitar o reset do arduino ao conectar.</p>
<p>Ok, o usuário escolheu, qual porta, qual velocidade, e até se deseja resetar o arduino. Agora resta passar essa informações pro Form1 já que é nele que está o objeto <b><i>Porta</i></b>. Arbitrei que iria passar esses dados quando fechasse as configurações.</p>
<p>Lembrem se que passamos o Form1 como parâmetro quando fizemos:</p>
<p>Config_Serial janela2 = new Config_Serial(this); </p>
<p>Para usar esse parâmetro faremos o seguinte:</p>
<p><span style="color: #0000ff;">Form1 janela1;</span></p>
<p><span style="color: #0000ff;">public Config_Serial(Form1 x)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> InitializeComponent();</span></p>
<p><span style="color: #0000ff;"> janela1 = x;</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;">Logo que</span> clicamos em algum controle para ter acesso a algum evento esse método já é automaticamente gerada para nós logo no começo do código. Ele originalmente vem sem parâmetros. O que fizemos aqui foi declarar um objeto do tipo <b><i>Form1</i></b> com nome <b><i>janela1</i></b> e recebeu o valor <b><i>x</i></b> passado pelo formulário anterior.</p>
<p>Agora podemos passar as informações para o formulário anterior fazendo:</p>
<p><span style="color: #0000ff;">private void Config_Serial_FormClosing(object sender, FormClosingEventArgs e)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> try</span></p>
<p><span style="color: #0000ff;"> { </span></p>
<p><span style="color: #0000ff;"> janela1.Porta.BaudRate = Convert.ToInt32(comboBox2.Text);</span></p>
<p><span style="color: #0000ff;"> janela1.Porta.PortName = comboBox1.Text;</span></p>
<p><span style="color: #0000ff;"> janela1.Text = comboBox1.Text + "/" + comboBox2.Text;</span></p>
<p><span style="color: #0000ff;"> janela1.reset = reset2; </span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> catch</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> DialogResult escolha;</span></p>
<p><span style="color: #0000ff;"> escolha = MessageBox.Show("Prencha todos os campos ", "Aviso", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);</span></p>
<p><span style="color: #0000ff;"> if (escolha == System.Windows.Forms.DialogResult.OK)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> e.Cancel = true;</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p>O código acima tenta passar os dados para o formulário anterior, caso não consiga ele mostra uma mensagem que diz: <i>"Prencha todos os campos corretamente"</i>, e dá duas opções ao usuário:</p>
<ul>
<li>Ok: significa que o evento será cancelado(<b><i>e.cancel</i></b>) para correção das informações</li>
<li>Cancel: segue com o evento, fechando o formulário.</li>
</ul>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802465066?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802465066?profile=original" width="525" class="align-full"/></a></p>
<p><b><i>Passo 3:</i></b> Configurar definições.</p>
<p>Ufa! Conseguimos, por aqui termina para quem se deu por satisfeito com o resultado.</p>
<p>Porém é um pouco chato sempre ter que ir no menu e escolher de novo os parâmetros para configurar a conexão serial, seria interessante que o programa guardasse essas informações mesmo depois de fechado.</p>
<p>Pra isso mesmo que adicionamos no começo do projeto um <b><i>arquivo de configurações</i></b> com o nome de <b><i>minhas_config.settings</i></b>. Ele vai guardar dados que serão usados na próxima vez que o programa for executado.</p>
<p>Ele deve ter essa cara:</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802465096?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802465096?profile=original" width="571" class="align-full"/></a></p>
<p>Aqui já defini alguns valores que eu desejo guardar.</p>
<p>A ideia é atualizar e salvar esses valores quando fecharmos o programa, logo devemos usar o evento <b><i>FormClosing</i></b> do <b><i>Form1</i></b></p>
<p><span style="color: #0000ff;">private void Form1_FormClosing(object sender, FormClosingEventArgs e)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> try</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> Minhas_Config.Default.Nome_Porta = Porta.PortName;</span></p>
<p><span style="color: #0000ff;"> Minhas_Config.Default.Baud_Rate = Porta.BaudRate;</span></p>
<p><span style="color: #0000ff;"> Minhas_Config.Default.restart_arduino = reset;</span></p>
<p><span style="color: #0000ff;"> Minhas_Config.Default.Save();</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> catch</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> MessageBox.Show("Erro ao salvar!Reconfigure quando executar novamente","Erro");</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p>E quando abrirmos novamente o programa, carregar os valores guardados:</p>
<p><span style="color: #0000ff;">private void Form1_Load(object sender, EventArgs e)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> try</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> Porta.PortName = Minhas_Config.Default.Nome_Porta;</span></p>
<p><span style="color: #0000ff;"> Porta.BaudRate = Minhas_Config.Default.Baud_Rate;</span></p>
<p><span style="color: #0000ff;"> reset = Minhas_Config.Default.restart_arduino;</span></p>
<p><span style="color: #0000ff;"> Text = Porta.PortName + "/" + Convert.ToString(Porta.BaudRate);</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> catch</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> MessageBox.Show("Erro ao carregar! Reconfigure", "Erro");</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p>Pronto, com isso termino mais um tutorial, adaptem a suas necessidades. Até a próxima.</p>
<p>Código Form1:</p>
<p><a href="http://pastebin.com/vbdaNXy6">http://pastebin.com/vbdaNXy6</a></p>
<p>Código Config_Serial:</p>
<p><a href="http://pastebin.com/EwJnfck3">http://pastebin.com/EwJnfck3</a></p> Crie seu próprio programa de comunicação serial em C# - Tutorial 1tag:labdegaragem.com,2013-08-05:6223006:Topic:2629432013-08-05T15:44:32.552ZYure Vieirahttps://labdegaragem.com/profile/YureVieiraSampaioAlbuquerque
<p>É um anseio entre os iniciantes na área de programação em C, a criação de programas que tenham uma interface amigável, com botões, menus entre outros componentes do windows. Aqueles que ja usam o arduino ou outros microcontroladores já devem ter sentido falta de um aplicativo com essas características e que se comunicasse com o o microcontrolador via serial.</p>
<p>Nesse tutorial, como é o primeiro e em um nível bem básico, será mostrado passo a passo como criar uma GUI que será capaz de…</p>
<p>É um anseio entre os iniciantes na área de programação em C, a criação de programas que tenham uma interface amigável, com botões, menus entre outros componentes do windows. Aqueles que ja usam o arduino ou outros microcontroladores já devem ter sentido falta de um aplicativo com essas características e que se comunicasse com o o microcontrolador via serial.</p>
<p>Nesse tutorial, como é o primeiro e em um nível bem básico, será mostrado passo a passo como criar uma GUI que será capaz de enviar dados para o arduino, afim de comandar um LED(ligar e desligar), e um servomotor.</p>
<p>O aplicativo será feito no ambiente do Visual Studio, na linguagem C#.É recomendável o Visual C# no minimo 2010, pois contem um componente novo, que é um tanto interessante para quem deseja plotar de gráficos, o Chart.</p>
<p>Nesse e nos próximos tutoriais,não será exigido grande conhecimento da linguagem C#, basta que se tenha um pouco de conhecimento em C++, e caso, seja necessário o uso de alguma estrutura exclusiva do C#, será feita uma breve explicação.</p>
<p><b>1º PASSO:</b> Criar um novo projeto em linguagem C#</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802463933?profile=original" target="_self"><img width="750" src="http://storage.ning.com/topology/rest/1.0/file/get/1802463933?profile=RESIZE_1024x1024" width="591" class="align-full" height="360"/></a></p>
<p>Após criar um novo projeto,deverão aparecer 3 elementos muito importantes da IDE:</p>
<p>A aba <b>Design </b>onde podemos editar a aparência do programa (formulário).</p>
<p>A <b>caixa de ferramentas</b> <b>(ou Toolbox) </b>que contem os elementos que farão parte do nosso programa.Ex:Botões, barras de rolagem, menus, etc.</p>
<p>A aba de <b>propriedades (ou properties) </b>onde podemos predefinir alguns comportamentos que os elementos (controles) terão.Ex:O texto que o formulário exibe, se um botão apresenta alguma imagem, etc.</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802467659?profile=original" target="_self"><img width="750" src="http://storage.ning.com/topology/rest/1.0/file/get/1802467659?profile=RESIZE_1024x1024" width="610" class="align-full" height="329"/></a></p>
<p><b>2º PASSO:</b> Design.</p>
<p>Iremos usar os seguintes componentes:</p>
<ul>
<li><b><i>button</i></b></li>
<li><b><i>hScrollBar</i></b></li>
<li><b><i>SerialPort</i></b></li>
</ul>
<p>Após achar cada um na caixa de ferramentas, arrastem-os e soltem no formulário. Redimensionem-os de modo que fique parecido com a figura abaixo.</p>
<p>Naturalmente, para cada controle adicionado é atribuido a ele um nome que corresponde a classe a que pertencem e a um numero.Ex: <b><i>button1, button2,hScrollBar1</i></b>,etc.</p>
<p>Neste tutorial, mudei somente o nome do objeto <b><i>SerialPort1</i></b> para <b><i>Porta</i></b>, na aba de propriedades.</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802470517?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802470517?profile=original" width="300" class="align-full"/></a></p>
<p>Mudem também outras propriedades selecionando cada controle no formulário :</p>
<p><b><i>Porta</i></b><b>:</b></p>
<ul>
<li><b>PortName - "COMX"(X = Nº da porta em que o microcontrolador estará conectado)</b></li>
<li><b>BaudRate - baud rate que está configurado no seu microcontrolador</b></li>
</ul>
<p><b> </b></p>
<p><b><i>button1</i></b><b>:</b></p>
<ul>
<li><b>Text - Off</b></li>
</ul>
<p><b> </b></p>
<p><b><i>hScrollBar1</i></b><b>:</b></p>
<ul>
<li><b>Maximum - 189 (180 +LargeChange-1)</b></li>
</ul>
<p><b> </b></p>
<p><b><i>Form1</i></b><b>(formulário):</b></p>
<ul>
<li><b>FormBorderStyle - FixedSingle (não permite redimencionamento do formulario)</b><br/> <b>MaximizeBox - false (desabilita botão de maximizar)</b></li>
</ul>
<p><b><br/></b> Alguns objetos tem propriedades em comum, por exemplo experimente trocar a forma que o cursor é mostrado quando esta sobre o <b><i>button1</i></b> e o <b><i>hScrollBar1</i></b>, selecione os dois ao mesmo tempo e mude a propriedade C<b>ursor</b> para <b>hand.</b></p>
<p>Após isso apertem <i>F5</i> para rodar o programa.Ele deve estar com essa cara.</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802471808?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802471808?profile=original" width="300" class="align-full"/></a></p>
<p><b>3º PASSO: </b>Programação.</p>
<p>A programação para GUI geralmente é orientada a eventos o que significa que o controle de fluxo é guiado por indicações externas.Ex:Clique do mouse, tecla digitada, um novo dado no buffer serial,etc.</p>
<p>O evento principal de cada controle, é acessado quando se da um duplo clique no elemento.Porém existem vários outros eventos que podem ser vinculados a cada controle, por exemplo nesse projeto usaremos dois eventos do formulário que são: <i>load()</i> e o<i> </i>FormClosing().</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802471828?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802471828?profile=original" width="305" class="align-full"/></a></p>
<p>Nesse projeto serão usadas apenas três funções do objeto <b><i>Porta</i></b><i>:</i></p>
<ul>
<li><b><i>Open();</i></b></li>
<li><b><i>Write();</i></b></li>
<li><b><i>Close();</i></b></li>
</ul>
<p><b><i><br/></i></b> O <b><i>Porta.Open() </i></b>foi colocado dentro do evento de <i>load()</i> do formulário, o que significa que será estabelecida conexão serial a partir do momento que o programa for carregado.</p>
<p>O <b><i>Porta.Close() </i></b>foi colocado dentro do evento <i>FormClosing(),</i> para que seja encerrada a conexão com a porta serial assim que o programa for fechado.</p>
<p>O <b><i>Porta.Write()</i></b><i> <b> </b></i>será usado no botão e na barra de rolagem, para enviar pro microcontrolador a informação que queremos.</p>
<p>Ao dar um duplo clique no formulário deverá aparecer uma nova aba contendo alguns códigos, e o evento de <i>Load</i>.</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802471935?profile=original" target="_self"><img width="750" src="http://storage.ning.com/topology/rest/1.0/file/get/1802471935?profile=RESIZE_1024x1024" width="750" class="align-full"/></a></p>
<p>No <i>Load</i> deve ficar assim:</p>
<p><b>private void Form1_Load(object sender, EventArgs e)</b><br/> <b>{</b><br/> <b> try</b><br/> <b> {</b><br/> <b> Porta.Open();</b><br/> <b> }</b><br/> <b> catch</b><br/> <b> {</b><br/> <b> MessageBox.Show("Cabo desconectado","Erro");</b><br/> <b> Close();</b><br/> <b> }</b><br/> <b>}</b></p>
<p>O <b> try</b> e <b>catch</b> são usados para tratar exceções(erros), que irão aparecer se o programa for executado sem que a porta exista, no caso do arduino a porta só existirá se o cabo estiver conectado.</p>
<p>Funciona da seguinte forma,"tente executar o que estiver dentro do <i>try</i>, caso ocorra a exceção faça o que estiver no <i>catch".</i>Nesse programa, caso não consiga abrir comunicação com a serial, exiba uma mensagem ( MessageBox.Show("Cabo desconectado","Erro") ) e feche o programa usando o método <i>Close()</i>.(Não confundir com <b><i>Porta.Close()</i></b>).</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1802472034?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1802472034?profile=original" width="172" class="align-full"/></a></p>
<p>Indo no evento de <i>FormClosing()</i> devemos encerrar a comunicação:</p>
<p><b>private void Form1_FormClosing(object sender, FormClosingEventArgs e)</b><br/> <b>{</b><br/> <b> try</b><br/> <b> {</b><br/> <b> if (Porta.IsOpen)</b><br/> <b> {</b><br/> <b> Porta.Close();</b><br/> <b> }</b><br/> <b> }</b><br/> <b> catch</b> <br/> <b> { }</b><br/> <b>}</b></p>
<p>A estrutura <b> try</b> e <b>catch</b> se faz presente novamente,sempre que houver risco de desconexão do cabo de comunicação ela deve ser usada, sob pena de ver seu programa travar.</p>
<p>Nesse evento uma condição simples, caso a porta esteja "aberta", feche-a.</p>
<p>Dando um duplo clique no botão abrirá o evento de <i>click.</i></p>
<p><b>private void button1_Click(object sender, EventArgs e)</b><br/> <b>{</b> <br/> <b> try</b><br/> <b> {</b><br/> <b> if (button1.Text == "Off")</b><br/> <b> {</b><br/> <b> Porta.Write(comando, 1, 1);</b><br/> <b> button1.Text = "On";</b><br/> <b> }</b><br/> <b> else</b><br/> <b> {</b><br/> <b> Porta.Write(comando, 2, 1);</b><br/> <b> button1.Text = "Off";</b></p>
<p><b> }</b></p>
<p><b> }</b><br/> <b> catch</b> <br/> <b> {</b><br/> <b> MessageBox.Show("Cabo desconectado", "Erro");</b><br/> <b> Close();</b><br/> <b> }</b><br/> <b>}</b></p>
<p>Antes de falar deste código, um array do tipo byte deve ser declarado pois a função <b><i>Porta.Write()</i> </b>exige um array de bytes ou chars, então façam a declaração da seguinte forma:</p>
<p><b>byte[] comando = { 0, 200, 201 }; </b>antes de<b> public Form1()</b></p>
<p>O primeiro elemento iremos usar para comandar o angulo do servo, de 0 a 180.</p>
<p>Como o byte chega até 255, temos um intervalo entre 181 e 255 livre para arbitrarmos um byte para acender e outro para apagar o led. No caso arbitrei 200 para acender e 201 para apagar;</p>
<p>Neste evento iremos acender ou apagar o led," Se o botão estiver como titulo Off mande pela serial o <b>200</b>" pois é o elemento <b>1</b>do array <b>comando</b>. o terceiro parâmetro da <b>Porta.Write(comando, 1, 1) </b>se refere a quantos bytes serão enviados, no caso só um o <b>200</b>.Com isso o led deverá acender.</p>
<p>Depois de enviar reescreva o Texto do botão para "On";</p>
<p>Quando o usuário clicar de novo será enviado um byte equivalente a 201 desligando o led e reescrevendo o texto do botão para "Off".</p>
<p>No evento S<i>croll</i> da barra de rolagem<i> </i>ocorre o seguinte:</p>
<p><b>private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)</b><br/> <b>{</b><br/> <b> try</b><br/> <b> {</b><br/> <b> comando[0] = (byte)hScrollBar1.Value;</b><br/> <b> Porta.Write(comando, 0, 1);</b><br/> <b> Text = Convert.ToString(hScrollBar1.Value);</b><br/> <b> }</b><br/> <b> catch</b><br/> <b> {</b><br/> <b> MessageBox.Show("Cabo desconectado", "Erro");</b><br/> <b> Close();</b><br/> <b> }</b><br/> <b>}</b></p>
<p>A linha <b>comando[0] = (byte)hScrollBar1.Value</b> atribui ao primeiro elemento do array o valor atual da barra de rolagem.Logo em seguida o valor é transmitido para o microcontrolador que controla o servomotor.</p>
<p>Depois esse valor é convertido para string e passado para o titulo do formulário para poder ser visualizado pelo usuário. </p>
<p><b>O programa do arduino é este:</b></p>
<p><span style="color: #008080;">#include <Servo.h></span></p>
<p><span style="color: #008080;">Servo servo1;</span></p>
<p><span style="color: #008080;">void setup(){</span></p>
<p><span style="color: #008080;"> Serial.begin(9600);</span></p>
<p><span style="color: #008080;"> pinMode(13,OUTPUT);</span></p>
<p><span style="color: #008080;"> servo1.attach(9);</span></p>
<p><span style="color: #008080;">}</span></p>
<p><span style="color: #008080;">void loop(){</span></p>
<p><span style="color: #008080;"> if(Serial.available()){</span></p>
<p><span style="color: #008080;"> byte dado = Serial.read();</span></p>
<p><span style="color: #008080;"> </span></p>
<p><span style="color: #008080;"> if(dado <= 180)</span></p>
<p><span style="color: #008080;"> servo1.write(dado);</span></p>
<p><span style="color: #008080;"> </span></p>
<p><span style="color: #008080;"> if(dado == 200)</span></p>
<p><span style="color: #008080;"> digitalWrite(13, HIGH);</span></p>
<p><span style="color: #008080;"> </span></p>
<p><span style="color: #008080;"> if(dado == 201)</span></p>
<p><span style="color: #008080;"> digitalWrite(13, LOW);</span></p>
<p><span style="color: #008080;"> }</span></p>
<p><span style="color: #008080;">}</span></p>
<p><b>E o do aplicativo deve ficar assim:</b></p>
<p><span style="color: #0000ff;">using System;</span></p>
<p><span style="color: #0000ff;">using System.Collections.Generic;</span></p>
<p><span style="color: #0000ff;">using System.ComponentModel;</span></p>
<p><span style="color: #0000ff;">using System.Data;</span></p>
<p><span style="color: #0000ff;">using System.Drawing;</span></p>
<p><span style="color: #0000ff;">using System.Linq;</span></p>
<p><span style="color: #0000ff;">using System.Text;</span></p>
<p><span style="color: #0000ff;">using System.Threading.Tasks;</span></p>
<p><span style="color: #0000ff;">using System.Windows.Forms;</span></p>
<p><span style="color: #0000ff;"> </span></p>
<p><span style="color: #0000ff;">namespace Exemplo1</span></p>
<p><span style="color: #0000ff;">{</span></p>
<p><span style="color: #0000ff;"> public partial class Form1 : Form</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> byte[] comando = { 0, 200, 201 };</span></p>
<p><span style="color: #0000ff;"> </span></p>
<p><span style="color: #0000ff;"> public Form1()</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> InitializeComponent();</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> </span></p>
<p><span style="color: #0000ff;"> private void Form1_Load(object sender, EventArgs e)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> try</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> Porta.Open();</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> catch</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> MessageBox.Show("Cabo desconectado","Erro");</span></p>
<p><span style="color: #0000ff;"> Close();</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> </span></p>
<p><span style="color: #0000ff;"> private void Form1_FormClosing(object sender, FormClosingEventArgs e)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> try</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> if (Porta.IsOpen)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> Porta.Close();</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> catch</span></p>
<p><span style="color: #0000ff;"> { }</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> </span></p>
<p><span style="color: #0000ff;"> private void button1_Click(object sender, EventArgs e)</span></p>
<p><span style="color: #0000ff;"> { </span></p>
<p><span style="color: #0000ff;"> try</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> if (button1.Text == "Off")</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> Porta.Write(comando, 1, 1);</span></p>
<p><span style="color: #0000ff;"> button1.Text = "On";</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> else</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> Porta.Write(comando, 2, 1);</span></p>
<p><span style="color: #0000ff;"> button1.Text = "Off";</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> catch</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> MessageBox.Show("Cabo desconectado", "Erro");</span></p>
<p><span style="color: #0000ff;"> Close();</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> </span></p>
<p><span style="color: #0000ff;"> private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> try</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> comando[0] = (byte)hScrollBar1.Value;</span></p>
<p><span style="color: #0000ff;"> Porta.Write(comando, 0, 1);</span></p>
<p><span style="color: #0000ff;"> Text = Convert.ToString(hScrollBar1.Value); </span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> catch</span></p>
<p><span style="color: #0000ff;"> {</span></p>
<p><span style="color: #0000ff;"> MessageBox.Show("Cabo desconectado", "Erro");</span></p>
<p><span style="color: #0000ff;"> Close();</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;"> }</span></p>
<p><span style="color: #0000ff;">}</span></p>
<p>Com isso concluímos o nosso aplicativo, adaptem a suas necessidades.Até a próxima.</p>
<p> </p>