2016-03-29 19 views
0

Ich arbeite derzeit an einem Master/Slave, wo der Master ein C# -Programm und der Slave ein Arduino Uno ist. Der Arduino liest mehrere Werte und funktioniert wie erwartet, aber ich habe einige Probleme auf der C# -Seite. Ich lese 3 Bytes von einem AD-Wandler (AD7680), der 3 Datenbytes zurückgibt, die wie folgt strukturiert sind:C# und Arduino Master/Slave lesen 3 Bytes von AD

0000 | 16 Bit Nummer | 0000

Mein C# -Programm liest den zurückgegebenen Wert in einem Double, was der erwartete Wert ist. Aber ich habe nicht herausgefunden, wie ich die letzten vier Nullen loswerden und die 2-Byte-Zahl erhalten kann, die ich brauche.

Was sollte der beste Ansatz sein, um den richtigen Wert zu erhalten, ohne Daten zu verlieren? Ich habe 'BitConverter' versucht, aber es ist nicht das, was ich erwarte, und ich habe keine Ahnung, wie es weitergeht. Momentan kann ich den Code leider nicht anhängen, aber ich könnte bei Bedarf alles darauf beziehen.

Danke fürs Lesen!

EDIT: Dies ist die Funktion auf der C# Seite:

public double result(byte[] command)  
    { 
     try 
     { 
      byte[] buffer = command; 
      arduinoBoard.Open(); 
      arduinoBoard.Write(buffer, 0, 3); 
      int intReturnASCII = 0; 
      char charReturnValue = (Char)intReturnASCII; 
      Thread.Sleep(200); 
      int count = arduinoBoard.BytesToRead; 
      double returnResult = 0; 
      string returnMessage = ""; 
      while (count > 0) 
      { 
       intReturnASCII = arduinoBoard.ReadByte(); 
       //string str = char.ConvertFromUtf32(intReturnASCII); 

       returnMessage = returnMessage + Convert.ToChar(intReturnASCII); 

       count--; 
      } 

      returnResult = double.Parse(returnMessage, System.Globalization.CultureInfo.InvariantCulture); 
      arduinoBoard.Close(); 
      return returnResult; 
     } 
     catch (Exception e) 
     { 
      return 0; 
     } 

    } 

und die Funktion Arduino, die mit ihm in Verbindung steht dieses ist:

unsigned long ReturnPressure(){ 
long lBuffer = 0; 
byte rtnVal[3]; 
digitalWrite(SLAVESELECT , LOW); 
delayMicroseconds(1); 

rtnVal[0] = SPI.transfer(0x00); 
delayMicroseconds(1); 
rtnVal[1] = SPI.transfer(0x00); 
delayMicroseconds(1); 
rtnVal[2] = SPI.transfer(0x00); 
delayMicroseconds(1); 
digitalWrite(SLAVESELECT, HIGH); 
// assemble into long type 
lBuffer = lBuffer | rtnVal[0]; 
lBuffer = lBuffer << 8; 
lBuffer = lBuffer | rtnVal[1]; 
lBuffer = lBuffer << 8; 
lBuffer = lBuffer | rtnVal[2]; 

return lBuffer; 
} 
+1

Bitte zeigen Sie, wie Sie die Daten aus dem Arduino in Ihrem C# -Code erhalten ... ist es seriell? – Fruchtzwerg

+0

In einem Doppel? Wie kannst du das in einem Doppel lesen? Verwenden Sie ein Byte-Array, um die drei Bytes zu speichern, fügen Sie sie dann in ein 32-Bit-int ein und verschieben Sie am Ende den Wert. Und, am wichtigsten, 'Bitte zeigen Sie, wie Sie die Daten aus dem Arduino in Ihrem C# -Code erhalten ' – frarugi87

+0

@Fruchtzwerg Es ist serielle Kommunikation ja ... Ich habe die Hauptfrage mit dem angeforderten Code bearbeitet. Ich verwende Double auf der C# -Seite, da diese Funktion auch Arduino für andere Parameter aufruft, die von verschiedenen Sensoren gelesen werden, und daher brauche ich den numerischen Wert, den sie lesen. Ich könnte auch eine neue Funktion dafür erstellen, aber ich habe versucht, diese zu vereinfachen. Danke für die Unterstützung! – user2783511

Antwort

0

Okay, haben Sie ein paar Schritte zu tun zum einen

: Es ist viel einfacher, die Bytes in einem Array wie folgt zu speichern:

byte Received = new byte[3]; 
for(int i = 0; i < 3; i++) 
{ 
    Received[i] = (byte)arduinoBoard.ReadByte(); 
} 

Nachdem die drei empfangenen Bytes, es verschieben zusammen (überprüfen, ob die drei Bytes in der richtigen Reihenfolge sind: Höherwertiges Byte ist hier bei Index 0)

UInt64 Shifted = (UInt64)(Received[0] << 16) | (UInt64)(Received[1] << 8) | (UInt64)(Received[0]) 

Nun sind die vier endend Nullen herauszuschieben:

UInt64 Shifted = Shifted >> 4; 

Um herauszufinden, was Ihre Spannung ist, müssen Sie die Größe Ihres Konverters kennen. Die Data sheet sagt, "Die LSB-Größe ist VDD/65536". Sie könnten eine konstante

const double VDD = 5; //For example 5V 

Danach definieren Sie Ihre benötigten Doppel mit

return Shifted * (VDD/65539); //Your voltage 

hoffe, das hilft berechnen kann.

+0

Ja das war genug, danke! – user2783511