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;
}
Bitte zeigen Sie, wie Sie die Daten aus dem Arduino in Ihrem C# -Code erhalten ... ist es seriell? – Fruchtzwerg
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
@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