Ir ao conteúdo
  • Cadastre-se

Comunicação PIC - PC via C#


Posts recomendados

@chacalgbi

 

 

Amigo, estive pesquisando melhor e creio que você precisará usar um delegate para atualizar o controle TextBox com a string a partir de outra thread: http://msdn.microsoft.com/library/a1hetckb.aspx

 

Vou colocar abaixo as modificações necessárias. Faça um backup do seu projeto atual.

 

 

Note que a RxString foi removida ali do início. O restante acho que está fácil para deduzir onde modificar.

 

 

Teste aí.

public partial class Form1 : Form{    // Variáveis        byte[] buff = new byte[3];    // Adicionar    public delegate void DisplayTextDelegate(String myString);    public DisplayTextDelegate myDelegate;(...)// Adicionar ao evento 'Load' do formprivate void Form1_Load(object sender, EventArgs e){    this.myDelegate = new DisplayTextDelegate(DisplayText);}public void DisplayText(String myString){    textBox1.AppendText(myString);}private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e){    Thread.Sleep(400);    string RxString = serialPort1.ReadLine();    textBox1.Invoke(this.myDelegate, new Object[] {RxString});}

LNW

Link para o comentário
Compartilhar em outros sites

@LNW

 

Fiz as modificações que você passou, só que não compila pois dá erro na palavra "Thread"  o erro é " Erro 1 O nome 'Thread' não existe no contexto atua"

 

Vou passar o código completo, provavelmente coloquei algo no lugar errado.

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace SimpleSerial{    public partial class Form1 : Form    {        // Variáveis        byte[] buff = new byte[3];        public delegate void DisplayTextDelegate(String myString);        public DisplayTextDelegate myDelegate;        public Form1()        {            InitializeComponent();        }        public void DisplayText(String myString)        {            textBox1.AppendText(myString);        }        private void buttonStart_Click(object sender, EventArgs e)        {            // Altere para sua COM. Veja no gerenciador de sipositivos qual a disponível            bool error = false;            serialPort1.PortName = "COM6";            serialPort1.BaudRate = 9600;            if (!serialPort1.IsOpen)            {                try                {                    // Abrir a porta                    serialPort1.Open();                }                catch (UnauthorizedAccessException) { error = true; }                //catch (IOException) { error = true; }                catch (ArgumentException) { error = true; }                                if (error) MessageBox.Show(this, "Não foi possível abrir a porta COM.  Está em uso, foi removida ou não está disponível.", "COM Port não disponível", MessageBoxButtons.OK, MessageBoxIcon.Stop);                //serialPort1.Open();                if (serialPort1.IsOpen)                {                    buttonStart.Enabled = false;                    buttonStop.Enabled = true;                    button_red.Enabled = true;                    button_green.Enabled = true;                                        textBox1.ReadOnly = false;                }            }        }        private void buttonStop_Click(object sender, EventArgs e)        {            if (serialPort1.IsOpen)            {                serialPort1.Close();                buttonStart.Enabled = true;                buttonStop.Enabled = false;                button_red.Enabled = false;                button_green.Enabled = false;                                textBox1.ReadOnly = true;            }        }        private void Form1_FormClosing(object sender, FormClosingEventArgs e)        {            if (serialPort1.IsOpen) serialPort1.Close();        }        private void DisplayText(object sender, EventArgs e)        {           //textBox1.AppendText(RxString);                               }        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)        {            Thread.Sleep(400);            string RxString = serialPort1.ReadLine();            textBox1.Invoke(this.myDelegate, new Object[] { RxString });                                    this.Invoke(new EventHandler(DisplayText));                                }        private void button1_Click(object sender, EventArgs e)        {            buff[0] = 1;            buff[1] = 0;             buff[2] = 3;            serialPort1.Write(buff, 0, 3);        }        private void button2_Click(object sender, EventArgs e)        {            buff[0] = 1;            buff[1] = 2;            buff[2] = 0;            serialPort1.Write(buff, 0, 3);        }        private void button1_Click_1(object sender, EventArgs e)        {            buff[0] = 1;            buff[1] = 2;            buff[2] = 3;            serialPort1.Write(buff, 0, 3);                   }        private void textBox1_TextChanged(object sender, EventArgs e)        {            //label1.Text += RxString.Length.ToString() + "|";            //label2.Text = RxString;        }        private void Form1_Load(object sender, EventArgs e)        {            this.myDelegate = new DisplayTextDelegate(DisplayText);        }           }}
Link para o comentário
Compartilhar em outros sites

@LNW

 

Fiz o que você falou e deu esse erro:

 

FVITGSC.jpg

 

 

 

Poxa MatheusLPS, que pena, mas vou ver aqui com o outro colega, obrigado por tudo até aqui!

Acabou de chegar meu livro Use a cabeça! C#, 796 páginas, vou dar uma estudada aqui e aprender mais de C#, não posso ficar na dependência desses programinhas supervisórios.

 

Falou

Link para o comentário
Compartilhar em outros sites

@chacalgbi

 

 

Eu lembro que você modificou o terminador de linha para '\n', certo? Mantenha como havia postado na minha outra mensagem:

printf(usb_cdc_putc,"%u\r\n",x);

Você até poderia alterar para outro terminador, mas teria também que setar a propriedade SerialPort.NewLine para o terminador a ser usado. O padrão no Windows é o '\r\n' (CRLF). Melhor manter o padrão.

 

 

Acho que essa exceção ocorreu em função desse detalhe agora.

 

 

 

 

[ ]'s

LNW

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Cara, deu certo!!

 

Coloquei o \r\n e funcionou legal.

actkZBc.jpg

 

Agora vou te alugar mais um pouquinho.... gostaria que você me explicasse o funcionamento desses código que você alterou...

 

E outra coisa, se eu fosse rereber dados de duas ou mais variável, como ficaria? Como eu desmembraria uma única informação que vem da porta serial em dois textbox diferentes?

 

Ex:   printf(usb_cdc_putc,"V=%u T=%u\r\n",x,y);

 

Onde V teoricamente seria uma Tensão e T seria uma temperatura.

 

Tem como receber números fracionários? Ex: 35,4

 

 

Desculpe tanta pergunta, é que notei que você tem muito conhecimento e no momento não tenho a quem recorrer... rsrs

 

Falou!

Link para o comentário
Compartilhar em outros sites

Olá @chacalgbi

 

 

E outra coisa, se eu fosse rereber dados de duas ou mais variável, como ficaria? Como eu desmembraria uma única informação que vem da porta serial em dois textbox diferentes?

 

Ex:   printf(usb_cdc_putc,"V=%u T=%u\r\n",x,y);

 

Onde V teoricamente seria uma Tensão e T seria uma temperatura.

 

Tem como receber números fracionários? Ex: 35,4

 

 

A principal alteração foi que eu criei um delegate passando a string (um objeto) como argumento para atualizar o TextBox no Form1. Para compreender bem isso aí, seria interessante ter um background sobre o conceito de threading. Para exemplificar de forma bem simples, digamos que o Form1 roda no contexto A e o componente SerialPort no contexto B, em paralelo. Eu não posso chamar um método ou setar uma propriedade de um controle no contexto A a partir do contexto B. Isso tem que ser delegado a um método que faça isso de maneira segura. No código original, isso também é feito, usando o delegate pré-definido do sistema EventHandler. A assinatura padrão dele é a seguinte:

public delegate void EventHandler(Object sender, EventArgs e)

Note que o método a ser chamado (DisplayText) possui a mesma assinatura:

private void DisplayText(object sender, EventArgs e)

E, na verdade, o código original deveria ter funcionado também. A única coisa ali que não gostei muito foi daquela variável RxString declarada daquela forma. Creio que o delay (Thread.Sleep(400)) adicionado e o terminador (\r\n) corrigido resolvessem o problema no primeiro código. Você poderia fazer um teste aí, Chacal.

 

Não fique muito preocupado se não entender de imediato esses conceitos acima. Realmente é bem complexo e demanda estudo. É algo que ainda não tenho pleno domínio.

 

 

 

Com relação a outra dúvida, querendo passar dois valores, acho que uma boa opção seria fazer algo como:

printf(usb_cdc_putc,"%u,%u\r\n",x,y);

Isso chegaria como por exemplo:

 

"25,77"

 

 

Dentro do programa ficaria mais fácil para quebrar essa string e obter os valores separadamente. Dica: dê uma olhada no método Split da classe String: http://msdn.microsoft.com/en-us/library/System.String.Split%28v=vs.110%29.aspx

 

A vírgula aí seria o separador dos valores. Poderia usar outro caractere também.

 

 

 

Desculpe pela demora, estou meio enrolado por aqui...

 

 

[ ]'s

LNW

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@chacalgbi

 

Se quiser ler sobre esse assunto do padrão de ponto flutuante e a diferença entre o padrão internacional e o usado pela Microchip:

 

http://pt.wikipedia.org/wiki/IEEE_754

http://en.wikipedia.org/wiki/IEEE_floating_point

 

Esse artigo abaixo exemplifica exatamente o que pode ocorrer se você envia uma variável com vírgula para o PC direto. Ele não vai compreender o que é.

http://blog.happylot.net/2012/01/mikro-c-floating-point-from-microchip.html

http://floating-point-gui.de/formats/fp/

http://ww1.microchip.com/downloads/en/AppNotes/00575.pdf

http://ww1.microchip.com/downloads/en/AppNotes/00670b.pdf

 

EDIT:

 

Boa resposta @LNW !

 

Gosto muito de brincar no C#. Mas não sei muita coisa. O básico mesmo. Sempre quando tenho dúvidas, o stackoverflow ajuda muito. Ele é bem especializado no assunto.

 

Muitas pessoas não gostam do Visual Studio. Mas pelo que tenho visto, lido, é uma linguagem bem poderosa da MS e que a mesma usa bastante hj. Só ver os aplicativos para Windows Phone e tal....

 

Falou

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

Cara, deu certo!!

 

Coloquei o \r\n e funcionou legal.

actkZBc.jpg

 

Agora vou te alugar mais um pouquinho.... gostaria que você me explicasse o funcionamento desses código que você alterou...

 

E outra coisa, se eu fosse rereber dados de duas ou mais variável, como ficaria? Como eu desmembraria uma única informação que vem da porta serial em dois textbox diferentes?

 

Ex:   printf(usb_cdc_putc,"V=%u T=%u\r\n",x,y);

 

Onde V teoricamente seria uma Tensão e T seria uma temperatura.

 

Tem como receber números fracionários? Ex: 35,4

 

 

Desculpe tanta pergunta, é que notei que você tem muito conhecimento e no momento não tenho a quem recorrer... rsrs

 

Falou!

E ai jovem! Teria como postar como ficou o código em c para gravar no 18f4550 e também o código C# para que eu possa analisar e tentar entender o que foi feito?

Link para o comentário
Compartilhar em outros sites

  • 3 meses depois...
Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!