2017-08-09 6 views
0

私は初心者ですが、4人のメンバーがポインタを持つBINをタイプしたstructテーブルをフィードし、別のもの、serial2に送信しようとしています。私はそうしない。Arduino - serial.read()から構造体をフィードする方法?

serial1.read()から4文字を受け取ります(例: 'A' '10' '5' '3')。データのサイズを小さくする 、私は構造体を使用したい:

struct structTable { 
    unsigned int page:1; // (0,1) 
    unsigned int cric:4; // 10 choices (4 bits) 
    unsigned int crac:3; // 5 choices (3 bits) 
    unsigned int croc:2; // 3 choices (2 bits) 
}; 

私は宣言して設定します。その後、私は、このようにフィードしてみインスタンスおよびポインタ

struct structTable structTable; 
struct structTable *PtrstructTable; 
PtrstructTable = &structTable; 

を:

for(int i = 0; i<=4; i++) { 
    if(i == 1) { 
    (*PtrProgs).page = Serial.read(); 
    if(i == 2) { 
    (*PtrProgs).cric = Serial.read(); 

など。

(*PtrProgs).page = PtrT[1], BIN; 

そして今、私は1時間に3ビットを供給することはできません実現。しかし、

私は最初の文字テーブルを供給しようとした結果をキャストしようとした...働いていません!ドゥー!これはすべて非常に弱く、確かにちょうど4つの値のための長すぎるプロセスです。 (私はより多くのインスタンスのためのこの種の構造体テーブルを保持したい)。

私のテーブルに簡単な給餌方法を教えてもらえますか?

+1

一貫性のあるコードを表示します。私。できるだけ近くに乗って[mcve]してください。 – Yunnosch

+0

申し訳ありませんが、私は – patatos

+0

をやります。ありがとうございました。 – patatos

答えて

0

シリアルポート経由でフルバイトのみを送信できます。しかし、生のデータを直接送信することもできます。

void send (const structTable* table) 
{ 
    Serial.write((const char*)table, sizeof(structTable)); // 2 bytes. 
} 

bool receive(structTable* table) 
{ 
    return (Serial.readBytes((char*)table, sizeof(structTable)) == sizeof(structTable)); 
} 

はまたはsizeof(intは)すべてのCPU

エンディアンについての言葉で同じではないことを認識する必要があります。シリアル・リンクの相手側のプログラムのためのあなたの構造体の定義は、異なるエンディアンを持つCPU上で実行されていることになる場合:

struct structTable { 
    unsigned short int croc:2; // 3 choices (2 bits) 
    unsigned short int crac:3; // 5 choices (3 bits) 
    unsigned short int cric:4; // 10 choices (4 bits) 
    unsigned short int page:1; // (0,1) 
}; 

メモもで使用できるshort int型を使用し、 arduinoのコードはより正確です。その理由は、intが16,32、または64ビットであっても、short intはほとんどのCPUでは16ビットです。

+0

マイケルロイありがとうございました。私はこれを試し、この記事に続く新しい質問をします。 – patatos

+0

もう一方の端のプログラムで同じパック構造体を使用してデータを送受信するようにしてください。このようにデータを送受信する方法は非常に一般的です。これは、IPスタックで使用されるのと同じ手法です(例:..)。 –

1

Arduinoの参考文献によると、私はちょうどSerial::readを参照し、コードはバイト単位でデータを返します(一度に8ビット)。だから、ちょうど1バイト(一度に8ビット)のデータを読んで、その事実の後であなたの開梱を行うべきでしょう。実際に

あなたは両方の長所を得ることができるようになります(例えばthis other stackoverflow postunionを使用する方法についてを参照してください)unionを使用する場合があります。具体的には、ビットを分割して定義したunionを定義し、unionの2番目の部分を1バイトまたは2バイトとして定義すると、そのデータをバイトとして送信し、目的のビットでデコードできます。

更新

ここで詳細をいくつか試みます。共用体に関する多くの警告があります - 移植可能ではなく、コンパイラに依存しますが、これは試してみる価値があります。

typedef struct { 
    unsigned int page:1; // (0,1) 
    unsigned int cric:4; // 10 choices (4 bits) 
    unsigned int crac:3; // 5 choices (3 bits) 
    unsigned int croc:2; // 3 choices (2 bits) 
} structTable; 

typedef union { 
    structTable a; 
    uint16_t b; 
} u_structTable; 

serial.Read(val1); 
serial.Read(val2); 

u_structTable x; 
x.b = val1 | (val2<<8); 
printf("page is %d\n", x.a.page); 
+0

私は実際にシリアルからデータを1バイトずつ読み込んでいます。しかし、正確には、私は次のシリアル(シリアルのための選択肢)に4バイトを送信したいと思いますテーブル(10多分)のthoses情報のトレースを保持します...スケッチは – patatos

+0

を従っているので、それは組合との2バイトとしてそれをそのように読んでいます。 –

+0

あなたの答えをありがとう。しかし、私はメンバーの可能な限り最小限のサイズを保ちたいと思っています。これが私がビットに固執しようとする理由です。 – patatos

関連する問題