2017-01-19 1 views
1

Ich habe kürzlich eine App erstellt, die Daten empfängt, die über UART von meinem STM-Gerät gesendet werden. Die Daten, die ich zu senden versuche, sind ein Array von Floats - float [512]. Die Daten werden als pure binary - not string gesendet. Im Allgemeinen ist die Idee 4xbyte = float.C# SerialPort - nicht alle Daten lesen senden

Ich bin mir sicher, dass die Daten, die ich sende, gut sind. Überprüft es mit Programm namens "Terminal" und dann IEEE 754 Converter. My program

In Programm wähle ich COMport aus verfügbaren und anderen Parametern. (standardmäßig sind das meine COM-Adapter-Parameter). Ich öffne die Verbindung und dann, wenn durch STM das Senden von Daten beendet wird, klicke ich auf "Odebrane", so dass es Daten in TextBox anzeigt

Das Problem ist, dass ich nicht alle Daten empfange. Und ich habe keine Ahnung, was die Ursache ist.

private List<float> lista = new List<float>(); 
private float[] fDane = new float[1024]; 

    public Form1() 
    { 
     InitializeComponent();    
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     getAvailablePorts(); 
     tb_Rx.Text = "Wprowadź parametry transmisji"; 
     cb_BaudRate.Text = "9600"; 
     cb_DataBits.Text = "8"; 
     cb_Handshake.Text = "None"; 
     cb_Parity.Text = "None"; 
     cb_StopBits.Text = "One"; 
    } 


    private void SerialP_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     SerialPort sp = (SerialPort)sender; 

     int size = sp.BytesToRead; 
     byte[] bArray = new byte[size]; 
     float[] fArray = new float[size/4]; 
     sp.Read(bArray, 0, size); 

     for (uint i = 0; i < size/4; i++) 
     { 
      fArray[i] = ByteToFloat(bArray, i); // change 4 bytes to float 
      lista.Add(fArray[i]);    
     } 

    } 

    private float ByteToFloat(byte[] input, UInt32 i) 
    { 

     byte[] Array = new[] { input[4 * i], input[4 * i + 1], input[4 * i + 2], input[4 * i + 3] }; 
     return BitConverter.ToSingle(Array, 0); 
    } 

    private void bt_transform_Click(object sender, EventArgs e) 
    { 
     float[] fDane = lista.ToArray(); 
     for(UInt32 i = 0; i < fDane.Length; i++) 
     { 
      RxPisz(fDane[i]); 

     } 
    } 

------------------------- GELÖST ----------------- ----

dataRecieved Interrupt-Handler geändert
private void SerialP_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 
      SerialPort sp = (SerialPort)sender; 
      byte[] bArray = new byte[4*numberOfSamples]; 
      float[] fArray = new float[numberOfSamples]; 


      int previouse = counterOfRecBytes; 

      counterOfRecBytes += sp.BytesToRead; 

      sp.Read(bArray, previouse, (counterOfRecBytes - previouse)); 



      if (counterOfRecBytes == 4*numberOfSamples) 
      { 
       for (uint i = 0; i < numberOfSamples; i++) 
       { 
        fArray[i] = ByteToFloat(bArray, i); // change 4 bytes to float 
        lista.Add(fArray[i]); 
       } 
       counterOfRecBytes = 0; 
      } 
     } 

Antwort

0

ich Sie denken, sind die Daten nicht an die guten Geschwindigkeit zu lesen, versuchen BaudRate von 9600 bis 19200.

+0

Nun zu ändern, habe ich versucht - es hilft nicht, . Generell kann ich meinen UART-RS232 Adapter auf verschiedene Geschwindigkeiten einstellen. Sollte nicht ** SerialPort.BytesToRead ** Größe aller Daten lesen, die ich in einem "Array" von 8-Bit-Frames sende? – Jejh

Verwandte Themen