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

Exibições: 6253

Responder esta

Respostas a este tópico

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.

Yure, Marlon e Renne Muito Obrigado Pela Ajuda

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço