Página 1 de 1

Lentidão na atualização de dados

MensagemEnviado: 24 Nov 2016 08:29
por rosiley
Bom dia pessoal, estou com problema que está me tirando o sono. Fiz o meu aplicativo C# baseado no livro do Carlos Eduardo Sandrini " Criação de sistemas supervisórios em Visual C# 2010 Express" e estou usando o ccs para criação do firmware, montei o circuito e tudo funciona bem, faço os testes com o hyperterminal e a velocidade dos dados (rx tx) estão muito bons mais quando coloco para comunicar com o software o mesmo demora em torno de 20 segundos para atualizar os dados isto na recepção pois na transmissão está normal, segue a parte que faz o tratamento da recepção serial.Código CCS e C#.

cpp code
/*==============================================================================
CANAL 0 PIN 2 ANALOGUE INPUT 1
==============================================================================*/
void ADCinput0()
{
set_adc_channel(0);
delay_us(20);
ADinput0 = READ_ADC();
AD0 = (ADinput0 * 5000) /1023;
printf("A0:%4lu",AD0); //Envia dados de conversão A/D para exibir tensão
printf(":");
}
/*==============================================================================
CANAL 1 PIN 3 ANALOGUE INPUT 2
==============================================================================*/
void ADCinput1()
{
set_adc_channel(1);
delay_us(20);
ADinput1 = READ_ADC();
AD1 = (ADinput1 * 5000) /1023;
printf("A1:%4lu",AD1); //Envia dados de conversão A/D para exibir tensão
printf(":");
}
/*==============================================================================
CANAL 2 PIN 4 ANALOGUE INPUT 3
==============================================================================*/
void ADCinput2()
{
set_adc_channel(2);
delay_us(20);
ADinput2 = READ_ADC();
AD2 = (ADinput2 * 5000) /1023;
printf("A2:%4lu",AD2); //Envia dados de conversão A/D para exibir tensão
printf(":");
}
/*==============================================================================
CANAL 3 PIN 5 ANALOGUE INPUT 4
==============================================================================*/
void ADCinput3()
{
set_adc_channel(3);
delay_us(20);
ADinput3 = READ_ADC();
AD3 = (ADinput3 * 5000) /1023;
printf("A3:%4lu",AD3); //Envia dados de conversão A/D para exibir tensão
printf(":");
}
/*==============================================================================
CANAL 4 PIN 7 ONBOARD TEMPERATURE SENSOR
==============================================================================*/
void ADCinput4()
{
set_adc_channel(4);
delay_us(20);
ADinput4 = READ_ADC();
AD4 = (ADinput4 * 5000)/1023;
printf("A4:%4lu",AD4); //Envia dados de conversão A/D para exibir tensão
printf(":");
}
/*==============================================================================
CANAL 5 PIN 8 SENSORS SUPLLY MONITOR
==============================================================================*/
void ADCinput5()
{
set_adc_channel(5);
delay_us(20);
ADinput5 = READ_ADC();
AD5 = (ADinput5 * 1500) /1023;
printf("A5:%4lu",AD5); //Envia dados de conversão A/D para exibir tensão
printf(":");
}
/*==============================================================================
CANAL 6 PIN 9 BOARD SUPPLY MONITOR
==============================================================================*/
void ADCinput6()
{
set_adc_channel(6);
delay_us(20);
ADinput6 = READ_ADC();
AD6 = (ADinput6 * 3700) /1023;
printf("A6:%4lu",AD6); //Envia dados de conversão A/D para exibir tensão
printf(":");
}
/*==============================================================================
CANAL 7 PIN 10 0-5V ANALOGUE/DIGITAL INPUT 5
==============================================================================*/
void ADCinput7()
{
set_adc_channel(7);
delay_us(20);
ADinput7 = READ_ADC();
AD7 = (ADinput7 * 5000) /1023;
printf("A7:%4lu",AD7); //Envia dados de conversão A/D para exibir tensão
printf(":");
printf("%d%d%d%d%d\r\n",RB0,RB1,RB2,RD4,RD5);
}


