2017-07-31 3 views
-1

Arduinoが初めてで、SPIを使用してArduinoから別のArduinoにデータを転送しようとしています。私は文字の配列(C文字列)を送ることに問題があります。最初は、文字列自体を定義することに問題があると思います(同じArduinoでシリアルに印刷しようとしていたので動作しました)。他のすべてのデータ型は正常に送られますが、何らかの理由で文字列が空白になります空行が代わりに印刷されている。Arduino SPI転送コードで文字列が空になる

ここマスタのコードだ、同じ問題がスレーブコードである。モニタで

// master 
#include <SPI.h> 
#include "SPI_anything.h" 

// create a structure to store the different data values: 
typedef struct myStruct { 
    char cmd[4]; 
    double b; 
    long c; 
}; 

myStruct sent; 
myStruct recieved; 

void setup() { 
    Serial.begin(115200); 
    SPI.begin(); 
    // Slow down the master a bit 
    SPI.setClockDivider(SPI_CLOCK_DIV16); 
    sent.cmd[4] = "def"; 
    sent.b = 32.2; 
    sent.c = 100000; 
} // end of setup 

void loop() { 
    digitalWrite(SS, LOW); // SS is pin 10 
    // SPI_writeAnything (sent); 
    delay(20); 
    Serial.println (SPI_readAnything (recieved)); 
    String command=recieved.cmd; 
    Serial.println (recieved.cmd);/////////// 
    Serial.println (sent.cmd);///////////// 
    Serial.println (command); 
    Serial.println (recieved.b); 
    Serial.println (recieved.c); 
    Serial.println(); 
    digitalWrite(SS, HIGH); 
    delay (1000); // for testing 
    sent.c++; 
} // end of loop 

b及びcは(ザ・データである正常に印刷されていますスレーブから来ている)が、cmdが空行(受信と送信の両方)として表示されます。

ありがとうございました。

+0

C = C++。使用している言語に合わせて1つだけタグを付けます。 – tambre

+0

'send.cmd [4] =" def "を' strcpy(send.cmd、 "def") 'に変更する方が良いと思います。あなたがコード化した命令は、 '' def ''を指すポインタの値を、最大4バイトを含むchar配列の5番目の文字に割り当てます。 ;) –

答えて

0

Serge Ballestaは、cmd配列の4番目の要素を、意図したものではない文字列へのポインタの値に設定しました。

代わりに、明示的なArduinoコードではなくC/C++互換の次の例のように、宣言されたときに同時に構造体を初期化できます。ファイルstructTest.c

#include <stdio.h> 

typedef struct myStruct { 
    char cmd[4]; 
    double b; 
    long c; 
} myStruct; 


int main(int argc, char const *argv[]) 
{ 
    myStruct s = { 
    "def", 3.0, 10000 
    }; 
    printf("{%s, %f, %li}", s.cmd, s.b, s.c); 
    return 0; 
} 

保存これ、コンパイルと実行:!

$ gcc structTest.c -o structTest 
$ ./structTest.exe 
{def, 3.000000, 10000} 
+0

ありがとう、それは働いた! –

0

char []ではなくString型で試しましたか?

なぜなら、長時間の作業は単一の参照を指しているからです。 cmdは4つの参照の配列を指します。それが文字列で動作する場合は、char配列の読み込み/出力をどのように処理しているのかもしれません。メモリの問題に関心がある場合は、代わりにchar *を使用してください。

0

警告は無視されません。

この行sent.cmd[4] = "def";はひどいです。 cmdを4文字の配列にすると宣言し、その5文字目にlitteral文字列へのポインタを書き込もうとしました。

strncpy(sent.cmd, "def", 4); 

代わりに使用することができます:

正しい方法はコピー C-文字列にある...それはあなたがするintented何ではないかもしれないが、それは、コンパイラが何しようとするものですC++ std::stringは割り当てをサポートしますが、ダイナミックメモリを使用するため、ユースケースではオプションである場合とそうでない場合があります。

BTW、CとC++は異なる言語であり、共通のサブセットのみです。可能であれば、CとC++の両方で正しいコードを書くことはほとんどありませんので、一つを選んでください。

関連する問題