none
Problemas lectura alta velocidad usando SerialPort RRS feed

  • Pregunta

  • Buenos días, tengo problemas al ller a ciertas velocidades, no sé si es problema de que se satura el buffer (creo que es este el problema) o de ambas cosas.

    Estos son fragmentos de mi código

    //configuracion del puerto
    serialPort.PortName = porta;
    serialPort.BaudRate = 115200;
    serialPort.DataBits = 8;
    serialPort.ReadBufferSize = 409600;
    serialPort.Open();
    CrearTramaConect();
    serialPort.Write(TramaConect, 0, TramaConect.Length);


     void serialPort_DataReceived(object s, SerialDataReceivedEventArgs e)
    {
    
     while (serialPort.BytesToRead >= 14)
         {    
           
          for (int i = 0; i < 14; i++)
          {
              data[i] = (byte)serialPort.ReadByte();
          }
    
           if (data[13] == (byte)'F')
               {
    
                 data.ToList().ForEach(b => recievedData.Enqueue(b));
                 processData();
                 //trato los datos en este metodo 
                 LineReceived(this, new LineReceivedEventArgs(packet));
    
                }else{
    
                      while ((charend != (byte)'F') && serialPort.BytesToRead != 0))
                       charend = (byte)serialPort.ReadByte();
    
                }
         }
    }


    public event LineReceivedEventHandler LineReceived;
    
    sp1.LineReceived += new LineReceivedEventHandler(sp1_LineReceived);
    
    
    void sp1_LineReceived(object sender, LineReceivedEventArgs Args)
            {
    
                this.Invoke((MethodInvoker)(()=>cargarDatosEnSerie(sender,Args)));
    
            }


    private void cargarDatosEnSerie(object sender, LineReceivedEventArgs Args)
           {
    
             this.Invoke((MethodInvoker)(() => addPoints(new Dato(Args.packet, false, false, 1, false, false,j))) );
    
             dataGridView1.Update();
    
             label1.Text = "numero de puntos: " + j;
             this.Refresh();
    
           }
    byte[] packet;
            private byte[] processData()
            {
                // Determine if we have a "packet" in the queue
               
               if(recievedData.Count>=14)               
                        packet = Enumerable.Range(0, 14).Select(i => recievedData.Dequeue()).ToArray();              
                    
              
                return packet;
            }

    Estos son los metodos implicados en la lectura y trtamiento de los datos, la seria se representa en un chart, y los datos estas bindeados a una tabla (no creo que esto sea un prioblema, mi hipotesis es que el buffer se llena y se satura, hay alguna manera de liberarlo o limpiarlo?.

    Gracias a todos por la ayuda.



    • Editado legolas2024 viernes, 27 de noviembre de 2015 10:29
    viernes, 27 de noviembre de 2015 8:48

Todas las respuestas

  • Cundo uso
    while (serialPort.BytesToRead>=14)

    deja de enviar datos, si uso

    while(serialPort.readExisting()!=null)
    lee sin parar, pero pierdo el control de las tramas


    viernes, 27 de noviembre de 2015 12:02