csharp code
public FormMain()
{
InitializeComponent();
SerialCom.DataReceived += new SerialDataReceivedEventHandler(SerialCom_DataReceived);
}

void SerialCom_DataReceived(object sender, System.IO.Ports.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;

txtRec.Text += a;
if (txtRec.Text.Length > 776)
{
txtRec.Clear();
}

txt_rec += a;

if (txt_rec.Length >= 80)
{
txtSplit = txt_rec.Split(':');
txt_rec = string.Empty;

if (txtSplit[0] == "A0")
{
txt_list = txtSplit[0] + ":" + txtSplit[1] + ":" + txtSplit[2] + ":" + txtSplit[3] + ":" + txtSplit[4] + ":" + txtSplit[5]
+ ":" + txtSplit[6] + ":" + txtSplit[7] + ":" + txtSplit[8] + ":" + txtSplit[9] + ":" + txtSplit[10]
+ ":" + txtSplit[11] + ":" + txtSplit[12] + ":" + txtSplit[13] + ":" + txtSplit[14] + ":" + txtSplit[15]
+ ":" + txtSplit[16] + ":" + txtSplit[17] + ":" + txtSplit[18] + ":" + txtSplit[19];

txtSensor1.Text = txtSplit[1];
txtSensor2.Text = txtSplit[3];
txtSensor3.Text = txtSplit[5];
txtSensor4.Text = txtSplit[7];
txtAnalogDiag1.Text = txtSplit[9];
txtAnalogDiag2.Text = txtSplit[11];
txtAnalogDiag3.Text = txtSplit[13];
txtAnalogDiag4.Text = txtSplit[15];
txtAnalogDiag5.Text = txtSplit[17];
txtAnalogDiag6.Text = txtSplit[19];

txt_rec = string.Empty;

//Verifica RB0
if (txtSplit[16].Substring(0, 1) == "1")
{
zero = true;
}else{
zero = false;
}

//Verifica RB1
if (txtSplit[16].Substring(1, 1) == "1")
{
lBfT = true;
}else{
lBfT = false;
}

//Verifica RB2
if (txtSplit[16].Substring(2, 1) == "1")
{
water = true;
WaterBut.BackColor = Color.Red;
}else{
water = false;
WaterBut.BackColor = Color.Green;
}

//Verifica RD4 / RD5
if (txtSplit[16].Substring(3, 1) == "1")
{
pictureBox1.BackColor = Color.Red;
label6.Text = "Low Batt";
label6.ForeColor = Color.Red;
low = true;
}else{
pictureBox1.BackColor = Color.Green;
label6.Text = "Power Ok";
label6.ForeColor = Color.Green;
high = true;
}
}
}
}

Re: Lentidão na atualização de dados

MensagemEnviado: 24 Nov 2016 11:46
por andre_luis
O problema parece estar realmente no lado do aplicativo no PC.
Sou novato em C#, mas talvez pudesse tentar utilizar o método .update() ou .refresh() em algum lugar, caso fosse extensivel ás classes usadas acima.

No C++ BorlandBuilder tinha o processmessages() que atualizava a tela por exemplo, e tornava mais rapido a atualização de graficos.

A propósito, á que taxa voce está enviando dados para o PC ( bytes por segundo ).
Pode ser também que o programa esteja esperando preencher o buffer completamente, enfim...

Re: Lentidão na atualização de dados

MensagemEnviado: 24 Nov 2016 12:12
por rosiley
Caro D_Word.

Testei com este código e consegui uma resposta em tempo real é claro fazendo as devidas modificações, o código o colega Victor santos disponibilizou no youtube, mais pelo codigo dele eu não consigo ter todas as informações necessárias, segue.

Código: Selecionar todos
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;

namespace AppIHMSimples
{
    public partial class Form1 : Form
    {
        delegate void funcaoRecepcao();

