2016-03-29 12 views
0

私は現在マスタがC#プログラムであり、スレーブがArduino Unoであるマスタ/スレーブで作業しています。 Arduinoはいくつかの価値観を読んでおり、期待通りに働いていますが、私はC#側でいくつかの問題を抱えています。私は、次のように構造化された3バイトのデータを返すADコンバータ(AD7680)から3バイトを読み込んでいます。C#とArduino Master/SlaveはADから3バイト読み取る

0000 | 16ビット数| 0000

私のC#プログラムは、期待値であるdoubleで戻り値を読み取っています。しかし、私は最後の4つの0を取り除き、必要な2バイトの番号を得る方法を見つけられませんでした。

データを失うことなく適切な値を得るための最良の方法は何ですか?私は 'BitConverter'を試みましたが、それは私が期待しているものではなく、どのように進むべきかわかりません。私は現在、残念ながらコードを添付することはできませんが、必要に応じて何かを参照することができます。

読んでいただきありがとうございます!

EDIT:これは、C#側の機能である:

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

    } 

そしてそれと通信Arduinoの機能はこの1つである:

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

あなたのC#コードでarduinoからデータを受け取る方法を示してください...シリアルですか? – Fruchtzwerg

+0

ダブルで?それを二重でどのように読むことができますか?バイト配列を使用して3バイトを格納し、32ビットintに入れ、最後に値をシフトします。そして、最も重要なのは、「あなたのC#コードでarduinoからデータを受け取る方法を表示してください」 – frarugi87

+0

@Fruchtzwergそれはシリアル通信ですはい...私は質問されたコードでメインの質問を編集しました。私はC#側でdoubleを使用しています。その理由は、その関数が別のセンサーから読み込まれている他のパラメータに対してArduinoを呼び出しているため、読み込んだ数値が必要なためです。私はそれにも新しい機能を作り出すことができましたが、私はこれを単純化するように努力していました。ご支援ありがとうございます! – user2783511

答えて

0

さて、あなたはいくつかの手順を行う必要があります:まず

:このような配列内のバイトを保存するために、その方がはるかに簡単:

byte Received = new byte[3]; 
for(int i = 0; i < 3; i++) 
{ 
    Received[i] = (byte)arduinoBoard.ReadByte(); 
} 
01 3つのバイトを受信した後

、(3つのバイトは、右の順になっているかどうかを確認:最上位バイトは、ここでは、インデックス0である)それを一緒にシフト:

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

は今4つのエンディングゼロをシフトアウト

UInt64 Shifted = Shifted >> 4; 

電圧を確認するには、コンバータのスケールを知る必要があります。 Data sheetには、「LSBサイズはVDD/65536です」と記載されています。あなたはこのことができますあなたの必要

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

との二重の希望を計算することができます。その後、一定

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

を定義することができます。

+0

ええ、十分でした、ありがとう! – user2783511

関連する問題