supervisorio c#.pdf

Upload: eder-borba

Post on 18-Oct-2015

407 views

Category:

Documents


3 download

TRANSCRIPT

  • 5/28/2018 Supervisorio c#.pdf

    1/31

    um anseio entre os iniciantes na rea de programao em C, a criao de programasque tenham uma interface amigvel, com botes, menus entre outros componentes dowindows. Aqueles que ja usam o arduino ou outros microcontroladores j deve tersentido falta de um aplicativo com essas caractersticas e que se comunicasse com o PCvia serial.

    Nesse tutorial, como o primeiro e em um nvel bem bsico, ser mostrado passo apasso como criar uma GUI que ser capaz de enviar dados para o arduino, afim decomandar um LED(ligar e desligar), e um servomotor.

    O aplicativo ser feito no ambiente do Visual Studio, na linguagem C#. recomendvelo Visual C# no minimo 2010, pois contem um componente novo, que um tantointeressante para quem deseja plotar de grficos, o Chart.

    Nesse e nos prximos tutoriais,no ser exigido grande conhecimento da linguagem C#,basta que se tenha um pouco de conhecimento em C++, e caso, seja necessrio o uso de

    alguma estrutura exclusiva do C#, ser feita uma breve explicao.

    1 PASSO:Criar um novo projeto em linguagem C#

    Aps criar um novo projeto,devero aparecer 3 elementos muito importantes da IDE:

    A aba Design onde podemos editar a aparncia do programa (formulrio).

    A caixa de ferramentas(ou Toolbox) que contem os elementos que faro parte donosso programa.Ex:Botes, caixas de rolagem, menus, etc.

  • 5/28/2018 Supervisorio c#.pdf

    2/31

    A aba de propriedades (ou properties) onde podemos predefinir algunscomportamentos que os elementos (controles) tero.Ex:O texto que o formulrio exibe,se um boto apresenta alguma imagem, etc.

    2 PASSO:Design.

    Iremos usar osa seguintes componentes:

    button hScrollBar SerialPort

    Aps achar cada um na caixa de ferramentas, arrastem-os e soltem no formulrio.Redimensionem-os de modo que fique parecido com a figura abaixo.

    Naturalmente, para cada controle adicionado atribuido a ele um nome que correspondea classe a que pertencem e a um numero.Ex:button1, button2,hScrollBar1,etc.

    Neste tutorial, mudei somente o nome do objeto SerialPort1paraPorta, na aba depropriedades.

  • 5/28/2018 Supervisorio c#.pdf

    3/31

    Mudem tambm outras propriedades selecionando cada controle no formulrio :

    Porta:

    PortName - "COMX"(X = N da porta em que o microcontrolador estarconectado)

    BaudRate - baud rate que est configurado no seu microcontrolador

    button1:

    Text - Off

    hScrollBar1:

    Maximum - 189 (180 +LargeChange-1)

    Form1(formulrio):

    FormBorderStyle - FixedSingle (no permite redimencionamento doformulario)

    MaximizeBox - false (desabilita boto de maximizar)

    Alguns objetos tem propriedades em comum, por exemplo experimente trocar a formaque o cursor mostrado quando esta sobre obutton1 e ohScrollBar1, selecione osdois ao mesmo tempo e mude a propriedade Cursorpara hand.

    Aps isso apertem F5para rodar o programa.Ele deve estar com essa cara.

    3 PASSO: Programao.

  • 5/28/2018 Supervisorio c#.pdf

    4/31

    A programao para GUI geralmente orientada a eventos o que significa que ocontrole de fluxo guiado por indicaes externas.Ex:Clique do mouse, tecla digitada,um novo dado no buffer serial,etc.

    O evento principal de cada controle, acessado quando se da um duplo clique no

    elemento.Porm existem vrios outros eventos que podem ser vinculados a cadacontrole, por exemplo nesse projeto usaremos dois eventos do formulrio queso: load()e oFormClosing().

    Nesse projeto sero usadas trs funes do objetoPorta:

    Open(); Write(); Close();

  • 5/28/2018 Supervisorio c#.pdf

    5/31

    OPorta.Open() foi colocado dentro do evento de load()do formulrio, o que significaque ser estabelecida conexo serial a partir do momento que o programa for carregado.

    OPorta.Close() foi colocado dentro do evento FormClosing(),para que seja encerrada

    a conexo com a porta serial assim que o programa for fechado.

    OPorta.Write() ser usado no boto e na barra de rolagem, para enviar promicrocontrolador a informao que queremos.

    Ao dar um duplo clique no formulrio dever aparecer uma nova aba contendo algunscdigos, e o evento deLoad.

    NoLoaddeve ficar assim:

    private void Form1_Load(object sender, EventArgs e){

    try{

    Porta.Open();}catch{

    MessageBox.Show("Cabo desconectado","Erro");

    Close();

  • 5/28/2018 Supervisorio c#.pdf

    6/31

    }}

    O trye catchso usados para tratar excees(erros), que iro aparecer se o programafor executado sem que a porta exista, no caso do arduino a porta s existir se o cabo

    estiver conectado.

    Funciona da seguinte forma,"tente executar o que estiver dentro do try, caso ocorra aexceo faa o que estiver no catch"Nesse programa, "caso no consiga abrircomunicao com a serial, exiba uma mensagem ( MessageBox.Show("Cabodesconectado","Erro") ) e feche o programa usando o mtodo Close().(No confundircomPorta.Close()).

    Indo no evento de FormClosing()devemos encerrar a comunicao:

    private void Form1_FormClosing(object sender, FormClosingEventArgs e){

    try{

    if (Porta.IsOpen){

    Porta.Close();}

    }catch{ }

    }

    A estrutura trye catchse faz presente novamente,sempre que houver risco dedesconexo do cabo de comunicao ela deve ser usada, sob pena de ver seu programatravar.

    Nesse evento uma condio simples, caso a porta esteja "aberta", feche-a.

    Dando um duplo clique no boto abrir o evento de click

    private void button1_Click(object sender, EventArgs e){

    try{

    if (button1.Text == "Off")

  • 5/28/2018 Supervisorio c#.pdf

    7/31

    {Porta.Write(comando, 1, 1);button1.Text = "On";

    }else

    {Porta.Write(comando, 2, 1);button1.Text = "Off";

    }

    }catch{MessageBox.Show("Cabo desconectado", "Erro");Close();}

    }

    Antes de falar deste cdigo, um array do tipo byte deve ser declarado pois a funoPorta.Write()exige um array de bytes ou chars, ento faam a declarao da seguinteforma:

    byte[] comando = { 0, 200, 201 }; antes depublic Form1()

    O primeiro elemento iremos usar para comandar o angulo do servo, de 0 a 180.

    Como o byte chega at 255, temos um intervalo entre 181 e 255 livre para arbitrarmosum byte para acender e outro para apagar o led. No caso arbitrei 200 para acender e2001 para apagar;

    Neste evento iremos acender ou apagar o led," Se o boto estiver como titulo Off mandepela serial o 200" pois o elemento 1do array comando. o terceiro parmetroda Porta.Write(comando, 1, 1) se refere a quantos bytes sero enviados, no caso s umo 200.Com isso o led dever acender.

    Depois de enviar reescreva o Texto do boto para "On";

    Quando o usurio clicar de novo ser enviado um byte equivalente a 201 desligando oled e reescrevendo o texto do boto para "Off".

    No evento Scrollda barra de rolagemocorre o seguinte:

    private void hScrollBar1_Scroll(object sender, ScrollEventArgs e){

    try{

    comando[0] = (byte)hScrollBar1.Value;Porta.Write(comando, 0, 1);Text = Convert.ToString(hScrollBar1.Value);

  • 5/28/2018 Supervisorio c#.pdf

    8/31

    }catch{

    MessageBox.Show("Cabo desconectado", "Erro");Close();

    }}

    A linha comando[0] = (byte)hScrollBar1.Valueatribui ao primeiro elemento do arrayo valor atual da barra de rolagem.Logo em seguida o valor transmitido para omicrocontrolador que controla o servomotor.

    Depois esse valor convertido para string e passado para o titulo do formulrio parapoder ser visualizado pelo usurio.

    O programa do arduino este:

    #include

    Servo servo1;

    void setup(){

    Serial.begin(9600);

    pinMode(13,OUTPUT);

    servo1.attach(9);

    }

    void loop(){

    if(Serial.available()){

    byte dado = Serial.read();

    if(dado

  • 5/28/2018 Supervisorio c#.pdf

    9/31

    if(dado == 201)

    digitalWrite(13, LOW);

    }

    }

    E o do aplicativo deve ficar assim:

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    using System.Windows.Forms;

    namespace Exemplo1

    {

    public partial class Form1 : Form

    {

    byte[] comando = { 0, 200, 201 };

    public Form1()

    {

    InitializeComponent();

    }

  • 5/28/2018 Supervisorio c#.pdf

    10/31

    private void Form1_Load(object sender, EventArgs e)

    {

    try

    {

    Porta.Open();

    }

    catch

    {

    MessageBox.Show("Cabo desconectado","Erro");

    Close();

    }

    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)

    {

    try

    {

    if (Porta.IsOpen)

    {

    Porta.Close();

    }

    }

    catch

    { }

  • 5/28/2018 Supervisorio c#.pdf

    11/31

    }

    private void button1_Click(object sender, EventArgs e)

    {

    try

    {

    if (button1.Text == "Off")

    {

    Porta.Write(comando, 1, 1);

    button1.Text = "On";

    }

    else

    {

    Porta.Write(comando, 2, 1);button1.Text = "Off";

    }

    }

    catch

    {

    MessageBox.Show("Cabo desconectado", "Erro");

    Close();

    }

    }

    private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)

  • 5/28/2018 Supervisorio c#.pdf

    12/31

    {

    try

    {

    comando[0] = (byte)hScrollBar1.Value;

    Porta.Write(comando, 0, 1);

    Text = Convert.ToString(hScrollBar1.Value);

    }

    catch

    {

    MessageBox.Show("Cabo desconectado", "Erro");

    Close();

    }

    }

    }}

    Com isso conclumos o nosso aplicativo, adaptem a suas necessidades.At a prxima.

    uma pergunta recorrente aqui no frum, principalmente entre os que esto fazendoteste com carrinhos, ou robs que precisem de orientao sobre o uso das teclasdirecionais do PC.

    Neste tutorial, estarei mostrando como identificar que essas teclas foram pressionadas.

    Mostrarei dois exemplos, o primeiro mais rpido e fcil de criar, e o outro mais geral.

    Primeiro exemplo:Formulrio limpo, sem outros componentes grficos.

  • 5/28/2018 Supervisorio c#.pdf

    13/31

    Nesse exemplo o nico componente extra ser o SerialPortusado pra a comunicaocom o arduino. Ajustem naspropriedadeso nome da porta e o baudRate.No meu casoalterei tambm o nome deserialPort1paraPorta.

    Na lista de eventos do formulrio existe um evento chamadoKeyDownque chamadoquando uma tecla pressionada quando o formulrio tem foco.

  • 5/28/2018 Supervisorio c#.pdf

    14/31

    Clicando nele, ser aberto o cdigo para a edio desse evento, modifique de forma quefique semelhante a isso:

    private void Form1_KeyDown(object sender, KeyEventArgs e)

    {

    try

    {

    Porta.Open();

    if (e.KeyCode == Keys.Up)

    {

    Porta.Write("U");

    Text = "Up";

    }

  • 5/28/2018 Supervisorio c#.pdf

    15/31

    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 comunicao";

    }

    }

    Pegarei para a explicao o seguinte trecho:

    if (e.KeyCode == Keys.Right)

    {

  • 5/28/2018 Supervisorio c#.pdf

    16/31

    Porta.Write("R");

    Text = "Right";

    }

    Trata-se de uma condio simples, o objeto eguarda entre outras coisas, a informaode qual tecla disparou esse evento. O que foi feito foi comparar essa informao comKeys.Right que representa o cdigo da tecla direcional, nesse casodireita.Comoresultado afirmativo podemos enviar o dado que nos for conveniente para o arduino,nesse caso enviei a um carter Re escrevi no titulo do formulrio Right.

    Porta.Open(),Porta.Close() e try ... catchj expliquei no tutorial passado.

    Todo o programa se resume a isso.

    Segundo exemplo:Formulrio que contenha outros componentes grficos.

    Para casos onde temos que usar outros elementos grficos como botes, listas, caixas detexto no formulrio, o mtodo passado no funciona porque ele no receber mais foco,e sim algum outro elemento j listado.

    Nesses casos devemos escolher quais dos elementos vo gerar o eventodeKeyDownpara usarmos o mtodo passado. Nesse segundo exemplo adicionei 4botes.

    Pra quem j escreveu oForm1_KeyDownprimeiro exemplo, podemos usa-locomoKeyDownde todos os quatro botes, aqui renomeei parateclado.

    Selecionando todos e relacionando aos eventos deKeyDowna mesma rotinateclado.

  • 5/28/2018 Supervisorio c#.pdf

    17/31

    At aqui alguem poderia pensar que no h diferena entre o primeiro exemplo e osegundo.

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

    Porm queremos usar as direcionais que por padro so usadas para navegar(mudar ofoco) entre os controles, nesse caso botes. Sendo assim a priori no geram um eventodeKeyDown.

    Isso pode ser revertido usando um evento que ocorre antes doKeyDown,oPreviewKeyDown.

    Acesse esse evento de qualquer controle edite o cdigo 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;

  • 5/28/2018 Supervisorio c#.pdf

    18/31

    }

    }

    Aqui troquei o nome da funo paradetectar_teclamas no obrigatrio.O mais

    importante entender como ela funciona.

    Foi feita uma comparao para saber se a tecla que gerou o evento foi uma direcional,se sim, atribua a e.IsInputKeyo valortrue. O que significa que ser gerado tambm umeventoKeyDownlogo em seguida.

    Repito, para teclas, como as alfabticas, no se precisa usar oeventoPreviewKeyDownque por padro iram gerare.IsInputKey = truepara essasteclas, desencadeando assim oKeyDownautomaticamente .

    Depois atribuadetectar_teclaaosPreviewKeyDownde todos os botes.

    No evento do Clickde cada boto coloquem o comando correspondente a sua tecladirecional, por exemplo:

    private void button3_Click(object sender, EventArgs e)

    {

  • 5/28/2018 Supervisorio c#.pdf

    19/31

    try

    {

    Porta.Open();

    Porta.Write("R");

    Text = "Right";

    Porta.Close();

    }

    catch

    {

    Text = "Erro na comunicao";

    }

    }

    Assim o evento do Clickfaz a mesma coisa do teclado, com uma pequena diferena.Caso o usurio mantenha o teclado pressionado o programa enviar informaes de

    forma continua da mesma forma de quando se mantm pressionada uma teclaalfanumrica num editor de texto.

    Assim conseguimos enviar informaes para o arduino, atravs de comando por teclado,adaptem a suas necessidades. At a prxima.

    Cdigo completo:

    http://pastebin.com/HNSwwJ9v

    At agora sempre definamos as propriedades como o nome da porta e BaudRate no

    projeto, para fins de testes funciona muito bem. Porm isso deixa o programa poucoflexvel, j que a porta que o arduino usa pode mudar dependendo do PC onde ele temos drives instalados.

    Neste tutorial estarei mostrando como dar o poder de escolha ao usurio de qual porta ebaud rate usar, e para aqueles que usam o arduino, a escolha de habilitar ou no o resetvia serial.

    Vou aproveitar e mostrar tambm o como salvar essas configuraes para que daprxima vez que o programa for executado ele lembre delas e as tome como default.

    Primeiro passo:adicionar novos itens.

  • 5/28/2018 Supervisorio c#.pdf

    20/31

    Depois de criar um novo projeto, no menuprojetoescolham a opoadicionar novoitem.

    Adicionem um novo formulrio e coloquem o nome de Config_Serial.cs.

    Depois adicionem um novoarquivo de configuraese coloquem o nomede Minhas_Config.settings.

    Antes trabalhar com esses novos itens adicionem os seguintes controles noformulario1(Form1).

  • 5/28/2018 Supervisorio c#.pdf

    21/31

    MenuStrip SerialPort

    Alterei o nome deserialPort1paraPortafiz algumas modificaes nomenuStrip1paraque ficasse assim:

    Apenas troquei a cor atribuindo a propriedadeBackColoracor GradientActiveCaptione criei um menuconexoadicionei as

    opesconfigurareconectar.

    Dando um duplo click na opoconfigurarteremos acesso ao evento dele (Click).

    Qual a ideia? Configurar qual porta e velocidade que vamos usar. S que eu preferifazer esse procedimento em outro formulrio pra ganhar mais espao no principal, praisso adicionamos o formulrio Config_Serialanteriormente.

    Bom, precisamos chamar esse novo formulrio atravs do menu ento faam o seguinte:

    private void configurarToolStripMenuItem_Click(object sender, EventArgs e)

    {

    Config_Serial janela2 = new Config_Serial(this);

    janela2.ShowDialog();

    }

    Primeiro declaramos uma nova varivel do tipo Config_serial, que corresponde aonome que demos ao segundo formulrio, com o nomejanela2e inicializamos elapassando este formulrio (Form1) como parmetro usando a palavrathis. Na segundalinha o segundo formulrio exibido.

  • 5/28/2018 Supervisorio c#.pdf

    22/31

    importante entender porque passar o Form1 como parmetro neste caso. O queacontece que as variveis de um formulrio no podem ser acessadas por outro. Comovamos mudar duas propriedade do objetoPortaatravs do segundo formulrio, e aqueleesta no primeiro, com esse procedimento poderemos mudar campos desse objeto.Tambm importante que mudem a propriedadeModifiers do

    objetoPortaparapublic.

    No evento da opo Conectardo menu deixem parecido com isso:

    private void conectarToolStripMenuItem_Click(object sender, EventArgs e)

    {

    try

    {

    if (Porta.IsOpen)

    {

    Porta.Close();

    conectarToolStripMenuItem.Text = "Conectar";

    }

    else

    {

    Porta.Open();

    if (reset)

    {

    Porta.DtrEnable = true;

    Porta.DtrEnable = false;

    }

    conectarToolStripMenuItem.Text = "Desconectar";

    }

    }

    catch(SystemException erro)

  • 5/28/2018 Supervisorio c#.pdf

    23/31

    {

    MessageBox.Show(erro.Message, "Erro", MessageBoxButtons.OK,MessageBoxIcon.Error);

    }

    }

    Traduzindo: se estiver conectado, desconecta e muda o texto do menu para Conectar.

    Seno, conecta e muda o texto para Desconectar.

  • 5/28/2018 Supervisorio c#.pdf

    24/31

    Se ocorrer algum erro mostra a descrio dele, que esta na varivel erro.Messagenumformulrio com titulo Erro, que tem um boto de oke um cone deError.

    Assim podemos iniciar e encerrar a comunicao quando quisermos.

    Abro um parntese para falar do seguinte trecho:

    if (reset)

    {

    Porta.DtrEnable = true;

    Porta.DtrEnable = false;

    }

    Aqueles que usam o arduino, devem ter notado que o Serial Monitor capaz de resetaro arduino assim que aberto.

    Esse trecho de cdigo faz o mesmo, se a varivel reset for verdadeira, reseta o arduinoao conectar.

    Declarem essa varivel com antecedncia:

    public bool reset = false;

    publicporque vamos acessa-la tambm no segundo formulrio.

    2 passo:segundo formulrio.

    Agora que terminamos o formulrio principal, vamos trabalhar o segundo que ondefaremos as configuraes da porta.

    Adicionem os seguintes controles:

    1 x GroupBox 2 x Label: 2 x ComboBox

  • 5/28/2018 Supervisorio c#.pdf

    25/31

    1 x Checkbox 1 x Timer

    Redimencionem e mudem ostextpara que fique dessa forma:

    Mudem a propriedadeFormBorderStyleparaFixedToolWindowpara impedirredimensionamento em tempo de execuo, e retirar os botes de maximizar eminimizar.

    Mudem tambm paraDropDownListda propriedadeDropDownStyledosdoiscomboBoxs

    No timer1 deixem um intervalo de 1000 ms e deixem apropriedade enabledemtrue.

    Esse timer vai servir para atualizar a lista de portas que o PC tem disponvel.

    No comboBox correspondente ao baud rate, no meu caso ocomboBox2, coloquei asvelocidades padro do Serial Monitorna propriedade items.

  • 5/28/2018 Supervisorio c#.pdf

    26/31

    Vejam o resultado:

    No meu caso s existe a porta que o arduino est, mas quem tiver mais de uma, podeacontecer de os nomes ficarem fora de ordem. Pra corrigir isso basta mudar apropriedade SorteddocomboBox1paratrue.

    No eventocheckBox1_CheckedChangedfaam o mesmo que o exemplo abaixo:

    private void checkBox1_CheckedChanged(object sender, EventArgs e)

  • 5/28/2018 Supervisorio c#.pdf

    27/31

    {

    if(checkBox1.Checked)

    {

    reset2 = true;

    }

    else

    {

    reset2 = false;

    }

    }

    Declarem antes a varivelbool reset2 = false;que ser responsvel por habilitar o resetdo arduino ao conectar.

    Ok, o usurio escolheu, qual porta, qual velocidade, e at se deseja resetar o arduino.Agora resta passar essa informaes pro Form1 j que nele que est o objetoPorta.Arbitrei que iria passar esses dados quando fechasse as configuraes.

    Lembrem se que passamos o Form1 como parmetro quando fizemos:

    Config_Serial janela2 = new Config_Serial(this);

    Para usar esse parmetro faremos o seguinte:

    Form1 janela1;

    public Config_Serial(Form1 x)

    {

    InitializeComponent();

    janela1 = x;

    }

    Logo que clicamos em algum controle para ter acesso a algum evento esse mtodo j automaticamente gerada para ns logo no comeo do cdigo. Ele originalmente vemsem parmetros. O que fizemos aqui foi declarar um objeto do tipoForm1com

    nomejanela1e recebeu o valorxpassado pelo formulrio anterior.

  • 5/28/2018 Supervisorio c#.pdf

    28/31

    Agora podemos passar as informaes para o formulrio anterior fazendo:

    private void Config_Serial_FormClosing(object sender, FormClosingEventArgs e)

    {

    try

    {

    janela1.Porta.BaudRate = Convert.ToInt32(comboBox2.Text);

    janela1.Porta.PortName = comboBox1.Text;

    janela1.Text = comboBox1.Text + "/" + comboBox2.Text;

    janela1.reset = reset2;

    }

    catch

    {

    DialogResult escolha;

    escolha = MessageBox.Show("Prencha todos os campos ", "Aviso",MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);

    if (escolha == System.Windows.Forms.DialogResult.OK)

    {

    e.Cancel = true;

    }

    }

    }

    O cdigo acima tenta passar os dados para o formulrio anterior, caso no consiga elemostra uma mensagem que diz:"Prencha todos os campos corretamente", e d duasopes ao usurio:

    Ok: significa que o evento ser cancelado(e.cancel) para correo dasinformaes

    Cancel: segue com o evento, fechando o formulrio.

  • 5/28/2018 Supervisorio c#.pdf

    29/31

    Passo 3:Configurar definies.

    Ufa! Conseguimos, por aqui termina para quem se deu por satisfeito com o resultado.

    Porm um pouco chato sempre ter que ir no menu e escolher de novo os parmetrospara configurar a conexo serial, seria interessante que o programa guardasse essasinformaes mesmo depois de fechado.

    Pra isso mesmo que adicionamos no comeo do projeto umarquivo deconfiguraescom o nome deminhas_config.settings. Ele vai guardar dados que serousados na prxima vez que o programa for executado.

    Ele deve ter essa cara:

  • 5/28/2018 Supervisorio c#.pdf

    30/31

    Aqui j defini alguns valores que eu desejo guardar.

    A ideia atualizar e salvar esses valores quando fecharmos o programa, logo devemosusar o eventoFormClosingdoForm1

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)

    {try

    {

    Minhas_Config.Default.Nome_Porta = Porta.PortName;

    Minhas_Config.Default.Baud_Rate = Porta.BaudRate;

    Minhas_Config.Default.restart_arduino = reset;

    Minhas_Config.Default.Save();

    }

    catch

    {

    MessageBox.Show("Erro ao salvar!Reconfigure quando executarnovamente","Erro");

    }

  • 5/28/2018 Supervisorio c#.pdf

    31/31

    }

    E quando abrirmos novamente o programa, carregar os valores guardados:

    private void Form1_Load(object sender, EventArgs e)

    {

    try

    {

    Porta.PortName = Minhas_Config.Default.Nome_Porta;

    Porta.BaudRate = Minhas_Config.Default.Baud_Rate;

    reset = Minhas_Config.Default.restart_arduino;

    Text = Porta.PortName + "/" + Convert.ToString(Porta.BaudRate);//Mostrano titulo do formulrio o nome da porta seguido de "/" e o baudrate.

    }

    catch

    {

    MessageBox.Show("Erro ao salvar!Reconfigure quando executarnovamente", "Erro");

    }

    }

    Pronto, com isso termino mais um tutorial, adaptem a suas necessidades. At a prxima.