        public Form1()
        {
            InitializeComponent();

            serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
        }

        void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            funcaoRecepcao recepcaodelegate = new funcaoRecepcao(RecepcaoSerial);
            Invoke(recepcaodelegate);
        }

        String chtxt = null, str = null;
        long tempox = 0;
        bool flagTIME = false;
        public void RecepcaoSerial()
        {
            chtxt += serialPort1.ReadExisting();
            txtRec.Text += chtxt;
            str += chtxt;
            chtxt = null;
                  //01234567
            //Texto [LeD1ON] ou [LeD1OF]
            //Texto [A10000]
            //Texto [TIMEOK]

            if (txtRec.Text.Length > 776)
            {
                txtRec.Clear();
            }

            if (str.Substring(0, 1).Equals("["))
            {
                if (str.Length >= 8)
                {
                    if (str.Substring(1, 1).Equals("L") &&
                       str.Substring(2, 1).Equals("e") &&
                       str.Substring(3, 1).Equals("D") &&
                       str.Substring(5, 1).Equals("O") &&
                       str.Substring(7, 1).Equals("]"))
                    {
                        if (str.Substring(6, 1).Equals("N"))
                        {
                            switch (str.Substring(4, 1))
                            {
                                case "1": pnlLed1.BackColor = Color.Red;
                                    break;
                                case "2": pnlLed2.BackColor = Color.Red;
                                    break;
                                case "3": pictureBox1.Image = AppIHMSimples.Properties.Resources.Lamp_ON;
                                    break;
                            }
                        }
                        else
                        {
                            if (str.Substring(6, 1).Equals("F"))
                            {
                                switch (str.Substring(4, 1))
                                {
                                    case "1": pnlLed1.BackColor = Color.Maroon;
                                        break;
                                    case "2": pnlLed2.BackColor = Color.Maroon;
                                        break;
                                    case "3": pictureBox1.Image = AppIHMSimples.Properties.Resources.Lamp_OFF;
                                        break;
                                }
                            }
                        }

                        str = null;
                    }
                    else
                    {
                        if (str.Substring(1, 1).Equals("A") && str.Substring(7, 1).Equals("]"))
                        {
                            if (str.Substring(2, 1).Equals("1"))
                            {
                                lblSensor1.Text = str.Substring(3, 4);
                                pgBar1.Value = int.Parse(str.Substring(3, 4));

                                if (chartSensores.Series[0].Points.Count > 8)
                                {
                                    chartSensores.Series[0].Points.RemoveAt(0);
                                    chartSensores.Update();
                                }

                                chartSensores.Series[0].Points.AddXY(tempox, int.Parse(str.Substring(3, 4)));


                            }
                            else
                            {
                                if (str.Substring(2, 1).Equals("2"))
                                {
                                    lblSensor2.Text = str.Substring(3, 4);
                                    pgBar2.Value = int.Parse(str.Substring(3, 4));

                                    if (chartSensores.Series[1].Points.Count > 8)
                                    {
                                        chartSensores.Series[1].Points.RemoveAt(0);
                                        chartSensores.Update();
                                    }

                                    chartSensores.Series[1].Points.AddXY(tempox, int.Parse(str.Substring(3, 4)));
                                }
                            }

                            tempox++;
                            str = null;
                        }//
                        else
                        {
                            if (  str.Substring(1, 1).Equals("T") &&
                                  str.Substring(2, 1).Equals("I") &&
                                  str.Substring(3, 1).Equals("M") &&
                                  str.Substring(4, 1).Equals("E") &&
                                  str.Substring(5, 1).Equals("O") &&
                                  str.Substring(6, 1).Equals("K") &&
                                  str.Substring(7, 1).Equals("]") )
                            {
                                flagTIME = false;
                                str = null;
                            }
                        }
                    }

                    str = null;
                }
            }else
            {
                str = null;
            }
        }



