0

私はスレーブデバイスからこのコードを持っています

byte buf[] = {125, 126, 127, 2000, 5000};

void setup() {
  // initialize serial:
  Serial.begin(9600);

}

void loop() {
  int i = Serial.write(buf, sizeof(buf));
  Serial.println(i);
  delay(5000);

}

リスニングデバイスからこのコードがあります。

char protocol[5];
void setup() {
  Serial.begin(9600);
  memset(protocol, '\0', sizeof(protocol)); 
}


void loop() {
  if(Serial.available()) {
  Serial.readBytes(protocol, 5);
  Serial.println(protocol);
  for(int i = 0; i < sizeof(protocol); i ++ ) {
    Serial.println((int)protocol[i], BIN); 
  }
  }
  else{
   Serial.println("None available");
   delay(500); 
  }

}

Arduinoが2の賛辞を使用していることは理解していますが、私が得ている問題は、印刷物がこれであるということです

1111101
1111110
1111111
11111111111111111111111111010000
11111111111111111111111110001000

2 の補数のため、一番左のビットが 1 として読み取られるため、文字を終了するためにすべてのゼロが追加されています。追加された 1 を削除して 2000 と 5000 を読み取るにはどうすればよいですか? ありがとう

4

1 に答える 1

1

ここでの問題は、各数値を 8 ビット値として格納および送信しているため、2000 または 5000 の数値を格納するには十分な大きさではないことです。

これを修正するには、バッファ配列の型をint[] に変更します。方法は次のとおりです。

スレーブでは、バッファを宣言する行を変更する必要があります。

int buf[] = {125, 126, 127, 2000, 5000};

Serial.write型が異なるため、charまたはbyte配列が必要なため、型キャストを追加する必要があります。

int i = Serial.write((char *) buf, sizeof(buf));

次に、リスナー デバイスで同様の変更を行う必要があります。protocol次のように配列を宣言します。

int protocol[5];

次に、Serial.readBytesバイト配列も想定しているため、別のキャストが必要になります (そしてsizeof、読み取る正しいバイト数を取得するために):

Serial.readBytes((byte *) protocol, sizeof(protocol));

編集:スレーブのキャストがどのように(char *)機能し、なぜそれが必要なのかを説明するには、これが C++ であることを思い出してください。したがって、(C のように) 配列は内部的にほとんどポインターです。したがって、5 つの s の配列を作成すると、int実際には 10 バイトのメモリ (5 つの 16 ビットints に十分) が確保され、その先頭へのポインターが取得されます。ここで、別段の指示がない限り、C++ はそのメモリを 5 つintの s として扱います。charでも、言ってくれれば10秒扱いで全然OK 。Serial.writeは s の配列しかとらないため、これは非常に便利charです (覚えているように、これはcharポインターのようなものなのでchar *)。これは、次のように回線を介して 10 バイトを送信するため、正常に機能します。chars。リスナーは同じ 10 バイトをprotocol配列に入れます。次に、メモリの 10 バイト ブロックの正確なコピーを使用すると、配列はスレーブでの配列protocolと同じintsを持ちます。buf

sizeof(protocol)最後のコメント:読み取りを試みる前に、実際に使用可能なバイトができるまでリスナーを待機させたい場合があります。それ以外の場合、データの一部しか準備ができていない場合は、先に進んで読み取りを試みますが、Serial.readBytes通常は残りのデータを短時間だけ待機してから、あきらめてバッファーを空のままにします。>= sizeof(protocol)適切な行に追加することで修正できます。

if(Serial.available() >= sizeof(protocol)) {
于 2013-04-24T00:49:54.210 に答える