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ändertprivate 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;
}
}
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