        private void btnExit_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            #region Config_Port
            String[] valoresPort = SerialPort.GetPortNames();
            for (int i = 0; i < valoresPort.Length; i++)
            {
                cbBoxPort.Items.Add(valoresPort[i]);
            }
            cbBoxPort.Text = "COM1";
            #endregion

            #region Config_Baud
            int[] valoresBaud = { 2400, 4800, 9600, 19200, 57600, 115200 };
            for (int i = 0; i < valoresBaud.Length; i++)
            {
                cbBoxBaud.Items.Add(valoresBaud[i].ToString());
            }
            cbBoxBaud.Text = "9600";
            #endregion

            #region Config_Data
            cbBoxData.Items.Add("7");
            cbBoxData.Items.Add("8");
            cbBoxData.Text = "8";
            #endregion

            #region Config_Stop
            cbBoxStop.Items.Add("None");
            cbBoxStop.Items.Add("One");
            cbBoxStop.Items.Add("two");
            cbBoxStop.Text = "One";
            #endregion

            #region Config_Parity
            cbBoxParity.Items.Add("NONE");
            cbBoxParity.Items.Add("EVEN");
            cbBoxParity.Items.Add("ODD");
            cbBoxParity.Items.Add("MARK");
            cbBoxParity.Items.Add("SPACE");
            cbBoxParity.Text = "NONE";
            #endregion

        }

        private void btnCon_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen == true) serialPort1.Close();
            else
            {
                serialPort1.PortName = cbBoxPort.Text;
                serialPort1.BaudRate = int.Parse(cbBoxBaud.Text);
                serialPort1.DataBits = int.Parse(cbBoxData.Text);
                serialPort1.StopBits = (StopBits)(cbBoxStop.SelectedIndex);
                serialPort1.Parity = (Parity)(cbBoxParity.SelectedIndex);
            }

            try
            {
                serialPort1.Open();
                btnCon.Enabled = false;
                btnDes.Enabled = true;
                btnExit.Enabled = false;
                cbBoxPort.Enabled = false;
                cbBoxBaud.Enabled = false;
                cbBoxData.Enabled = false;
                cbBoxStop.Enabled = false;
                cbBoxParity.Enabled = false;
                pnlMsg.BackColor = Color.Green;
                lblMsg.Text = "Close Port";
                timer1.Start();
                serialPort1.Write("[Start!]");
            }
            catch
            {
                MessageBox.Show("Erro de comunicação com a porta!!");
                btnCon.Enabled = true;
                btnDes.Enabled = false;
                btnExit.Enabled = true;
                cbBoxPort.Enabled = true;
                cbBoxBaud.Enabled = true;
                cbBoxData.Enabled = true;
                cbBoxStop.Enabled = true;
                cbBoxParity.Enabled = true;
                pnlMsg.BackColor = Color.Red;
                lblMsg.Text = "Open Port";
            }

        }

        private void btnDes_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.Write("[Stop!!]");
                timer1.Stop();
                serialPort1.Close();
                btnCon.Enabled = true;
                btnDes.Enabled = false;
                btnExit.Enabled = true;
                cbBoxPort.Enabled = true;
                cbBoxBaud.Enabled = true;
                cbBoxData.Enabled = true;
                cbBoxStop.Enabled = true;
                cbBoxParity.Enabled = true;
                pnlMsg.BackColor = Color.Red;
                lblMsg.Text = "Open Port";
                pgBar1.Value = 0;
                pgBar2.Value = 0;
                lblSensor1.Text = "0000";
                lblSensor2.Text = "0000";
                tempox = 0;
                chartSensores.Series[0].Points.Clear();
                chartSensores.Series[1].Points.Clear();
                pnlLed1.BackColor = Color.Maroon;
                pnlLed2.BackColor = Color.Maroon;
                pictureBox1.Image = AppIHMSimples.Properties.Resources.Lamp_OFF;
                BarPWM.Value = 0;
                contTIME = 0;
                flagTIME = false;
            }
            catch
            {
                MessageBox.Show("Erro de comunicação com a porta !!");
                btnCon.Enabled = false;
                btnDes.Enabled = true;
                btnExit.Enabled = false;
                cbBoxPort.Enabled = false;
                cbBoxBaud.Enabled = false;
                cbBoxData.Enabled = false;
                cbBoxStop.Enabled = false;
                cbBoxParity.Enabled = false;
                pnlMsg.BackColor = Color.Green;
                lblMsg.Text = "Close Port";
            }
        }

        private void btnEnviar_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen == true)
            {
                if (chBoxEnviar.Checked)
                {
                    serialPort1.Write(txtEnviar.Text + "\r");
                }
                else
                {
                    serialPort1.Write(txtEnviar.Text);
                }

                txtEnviar.Text = null;
            }
            else
            {
                MessageBox.Show("Erro de comunicação com a porta!!");
            }
        }

        private void btnApagar_Click(object sender, EventArgs e)
        {
            txtRec.Text = null;
        }

        //Texto [Botao1]
        private void btnBotao1_Click(object sender, EventArgs e)
        {
            if(serialPort1.IsOpen == true) serialPort1.Write("[Botao1]");
        }

        //Texto [Botao2]
        private void btnBotao2_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen == true) serialPort1.Write("[Botao2]");
        }

        //Texto [Botao3]
        private void pictureBox1_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen == true)
            {
                serialPort1.Write("[Botao3]");
            }
        }

        //[PWM250]
        private void BarPWM_Scroll(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen == true)
            {
                int valorPWM = BarPWM.Value * 50;
                if (valorPWM >= 100) serialPort1.Write("[PWM" + valorPWM.ToString() + "]");
                else
                    if (valorPWM >= 50) serialPort1.Write("[PWM0" + valorPWM.ToString() + "]");
                    else
                        serialPort1.Write("[PWM00" + valorPWM.ToString() + "]");
            }
        }

        //[TIMEOK]
        int contTIME = 0;
        private void timer1_Tick(object sender, EventArgs e)
        {
            contTIME++;
            if (contTIME >= 40)
            {
                if (flagTIME == false)
                {
                    serialPort1.Write("[TIMEOK]");
                    contTIME = 0;
                }
                else
                {
                    serialPort1.Write("[Stop!!]");
                    timer1.Stop();
                    serialPort1.Close();
                    btnCon.Enabled = true;
                    btnDes.Enabled = false;
                    btnExit.Enabled = true;
                    cbBoxPort.Enabled = true;
                    cbBoxBaud.Enabled = true;
                    cbBoxData.Enabled = true;
                    cbBoxStop.Enabled = true;
                    cbBoxParity.Enabled = true;
                    pnlMsg.BackColor = Color.Red;
                    lblMsg.Text = "Open Port";
                    pgBar1.Value = 0;
                    pgBar2.Value = 0;
                    lblSensor1.Text = "0000";
                    lblSensor2.Text = "0000";
                    tempox = 0;
                    chartSensores.Series[0].Points.Clear();
                    chartSensores.Series[1].Points.Clear();
                    pnlLed1.BackColor = Color.Maroon;
                    pnlLed2.BackColor = Color.Maroon;
                    pictureBox1.Image = AppIHMSimples.Properties.Resources.Lamp_OFF;
                    BarPWM.Value = 0;
                    contTIME = 0;
                    flagTIME = false;
                    MessageBox.Show("ERRO TIME");
                }
            }
            else
            {
                if (contTIME == 20)
                {
                    serialPort1.Write("[TIMEOK]");
                    flagTIME = true;
                }
            }
        }

        private void cbBoxPort_Click(object sender, EventArgs e)
        {
            cbBoxPort.Items.Clear();
            String[] valoresPort = SerialPort.GetPortNames();
            for (int i = 0; i < valoresPort.Length; i++)
            {
                cbBoxPort.Items.Add(valoresPort[i]);
            }
        }

    }
}

