2016-05-29 4 views
1

私は、自動販売機からデータを読み取るための小さなCテストプログラムを作成しようとしています。私は回路が繋がっている、今は難しい部分はコードです。 本機は9個のデータビットを必要とするUARTを使用します。ここに私のコードです。完全な9ビットデータ型に直接書き込むことはできませんが、その要素に書き込むことはできません。機能において 'ボイドループ()': rx.cpp:11:12:エラー: '演算子=' の不一致(オペランドタイプが ' 'nineBit' であり、C要素だけでなく、データ構造全体に値を書き込むにはどうすればよいですか?

struct nineBit {  //To make 9 bit character types for an array. 
unsigned int data : 8; //8 data bits. 
unsigned int mode : 1; //1 'mode' bit. 
} data[35];    //Make an array of 9 bit data to store the incoming data block. 

void setup() { 
Serial1.begin(9600, SERIAL_9N1); //Start the UART. 
} 

void loop() { 
data[0] = Serial1.read(); //Works if 'data[0].data is entered instead. 
          //How can I transfer this all in one command? 
} 

エラーは rx.cppありますINT ') 無効セットアップ(){ ^

rx.cpp:11:12: note: candidates are: 
rx.cpp:1:8: note: nineBit& nineBit::operator=(const nineBit&) 

    ^
rx.cpp:1:8: note: no known conversion for argument 1 from 'int' to 'const nineBit&' 
rx.cpp:1:8: note: nineBit& nineBit::operator=(nineBit&&) 
rx.cpp:1:8: note: no known conversion for argument 1 from 'int' to 'nineBit&&' 
make[1]: *** [../build/target/user/platform-6rx.o] Error 1 
make: *** [user] Error 2 
Error: Could not compile. Please review your code. 
+0

あなたは[0] =(構造体nineBit *)Serial1.readは() 'データを試してみましたか;'? –

答えて

2

私はあなたがアルドゥイーノまたは類似のものを使用していると仮定。だからSerial1.read()charを返します。 charは、符号付きの1バイト(8ビット)フィールドです。 struct nineBitには9ビットがあります。どのようにして8ビット構造から9ビット構造に書き込むのですか?

あなたの構造に関するメモ:サイズは9ビットではありません。任意の変数のインスタンスは、バイト単位で評価されるサイズを持つことができます。したがって、9ビットを保存する場合は、2つ以上の構造を作成する必要があります。

実際にはsizeof(nineBit)は、ビットフィールドがunsigned intタイプであるため、4と等しくなります。構造体のサイズを小さくしたい場合は、ビットフィールドタイプをshortまたはcharに変更する必要があります。

あなたのシリアル転送はすべての構造ごとに2バイトと仮定しましょう。

struct nineBit {   
    char data : 8; //8 data bits. 
    char mode : 1; //1 'mode' bit. 
} data[35];    

void setup() { 
    Serial1.begin(9600, SERIAL_9N1); //Start the UART. 
} 

void loop() { 
    char byte1=Serial1.read(); 
    char byte2=Serial1.read(); 
    data[0].data=byte1; 
    data[0].mode=byte2; 
} 

、あなたがC++を使用する場合はCの関数や過負荷operator=を記述する必要があり、単一の行を使用する場合:だから、2つのバイトを読み、それらを割り当てる必要があります。

Cの方法

struct nineBit {   
    char data : 8; //8 data bits. 
    char mode : 1; //1 'mode' bit. 
} data[35];  

void writeToNineBit(struct nineBit *value){ 
    char byte1=Serial1.read(); 
    char byte2=Serial1.read(); 
    value->data=byte1; 
    value->mode=byte2; 
} 

void setup() { 
    Serial1.begin(9600, SERIAL_9N1); //Start the UART. 
} 

void loop() { 
    writeToNineBit(data+0); // or &data[0].. 0 is an index in array.. 
} 

C++方法

struct nineBit {   
    char data : 8; //8 data bits. 
    char mode : 1; //1 'mode' bit. 

    // assume you have to assign data without mode.. 
    nineBit& operator=(char b){ 
     this->data=b; 
    } 
} data[35];  

void setup() { 
    Serial1.begin(9600, SERIAL_9N1); //Start the UART. 
} 

void loop() { 
    data[0]=Serial1.read(); // now it works cause you have operator overloading in your structure.. 
} 
+0

コードはコンパイルされませんが、回答ありがとうございます。 –

+0

'writeToNinebitは無効と宣言されました'、 'nineBitはこのスコープで宣言されていません'、 '値はこのスコープで宣言されていません'と表示されます。私は 'パーティクルフォトン'ボードを使用しています。前回arduinoを使用しました。私はレジスタに直接アクセスしました。私はUARTステータスレジスタから9番目のビットを抽出してから、受信レジスタからデータビットをコピーしなければなりませんでした。このデバイスが同じように機能するかどうかは不明ですが、役立つかもしれません。 –

+1

writeToNineBitメソッドの親の部分に 'struct'を追加するのを忘れてしまったようです。ありがとう、私は私に新しい部分をすべて理解しようと努力するつもりです。 –

関連する問題