Ola Turma, Estou iniciando a desenvolver interface para controlar microcontrolador...
Estou com Problemas na parte do recebimento de dados....
Eu gostaria de receber os dados e comparar... mas só consegui receber dados através da função .ReadLine(); mas tenho que aperta um botão.
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = Porta.ReadLine();
}
tem como o .ReadLine(); se automático?
Obrigado
Tags:
1ºpasso: Adicione o componente backgroundWorker no seu projeto, ele é o segundo na toobox.
2ºpasso: Mude para true WorkerReportsProgress e WorkerSuportsCancellation que estão na aba de propriedades do componente
3ºpasso: Coloque no evento do load o comando backgroundWorker1.RunWorkerAsync(); para dar inicio a rotina DoWork
4ºpasso: Procure o evento DoWork e de o duplo click nele e vai abrir a rotina correspondente, acrescente as seguintes linhas:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (!backgroundWorker1.CancellationPending)//loop enquanto o componente não for cancelado.
{
try
{
if (serialPort1.BytesToRead > 0)
{
//backgroundWorker1.ReportProgress(serialPort1.ReadChar());//se for ler um byte de cada vez.
//string palavra = serialPort1.ReadLine();
//backgroundWorker1.ReportProgress(0,palavra);//se for ler uma linha inteira.
}
}
catch { }
}
}
4ºpasso: No evento do ProgressChanged vc obtem o valor de retorno da função ReportProgress(serialPort1.ReadByte()) ou ReportProgress(0,palavra) tomando respectivamente o valor de e.ProgressPercentage ou Convert.ToString(e.UserState); (só da pra ler como string se usar Convert.ToString, não o sei porque!)
5ºpasso: Para encerrar a rotina DoWork use:
if (backgroundWorker1.IsBusy) backgroundWorker1.CancelAsync();//Se estiver em execução, cancele.
use no evento FormClosing por exemplo.
Dica: Para operações de qualquer tipo com os dados lidos, de preferencia a execução delas na rotina DoWork, pois esta é executada em "paralelo" com o programa principal.
Para modificar os componentes do formulário como texbox's, label's e etc, somente no ProgressChanged.
Você pode fazer assim, fica bem simples. Antes de abrir a porta você faz:
Porta.DataReceived += new SerialDataReceivedEventHandler(spSimulador_DataReceived);
Essa função é assim:
private void spSimulador_DataReceived (object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
Invoke(new Action(() =>
{
var dados = spSimulador.ReadExisting();
memDadosRecebidos.Text = "PortaAvulsa => " + dados + memDadosRecebidos.Text;
}));
}
Outra coisa que você poderia fazer, é uma classe para sua porta serial, ficaria ainda melhor.
To a um tempão procurando uma solução enxuta mas sempre achei complicado, poderia explicar o que acontece?
Off-topic:as vezes o programa trava ao fechar.
Funciona assim.
O evento DataReceived do SerialPort, é um delegate algo bem legal do C#.
Um delegate em C# é semelhante a um ponteiro de função. Usando um delegate você pode encapsular a referência a um método dentro de um objeto de delegação. O objeto de delegação pode ser passado para o código o qual pode chamar o método referenciado sem ter que saber em tempo de compilação qual método será chamado.
Então assim, quando a porta serial recebe os dados ela faz o que deve fazer, e manda os dados recebidos para spSimulador_DataReceived. Assim você pode processar os dados recebidos sem se preocupar com o que a classe SerialPort faz.
O Invoke, serve para você teoricamente invocar um processamento paralelo, desta forma o sistema teoricamente não irá travar.
Ajudei na resposta?
O problema do Timer é que você estaria usando algo que para toda a thread para passar num trecho que pode não fazer nada. Outro problema, se você precisar de velocidade e precisão o timer será problema.
Cara eu sou programador C#.NET ha 2 anos e alguns meses. Estou a desenvolver uma aplicativo que fará a ver do coletor de ligacoes telefonica na empresa aonde trabalho. Estou apanhar com a comunicacao Serial. Tah mesmo osso.
Este material ai disponibilizado deu uma claridade, vou mesmo precisar de ajudar com a Porta Serial. Tenho pouco conhecimentos em como ler dela tipo, ler os dados da central telefonica e escrever num arquivo.txt.
Qualquer dica, ajuda, manual, tutorial que disponibilizem aqui sobre comunicação C# vs Serial vs *.txt será bem vinda.
Preciso aumentar os conhecimentos sobre estes. Tenho muitos projetos em papel sobre a comunicacao Arduino vs Serial e estou meio parado por tenho pouco conhecimento ...
Valeu.
Como os demais colegas reportaram voce precisará usar Threads, pois usar com o Timer provavelmente voce terá travamentos na sua aplicação, a solução é trabalhar com o Background Worker.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por