Re: Lentidão na atualização de dados

MensagemEnviado: 24 Nov 2016 14:33
por andre_luis
Fico feliz que tenha conseguido resolver.

De qualquer modo, tentando entender a logica do problema anterior, esse aí utiliza o método citado anteriormente. Pode ser que o programa do Vitor fosse apenas parte do projeto, e em alguma outra parte do programa estivesse sendo instanciado o update forçado dos processos. Enfim, caso resolvido...

Re: Lentidão na atualização de dados

MensagemEnviado: 24 Nov 2016 17:30
por rosiley
Como o Andre falou.
Fico feliz que tenha conseguido resolver.

De qualquer modo, tentando entender a logica do problema anterior, esse aí utiliza o método citado anteriormente. Pode ser que o programa do Vitor fosse apenas parte do projeto, e em alguma outra parte do programa estivesse sendo instanciado o update forçado dos processos. Enfim, caso resolvido...


Informo que ainda não foi resolvido, já consigo ler em tempo real os valores do adc mas preciso ainda receber informação dos sensores nas entradas digitais RB0,RB1,RB2,RD4,RD5) como pode ser visto abaixo, não sei se consegui explicar direito.

Código: Selecionar todos
                //Verifica RB0 Se acionado manda informação pro supervisorio
                if (str.Substring(2, 1).Equals("3"))
                    {
                    zero = true;
                    }
                     else
                   {
                    zero = false;
                    }
 
                //Verifica RB1 Se acionado manda informação pro supervisorio
                if (str.Substring(2, 1).Equals("4"))
                    {
                    lBfT = true;
                    }
                    else
                   {
                    lBfT = false;
                    }
 
                //Verifica RB2 Se acionado infroma ao supervisorio alarmando na tela
                 if (str.Substring(2, 1).Equals("5"))
                    {
                      water = true;
                      WaterBut.BackColor = Color.Red;
                    }
                     else
                    {
                      water = false;
                      WaterBut.BackColor = Color.Green;
                    }
 
                //Verifica RD4 / RD5 Informa na tela do supervisorio se a fonte está com o nivel acima ou abaixo do setado
                if (str.Substring(2, 1).Equals("6"))
                        {
                            txtAnalogDiag1.Text = str.Substring(3, 4);// Board Supply 24V

                            if (str.Substring(2, 1).Equals("6"))
                            {
                                pictureBox1.BackColor = Color.Green;
                                label6.Text = "Power Ok";
                                label6.ForeColor = Color.Green;
                                high = true;
                            }
                            else
                            {
                                pictureBox1.BackColor = Color.Red;
                                label6.Text = "Low Batt";
                                label6.ForeColor = Color.Red;
                                low = true;
                            }
                        }

Re: Lentidão na atualização de dados

MensagemEnviado: 25 Nov 2016 08:20
por andre_luis
Informo que ainda não foi resolvido,


Bom, pelo que voce havia postado anteriormente, agora quem não entendeu fui eu...

Testei com este código e consegui uma resposta em tempo real é claro fazendo as devidas modificações

Re: Lentidão na atualização de dados

MensagemEnviado: 25 Nov 2016 11:13
por rosiley
Caro Andre.

Realmente eu recebo as informações do adc em temppo real mais preciso receber tambem as informações dos sensores ligados nas entradas digitais (RB0,RB1,RB2,RD4,RD5)
como falei anteriormente, eu tenho uma chave ligado no rb0, rb1 e rb2 esses executam um comando e enviam informação para o soft que foi executada rd4 e rd5 indicam via leds e informação no soft se a tensão da bateria está normal ou baixa ( 8,9 v a 12 v) e tambem informa ao soft essa função aparecendo no soft bateria baixa ou normal atraves de um picture box. E é isto que não estou conseguindo fazer o resto está até o momento tudo legal.