Datenumrechnung C#

Gast #4257577
Lesenswert?

Hallo,
mit dem cypress FX3 möchte ich Daten von einem 16 Bit ADC auslesen. 
Dieser hat einen Spannungsbereich von 2.25 V.
Die Daten sollen auf dem PC abgespeichert werden.
Von Cypress habe ich dazu eine .exe bekommen die die Werte in ein txt 
file ablegt. Das Problem ist, dass die Umrechnung nicht ganz 
funktioniert. Wenn ich an den ADC 2.25 V anlege erwarte ich ja 7FFF oder 
0 und 15 1er da er es im 2er komplement ausgibt, also dezimal 32767. In 
der text datei steht jedoch 127 255 was quasi dem 16 Bit Wert in 2 Bytes 
aufgeteilt und dann in dezimal umgerechnet entspricht. Ich habe das 
Programm samt Quellcode angehängt. Hat jemand eine Idee wo und wie ich 
den Code ändern muss um die richtigen Werte zu erhalten ?
Grüße
Angehängte Dateien:
Gast #4257649
Lesenswert?

so nur mal überflogen:
1
byte[] temp1 = new byte[Offset];
2

3
                    Buffer.BlockCopy(temp, 0, temp1, 0, Offset);  // copy the contents received on  temp[] to temp1[]
4
                   string res = string.Join("", temp1);  // <------ HIER ******
5
                                                                // Put all the data streamed to a single string 
6
                    string file_name = "C:\\users\\mady\\desktop\\mady.txt";    // Write the string to mady.txt
7
                    System.IO.StreamWriter objWriter;
8
                    objWriter = new System.IO.StreamWriter(file_name);  
9
                   objWriter.WriteLine(res);
10

11
                    objWriter.Close();
das müßte das doch sein was du suchst.

schauen ob Offset % 2 == 0 ist dann kannst du den nach short oder was du 
willst wandeln und ausgeben.
Gast #4257906
Lesenswert?

ich bin kein C# Programmierer aber so könnte es gehn:

http://mark-dot-net.blogspot.de/2013/03/how-to-convert-byte-to-short-or-float.html
1
//byte[] temp1 = new byte[Offset];        // <--- das weg
2
short[] temp1 = new short[(Offset+1) / 2];    // <--- das hin
3
temp1[(Offset+1) / 2]= 0;                     // <--- das hin
4

5
Buffer.BlockCopy(temp, 0, temp1, 0, Offset);  // copy the contents received on  temp[] to temp1[]
6

7
string res = string.Join("", temp1);  // <------ HIER ******
8
                                      // Put all the data streamed to a single string 
9
string file_name = "C:\\users\\mady\\desktop\\mady.txt";    // Write the string to mady.txt
10
System.IO.StreamWriter objWriter;
11
objWriter = new System.IO.StreamWriter(file_name);  
12
objWriter.WriteLine(res);
13

14
objWriter.Close();

das '(Offset+1) / 2' soll heißen
Wenn Offset gerade ist, ist auch das Ergebnis gerade
Wenn Offset ungerade ist, wird das Ergebnis gerade.
ABER:
Wenn offset ungerade war, dann fehlt dir ein Wert, darum die eine Init 
im letzten Element mit '0'. Da mußt DU dir was einfallen lassen.

ich hoffe es geht.(nicht getestet!!!!)
#4259327
Lesenswert?

Hallo,

so geht es noch einfacher:

        private static int StringToInt(string value)
        {
            var result = 0;

            if (!int.TryParse(value, out result))
            {
                result = 0;
            }
            return result;
        }

        static void Main(string[] args)
        {
            var text = "127 255";
            var valueList = text.Split(' ');
            var value1 = StringToInt(valueList[0]);
            var value2 = StringToInt(valueList[1]);
            var result = (value2 << 8 + value1);
            var textResult = string.Format("Hex: {0:X}", result);
            Console.WriteLine(textResult);
        }


Gruß
Frank
Gast #4260169
Lesenswert?

Günther schrieb:
> Habe noch nicht viel Erfahrung mit Programmieren. Aber ich
> denke die Lösung ist relativ simpel.

Gut, dass du das mit deinem Wissensstand beurteilen kannst. Natürlich 
ist die Lösung simpel, wenn man eine Vorstellung von Zahlendarstellungen 
und -systemen hat. Deine beiden Zahlen (127 und 255) sind wie zwei 
Ziffern im 256er-System zu lesen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren