Supervisório em C# + Microcontrolador PIC
Vemos hoje em dia uma grande porcentagem de projetos envolvendo sistemas embarcados que tendem ao uso principalmente de plataformas de programação tipo arduino ou similar, mas existem diversas maneiras de construir um sistema eletrônico microcontrolado, e um dos embarcados mais populares para esses projetos são os microcontroladores PIC das mais diversas famílias.
Seguindo nessa linha vamos aprender a criar um sistema de controle com o uso de um Microcontrolador da família PIC18F4520. É basicamente um acionamento de uma ventoinha por meio da variação de temperatura de um LM35, e informações recebidas e enviadas por meio de um monitor serial, com animações elaborado em linguagem Visual Studio C#.
Então vamos ao projeto!
Eletrônica
Para realização do projeto é necessário os seguintes componentes:
1 Microcontrolador PIC18f4520
2 transistores BC337
1 LM35
2 potenciômetros de 10 Kohms
1 Max 232
4 capacitores de 10uF
2 capacitores 22 pF
1 cristal oscilador 8Mhz
4 resistores de 220 ohms
4 resistores de 10 Kohms
2 resistores de 2K2
1 resistor 56 ohm
4 Leds
1 visor LCD
1 ventoinha 12vcc
1 conector DB9 fêmea
1 cabo conversor USB/RS-232
1 fonte ajustável com 5vcc/ 12vcc
cabos jumper
Logo abaixo é possível ver o esquemático em software de projetos Proteus:
Código fonte
O código fonte do funcionamento do microcontrolador foi elaborado no CCS PicC e logo abaixo é possível ver o funcionamento de cada uma das funções aplicadas
Código fonte elaborado no CCSPICC:
#include<18F4520.h> //Inclui arquivo header do PIC 18F4520
#device ADC = 10 //Define 10 bits para o resultado da conversão AD
#use delay (clock=8000000) /*Definição da frequência do cristal para cálculo
..dos delays*/
#fuses HS, NOWDT, PUT,BROWNOUT, NOLVP //Configuração dos bits de controle
//Definições para a comunicação serial
#use RS232 (Baud=9600, xmit = PIN_C6, rcv = PIN_C7)
#include "LCD4B.c" //Inclui arquivo de funções do LCD
int32 ad0, ad1; //variáveis para armazenamento da conversão
int32 ADC0, ADC1;
int l1=0, l2=0, l3=0, l4=0; //variáveis de controle para os leds
/******************************************************************************
variáveis de controle:
vent = ventoinha;
aq = aquecedor;
cont = controle de índice para recepção serial;
tempo = informação de tempo em 2 segundos
chg = controle para visualização dos dados no LCD.
*******************************************************************************/
int vent = 0, aq=0, cont=0, tempo=0, chg = 0;
int1 tmp = 0; /*variável de controle de tempo em 2 segundos para
alterarção das informações no LCD*/
int rec[5]; //Variável de recepção de dados pela serial
#INT_RDA //Diretiva de identficação p/ int. pela recepção serial
void rec_serial() //Funçõa de tratamento da recepção de dados
{
rec[cont] = getc(); /*Lê o dado vindo pela serial e o armazena em
rec na posição (índice) informado por cont*/
if (rec[cont] == 0x0D) //Verifica se o dado recebido é igual a CR (0x0D)
{
//Liga Leds 1, 2 , 3, 4 e Aquecimento
if (rec[0]=='L' && rec[1]=='G') //Verifica se os primeiros caracteres são 'LG'
{
if (rec[2] == '1') //Verifica se o terceiro caractere é '1'
{
l1 = 1; //controle de leds l1 = 1
output_bit(PIN_D0,l1); //Acende Led conectado ao pino RD0
}
if (rec[2] == '2') //Verifica se o terceiro caractere é '2'
{
l2 = 1; //controle de leds l2 = 1
output_bit(PIN_D1,l2); //Acende Led conectado ao pino RD1
}
if (rec[2] == '3') //Verifica se o terceiro caractere é '3'
{
l3 = 1; //controle de leds l3 = 1
output_bit(PIN_D2,l3); //Acende Led conectado ao pino RD2
}
if (rec[2] == '4') //Verifica se o terceiro caractere é '4'
{
l4 = 1; //controle de leds l4 = 1
output_bit(PIN_D3,l4); //Acende Led conectado ao pino RD3
}
if (rec[2] == 'A') //Verifica se o terceiro caractere é 'A'
{
aq = 1; //controle de aquecimento aq = 1
output_bit(PIN_C1,aq); //Liga o circuito de aquecimento em RC1
}
}
//Desliga Leds 1, 2, 3 e 4
if (rec[0]=='D' && rec[1]=='G') //Verifica se os primeiros caracteres são 'DG'
{
if (rec[2] == '1') //Verifica se o terceiro caractere é '1'
{
l1 = 0; //controle de leds l1 = 0
output_bit(PIN_D0,l1); //Apaga Led conectado ao pino RD0
}
if (rec[2] == '2') //Verifica se o terceiro caractere é '2'
{
l2 = 0; //controle de leds l2 = 0
output_bit(PIN_D1,l2); //Apaga Led conectado ao pino RD1
}
if (rec[2] == '3') //Verifica se o terceiro caractere é '3'
{
l3 = 0; //controle de leds l3 = 0
output_bit(PIN_D2,l3); //Apaga Led conectado ao pino RD2
}
if (rec[2] == '4') //Verifica se o terceiro caractere é '4'
{
l4 = 0; //controle de leds l4 = 0
output_bit(PIN_D3,l4); //Apaga Led conectado ao pino RD3
}
}
/*Após recebido todos os dados da serial, faz a limpeza de toda a
variável rec e retorna o controle de índices cont em 0*/
for(cont = 0; cont < 5; cont++) rec[cont] = '\0';
cont = 0;
}
else
/*Se ainda não foram recebidos todos os dados de controle, incrementa
a variável de índice cont*/
cont++;
}
#INT_TIMER0 //Diretiva de indetificação da int. do Timer 0
void Trata_t0() //Função para tratamento do Timer 0
{
tempo++; //Incrementa a variável tempo a cada 25ms
if (tempo >= 80) //Se tempo >= 80 <=> 2 segundos?
{
tmp = 1; //Variável de controle de tempo 2 seg vai para 1
tempo = 0; //Retorna a variável tempo em 0
}
SET_TIMER0(61); //Retorna o valor inicial ao Timer 0
}
//Formato do protocolo = AN0:0000:TMP:0000:00000000
void escreve_serial() //Função de envio do protocolo para a serial
{
printf("AN0:%04lu",ad0); //Envia dados de conversão A/D para exibir tensão
printf(":"); //Controle do protocolo
printf("TMP:%04lu",ad1); //Envia dados de conversão A/D para exibir temperatura
printf(":"); //Controle do protocolo
/******************************************************************************
Envia dados referentes ao circuito de aquecimento, ventoinha e leds
0: desligado
1: ligado
******************************************************************************/
printf("%d%d00%d%d%d%d",aq, vent, l1, l2, l3, l4);
//printf(":"); //Controle do protocolo
}
//void limpa_leds() //Função
//{
//output_low(PIN_D4);
//output_low(PIN_D5);
//output_low(PIN_D6);
//output_low(PIN_D7);
//}
void main() //Função principal
{
//Configura as entradas analógicas AN0 a AN3
SETUP_ADC_PORTS(AN0_TO_AN3);
//Utiliza o clock interno para tempo de aquisição
SETUP_ADC(ADC_CLOCK_Internal);
output_low(PIN_C1); //Desliga circuito de aquecimento
output_low(PIN_C2); //Desliga circuito da Ventoinha
//Habilita interrupção global
Enable_Interrupts(GLOBAL);
//Habilita interrupção por recepção de dados na serial
Enable_Interrupts(INT_RDA);
//Habilita interrupção pelo overflow do Timer 0
ENABLE_INTERRUPTS(INT_TIMER0);
/*Configura Timer 0 para incremento pelo ciclo de máquina
Prescaler de 1:256 e modo de operação em 8 bits*/
SETUP_TIMER_0(RTCC_INTERNAL | RTCC_DIV_256 | RTCC_8_BIT);
//Inicia o Timer 0 com o valor 61 - Interrupção a cada 25ms
SET_TIMER0(61);
lcd_ini(); //Inicia o LCD
//Escreve as mensagens iniciais no LCD
printf(lcd_escreve,"\f SUPERVISORIO");
printf(lcd_escreve,"\nMECATRONIZANDO");
output_D(0x00); //Faz toda a porta D = 0
l1 = input_state(PIN_D0); //armazena em l1 o estado do pino RD0
l2 = input_state(PIN_D1); //armazena em l2 o estado do pino RD1
l3 = input_state(PIN_D2); //armazena em l3 o estado do pino RD2
l4 = input_state(PIN_D3); //armazena em l4 o estado do pino RD3
/*Faz a limpeza de toda a variável rec e faz o controle
de índices cont em 0*/
for(cont = 0; cont < 5; cont++) rec[cont] = '\0';
cont = 0;
while(true) //Loop principal
{
if (!input(PIN_B0)) //Se chave conectada ao pino RB0 for pressionada
{
output_high(PIN_C1); //Liga circuito de aquecimento
aq = 1; //Faz controle de aquecimento aq = 1
}
SET_ADC_CHANNEL(0); //Configura o canal de leitura 0
delay_us(100); //Tempo de ajuste do canal (necessário)
ad0 = READ_ADC(); //Faz a conversão AD e a salva na variável ad0
SET_ADC_CHANNEL(3); //Configura o canal de leitura 3
delay_us(100); //Tempo de ajuste do canal (necessário)
ad1 = READ_ADC(); //Faz a conversão AD e a salva na variável ad0
ADC0 = (ad0 * 500) /1023; //Cálculo da conversão AD para o LCD (Tensão)
ADC1 = (ad1 * 500) /1023; //Cálculo da conversão AD para o LCD (temperatura)
if (ad1>=81) //Se ad1 >= 81 (aprox. 40 graus)
{
output_low(PIN_C1); //Desliga circuito de aquecimento
output_High(PIN_C2); //Liga circuito da ventoinha
aq = 0; //Faz controle de aquecimento aq = 0
vent = 1; //Faz controle da ventoinha vent = 1
}
if (ad1<=60) //Se ad1 <= 60 (aprox. 27 graus)
{
output_low(PIN_C2); //Desliga circuito da ventoinha
vent = 0; //Faz controle da ventoinha vent = 0;
}
escreve_serial(); //Envia dados pela serial
if (tmp) //Se tmp = 1 (a cada 2 segundos)
{
chg++; //incrementa a variável chg
if (chg==1) //se chg = 1
{
//Exibe tensão e temperatura no LCD
printf(lcd_escreve,"\fAN0 : %lu,%02lu V", ADC0/100, ADC0%100);
printf(lcd_escreve,"\nTEMP: %lu%cC",ADC1,0xDF);
}
if (chg==2) //Se tmp = 2
{
/*Exibe as informações dos circuitos de aquecimento e
ventoinha*/
printf(lcd_escreve,"\fAQ: %d VENT: %d",aq,vent);
}
if (chg==3) //Se tmp = 3
{
//Exibe as informações do estado dos LEDS
printf(lcd_escreve,"\fL1: %d L2: %d",l1,l2);
printf(lcd_escreve,"\nL3: %d L4: %d",l3,l4);
chg = 0; //Faz chg = 0
}
//limpa_leds();
tmp = 0; //Retorna tmp em 0
}
delay_ms(300); //Atraso de 100ms
}
}
Esse código fonte foi baseado em um material extraído do livro Conceitos básicos de Visualização e Controle, Carlos Eduardo Sandrini Luz.
O Aplicativo
O aplicativo feito consiste em um sistema que deve ser logado para pode visualizar o funcionamento correto do sistema, consiste em 4 Forms e uma tela de login, faz-se uso de diversos conceitos vistos anteriormente em nossas vídeo aulas e na elaboração de uma classe do tipo Global, criaçao de um Protocolo e faz uso de uma Porta COM para comunicação Serial.
Pode se considerar esse tipo de aplicativo como um exercício em nível intermediário/ alto de dificuldade.
O funcionamento:
Quando executado, o aplicativo apresenta uma tela de login para que seja inserido um nome de usuário e senha e o sistema entre em funcionamento.
USUÁRIO: mecatronizando
SENHA: 12345
USUÁRIO: mecatronizando
SENHA: 12345
Uma tela de carregamento mostra o sistema se "preparando", apesar de não trabalhar com nenhuma SQL, mas se houvesse, seria nesse momento em que elas seriam carregadas.
No cabeçalho do aplicativo é possível navegar e conectar o circuito, na Aba Arquivo, é possível salvar um histórico do funcionamento do circuito em formato. txt, e em Sair é possível fechar o aplicativo.
Em Comunicação Serial, Configurações, o usuário deve escolher a porta de comunicação ao qual o circuito vai utilizar para o funcionamento, velocidade, paridade, stop e data bits.
fonte:próprio autor
Ao acessar Abrir Porta o sistema passa a comunicar-se com o circuito.
Com o circuito alimentado e conectado ao PC, as informações entre as máquinas começam a ser trocadas via TX/ RX, um gráfico do estado do leitor de temperatura LM35 começa a ser traçado no ambiente gráfico. É possível observar também nos Gauges a tensão variante conforme o movimento no potênciometro e a temperatura no componente.
Na parte inferior do aplicativo uma região de controle possibilita que por meio da tela do PC o usuário controle os leds inseridos no sistemas, que respondem ao aplicativo em tempo real.
Quando o LM 35 sofrer uma variação de temperatura e ultrapassar 40°C, uma ventoinha é acionada até que a temperatura se estabilize e permaneça abaixo dos 27°C, esse procedimento é acompanhado visualmente pela tela do aplicativo.
Além da praticidade do acompanhamento via remota (pelo PC), existe um visor LCD para acompanhamento local de funcionamento do sistema.
No vídeo, é possível ver o funcionamento completo do sistema:
Código fonte do aplicativo completo de cada um dos Forms usados no projeto:
Login
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 APLICATIVO
{
public partial class Login : Form
{
public Login()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "mecatronizando" && textBox2.Text == "12345")
{
Form0 newForm0 = new Form0();
newForm0.Show();
this.Visible = false;
}
else
{
MessageBox.Show("Loguin e/ou senha Incorretos!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
textBox1.Text = "";
textBox2.Text = "";
}
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
textBox2.PasswordChar = '*';
}
private void button2_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}
Carregando...
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 APLICATIVO
{
public partial class Form0 : Form
{
public Form0()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
if (progressBar1.Value < 100)
{
progressBar1.Value = progressBar1.Value + 2;
}
else
{
timer1.Enabled = false;
Form1 newForm1 = new Form1();
newForm1.Show();
this.Visible = false;
}
}
}
}
Form1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using System.Drawing.Drawing2D;
namespace APLICATIVO
{
public partial class Form1 : Form
{
//Instanciando a classe
SerialPort SerialCom = new SerialPort();
string bfRecebe = string.Empty;
//Criando o método(função) Fdelegate que vai receber o parâmetro do tipo string 'a'
public delegate void Fdelegate(string a);
List<string> TempList = new List<string>();
string txt_rec = string.Empty;
string txt_list = string.Empty;
int qtde_data = 0;
float eixo_x = 0;
float eixo_y = 0;
bool vent = false, aq = false;
bool l1 = false, l2 = false, l3 = false, l4 = false;
private void Form1_Load(object sender, EventArgs e)
{
xyGraph1.AddGraph("Temperatura/Tempo", DashStyle.Solid, Color.White, 1, false);
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
button1.Enabled = false;
button2.Enabled = true;
}
private void button2_Click(object sender, EventArgs e)
{
button1.Enabled = true;
button2.Enabled = false;
}
private void timer1_Tick(object sender, EventArgs e)
{
TempList.Add(DateTime.Now + " - " + txt_list);
qtde_data++;
eixo_y = aGauge2.Value;
eixo_x++;
if (eixo_x >= 120)
{
timer1.Enabled = false;
button1.Enabled = true;
button2.Enabled = false;
}
xyGraph1.AddValue(0, eixo_x, eixo_y);
xyGraph1.DrawAll();
}
private void salvarToolStripMenuItem_Click(object sender, EventArgs e)
{
TextWriter Arq;
try
{
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
Arq = File.AppendText(saveFileDialog1.FileName);
for (int i = 0; i < qtde_data; i++)
Arq.WriteLine(TempList[i]);
Arq.Close();
}
MessageBox.Show("Cadastro realizado com sucesso!");
}
catch (Exception erro)
{
MessageBox.Show(erro.ToString());
}
}
private void sairToolStripMenuItem_Click(object sender, EventArgs e)
{
Close();
}
private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
StreamReader Arq;
string recebe = string.Empty;
eixo_x = 0;
xyGraph1.ClearGraph(0);
try
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
Arq = new StreamReader(openFileDialog1.FileName);
while (!(Arq.EndOfStream))
{
recebe = Arq.ReadLine().Substring(35, 4);
eixo_y = (float.Parse(recebe) * 500) / 1023;
xyGraph1.AddValue(0, eixo_x, eixo_y);
xyGraph1.DrawAll();
eixo_x++;
}
}
}
catch (Exception erro)
{
MessageBox.Show(erro.ToString());
}
}
private void configuraçãoToolStripMenuItem_Click(object sender, EventArgs e)
{
Form2 nForm = new Form2();
nForm.ShowDialog();
if (!Global.Cancela)
{
try
{
if (SerialCom.IsOpen) SerialCom.Close();
SerialCom.PortName = Global.Porta;
SerialCom.BaudRate = int.Parse(Global.BRate);
SerialCom.StopBits = (StopBits)Enum.Parse(typeof(StopBits), Global.SBits);
SerialCom.DataBits = int.Parse(Global.DBits);
SerialCom.Parity = (Parity)Enum.Parse(typeof(Parity), Global.Paridade);
button1.Enabled = true;
SerialCom.Open();
}
catch
{
MessageBox.Show("Não foi possível abrir a Porta Serial!");
}
}
}
private void pictureBox1_Click(object sender, EventArgs e)
{
if (!l1) SerialCom.Write("LG1\r");
else SerialCom.Write("DG1\r");
}
private void pictureBox2_Click(object sender, EventArgs e)
{
if (!l2) SerialCom.Write("LG2\r");
else SerialCom.Write("DG2\r");
}
private void pictureBox3_Click(object sender, EventArgs e)
{
if (!l3) SerialCom.Write("LG3\r");
else SerialCom.Write("DG3\r");
}
private void pictureBox4_Click(object sender, EventArgs e)
{
if (!l4) SerialCom.Write("LG4\r");
else SerialCom.Write("DG4\r");
}
private void pictureBox5_Click(object sender, EventArgs e)
{
if (!aq) SerialCom.Write("LGA\r");
else SerialCom.Write("DGA\r");
}
private void sobreToolStripMenuItem_Click(object sender, EventArgs e)
{
Form3 Fsobre = new Form3();
Fsobre.ShowDialog();
}
private void xyGraph1_Load(object sender, EventArgs e)
{
}
private void button3_Click(object sender, EventArgs e)
{
Close();
}
public Form1()
{
InitializeComponent();
SerialCom.DataReceived += new SerialDataReceivedEventHandler(SerialCom_DataReceived);
}
void SerialCom_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//throw new NotImplementedException();
bfRecebe = SerialCom.ReadExisting();
this.BeginInvoke(new Fdelegate(recebe_serial), new object[] { bfRecebe });
}
public void recebe_serial(string a)
{
string[] txtSplit;
int volts, temp;
txt_rec += a;
if (txt_rec.Length >= 26)
{
txtSplit = txt_rec.Split(':');
txt_rec = string.Empty;
if (txtSplit[0] == "AN0")
{
txt_list = txtSplit[0] + ":" + txtSplit[1] + ":" + txtSplit[2] + ":" + txtSplit[3];
volts = Convert.ToInt32(txtSplit[1]);
aGauge1.Value = (volts * 5000) / 1023;
aGauge1.Cap_Idx = 1;
aGauge1.CapText = aGauge1.Value.ToString() + " mV";
temp = Convert.ToInt32(txtSplit[3]);
aGauge2.Value = ((temp * 500) / 1023);
aGauge2.Cap_Idx = 1;
aGauge2.CapText = aGauge2.Value.ToString() + " " + (char) 176 + " C ";
//Verifica Led 1
if (txtSplit[4].Substring(4, 1) == "1")
{
pictureBox1.Image = APLICATIVO.Properties.Resources.AMARELO;
l1 = true;
}
else
{
pictureBox1.Image = APLICATIVO.Properties.Resources.AMARELOAPAGADO;
l1 = false;
}
//Verifica Led 2
if (txtSplit[4].Substring(5, 1) == "1")
{
pictureBox2.Image = APLICATIVO.Properties.Resources.AMARELO;
l2 = true;
}
else
{
pictureBox2.Image = APLICATIVO.Properties.Resources.AMARELOAPAGADO;
l2 = false;
}
//Verifica Led 3
if (txtSplit[4].Substring(6, 1) == "1")
{
pictureBox3.Image = APLICATIVO.Properties.Resources.LED_ON1;
l3 = true;
}
else
{
pictureBox3.Image = APLICATIVO.Properties.Resources.LED_OFF1;
l3 = false;
}
//Verifica Led 4
if (txtSplit[4].Substring(7, 1) == "1")
{
pictureBox4.Image = APLICATIVO.Properties.Resources.LED_ON1;
l4 = true;
}
else
{
pictureBox4.Image = APLICATIVO.Properties.Resources.LED_OFF1;
l4 = false;
}
//Verifica Aquecedor
if (txtSplit[4].Substring(0, 1) == "1")
{
pictureBox5.Image = APLICATIVO.Properties.Resources.LED_ON1;
aq = true;
}
else
{
pictureBox5.Image = APLICATIVO.Properties.Resources.LED_OFF1;
aq = false;
}
//Verifica Ventoinha
if (txtSplit[4].Substring(1, 1) == "1")
{
pictureBox6.Image = APLICATIVO.Properties.Resources.LED_ON1;
vent = true;
}
else
{
pictureBox6.Image = APLICATIVO.Properties.Resources.LED_OFF1;
if (vent && !aq)
{
vent = false;
}
}
}
}
}
}
}
Form2
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;
using System.IO.Ports;
namespace APLICATIVO
{
public partial class Form2 : Form
{
SerialPort COMSerial = new SerialPort();
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
bool setcom = false;
foreach (string str in SerialPort.GetPortNames())
{
cmbPorta.Items.Add(str);
if (str == "COM1") setcom = true;
}
if (setcom)
cmbPorta.SelectedText = "COM1";
else
cmbPorta.SelectedIndex = 0;
cmbBaud.Text = "9600";
int i = 0;
foreach (string str in Enum.GetNames(typeof(Parity)))
{
cmbPar.Items.Add(str);
if (str == "None")
cmbPar.SelectedIndex = i;
i++;
}
i = 0;
foreach (string str in Enum.GetNames(typeof(StopBits)))
{
cmbStop.Items.Add(str);
if (str == "One")
cmbStop.SelectedIndex = i;
i++;
}
cmbData.Text = "8";
}
private void button1_Click(object sender, EventArgs e)
{
Global.Porta = cmbPorta.Text;
Global.BRate = cmbBaud.Text;
Global.SBits = cmbStop.Text;
Global.DBits = cmbData.Text;
Global.Paridade = cmbPar.Text;
Global.Cancela = false;
Close();
}
private void button2_Click(object sender, EventArgs e)
{
//Garante o fechamento da porta serial
if (COMSerial.IsOpen) COMSerial.Close();
Global.Cancela = true;
Close();
}
}
}
O aplicativo e todo projeto pode ser baixado por esse LINK, continue nos acompanhando.
Bons estudos!
Referências:
LUZ, Carlos E.S. Elaboração de aplicativos. In: Criação de sistemas supervisórios em Visual C# 2010 Express: conceitos básicos, visualização e controle. ed.1. São Paulo, SP: Érica, 2012.
Puxa vida, parabens, ficou otimo!
ResponderExcluir