5

私のバックグラウンドはphpなので、charはバイト、ビットはバイナリ値などの低レベルのものの世界に入るには、コツをつかむのに少し時間がかかります。

私がここでやろうとしていることは、ArdunioボードからopenFrameWorksにいくつかの値を送信します(どちらもc ++です)。

送信するデータを要求されたときに、このスクリプトが現在実行していること(および、追加する可能性のある1つのセンサーで適切に機能すること)は次のとおりです。

int value_01 = analogRead(0);  // which outputs between 0-1024

 unsigned char val1;
 unsigned char val2;

//some Complicated bitshift operation           
    val1 = value_01 &0xFF;
    val2 = (value_01 >> 8) &0xFF;  
    
    //send both bytes
    Serial.print(val1, BYTE);
    Serial.print(val2, BYTE);

どうやらこれは、データをやり取りするための最も信頼できる方法です。シリアルポート経由で送信されるようになったので、バイトはchar文字列に追加され、次の方法で変換されます。

int num = ( (unsigned char)bytesReadString[1] << 8 | (unsigned char)bytesReadString[0] );

要約すると、4つのセンサーに相当するデータ(これらのシリアルプリントのうち8つになると思いますか?)を取得し、すべての最後にint num_01--num_04...を設定しようとしています。

これは(ほとんどの場合と同様に)これらの概念の経験がある人にとっては非常に簡単かもしれないと思います。

4

4 に答える 4

7

データの送信を抽象化する関数を記述します(一時変数はあまり価値がないため、一時変数を削除しました)。

void send16(int value)
{
    //send both bytes
    Serial.print(value & 0xFF, BYTE);
    Serial.print((value >> 8) & 0xFF, BYTE);
}

これで、必要なデータを簡単に送信できます。

send16(analogRead(0));
send16(analogRead(1));
...
于 2010-06-13T07:34:20.310 に答える
1

それらを次々に送信するだけです。

シリアルドライバでは、一度に1バイト(8ビット)を送信できることに注意してください。0から1023までの値(これはあなたが得ているもののように見えます)は10ビットに収まります。したがって、1バイトでは不十分です。2バイト、つまり16ビットで十分です(余分なスペースがありますが、転送速度が問題にならない限り、この無駄なスペースについて心配する必要はありません)。

したがって、最初の2バイトは、最初のセンサーのデータを伝送できます。次の2バイトは、2番目のセンサーのデータ、次の2バイトは3番目のセンサー、最後の2バイトは最後のセンサーのデータを伝送します。

R Samuel Klatchkoが提案した機能を送信側で使用することをお勧めします。うまくいけば、受信側で何をする必要があるかを理解できます。

于 2010-06-13T07:41:54.597 に答える
0
   int num = ( (unsigned char)bytesReadString[1] << 8 | 
               (unsigned char)bytesReadString[0] );

そのコードはあなたが期待することをしません。

8ビットのunsignedcharをシフトすると、余分なビットが失われます。

11111111 << 3 == 11111000

11111111 << 8 == 00000000

つまり、unsigned charは、8ビットシフトされる場合、ゼロでなければなりません。

次のようなものが必要です。

typedef unsigned uint;
typedef unsigned char uchar;

uint num = (static_cast<uint>(static_cast<uchar>(bytesReadString[1])) << 8 ) |
           static_cast<uint>(static_cast<uchar>(bytesReadString[0]));

次の場合から同じ結果が得られる可能性があります。

typedef unsigned short ushort;
uint num = *reinterpret_cast<ushort *>(bytesReadString);

バイト順序がOKの場合。リトルエンディアン(x86またはx64)で動作するはずですが、ビッグエンディアン(PPC、Sparc、Alphaなど)では動作しません

于 2010-06-13T14:32:47.173 に答える
0

「送信」コードを少し一般化するには-

void SendBuff(const void *pBuff, size_t nBytes)
{
    const char *p = reinterpret_cast<const char *>(pBuff);
    for (size_t i=0; i<nBytes; i++)
        Serial.print(p[i], BYTE);
}

template <typename T>
void Send(const T &t)
{
    SendBuff(&t, sizeof(T));
}
于 2010-06-13T14:38:15.013 に答える