0

一連のバイトを送信するプログラムを使用して、シリアル経由でArduinoと通信します。

Arduinoがジャンクではなくメッセージを受信して​​いることを認識するために、バイト配列の先頭に文字「S」「T」「A」「R」「T」のタグを付けました。この後、最終的には内部変数(まだ実装されていない)に割り当てられる一連のバイトが続きます。

Arduinoは各バイトを順番に読み取り、バイト配列と比較する必要があります。すべてが正しい順序で存在する場合は、プログラムの次の部分に進みます。それ以外の場合は、現在のバイトを破棄し、さらにバイトが到着するのを待つ必要があります。

一連のネストされたifステートメントを使用するのではなく、最も効率的で読みやすい方法で実装しようとしています。

これまでのところ私は持っています:

byte inByte = 0;
byte handShake[] = {'S','T','A','R','T'};

void setup() {
  Serial.begin(9600);

}

void loop() 
{
  while (Serial.available()) 
{
  for (int x =0; x < sizeof(handShake) ; x++)
    {
    inByte = Serial.read();
    Serial.println(x);
    if (inByte == handShake[x]) 
     {
        if (x == (sizeof(handShake)-1)) {setArduino();}  
      }
       else break;
   }
  }
}


void setArduino () {
  Serial.println("Ready To Set Parameters");
}

ただし、これは2バイト目を超えていないようで、理由はわかりません。

4

3 に答える 3

1

それを解決しました:

答えは次のとおりです。

byte inByte = 0;
char handShake[] = {'S','T','A','R','T'};

void setup() {
  Serial.begin(9600);

}

void loop() 
{
  while (Serial.available()) 
  {
  for (int x =0; x < sizeof(handShake) ; x++)
    {
    inByte = Serial.read();
    Serial.println(x);
    if (inByte == handShake[x]) 
      {
       if (x == (sizeof(handShake)-1)) {setArduino();}  
       while(!Serial.available()) {delay(1);}
      }
       else {break;}
    }
  }
}


void setArduino () {
  Serial.println("Ready To Set Parameters");
}

これはおそらく最も効率的な方法ではないかもしれませんが、現在のところ問題はありません。

于 2013-03-20T15:14:45.910 に答える
1

より良い答え : これにより、メッセージが終了するのを待っている間に残りのループを繰り返すことができます。完全なハンドシェイク メッセージが受信されない場合、カウンターはリセットされます。

byte inByte = 0;
char handShake[] = {'S','T','A','R','T'};
int messageIndex = 0;

void setup() {
  Serial.begin(9600);

}

void loop() 
{
  while (Serial.available()) 
  {
    inByte = Serial.read();
    Serial.println(messageIndex);
    if (inByte == handShake[messageIndex]) 
      {
        messageIndex++;
        if (messageIndex == sizeof(handShake)) {messageIndex = 0; setArduino();}  
      }
       else {messageIndex=0;}
  }
// Other code while waiting for message to finish
Serial.println("tick");
}


void setArduino () {
  Serial.println("Ready To Set Parameters");
}
于 2013-03-20T15:30:52.187 に答える
0

メッセージを計算してみてください。CRC は古くて優れたソリューションです。私はそれを使用していますが、それは私にとって完璧に機能します。通信しているデバイスの種類がわかりません。

//define
const uint32_t Polynomial = 0xEDB88320;
const uint16_t NumBytes = 256;
uint8_t data[NumBytes];

/// compute CRC32
uint32_t crc32_bitwise(const void* data, uint16_t length, uint32_t previousCrc32 = 0)
{
  uint32_t crc = ~previousCrc32; // same as previousCrc32 ^ 0xFFFFFFFF
  uint8_t* current = (uint8_t*) data;

  while (length--)
  {
    crc ^= *current++;
    for (uint8_t j = 0; j < 8; j++)
    {
      uint8_t lowestBit = crc & 1;
      crc >>= 1;
      if (lowestBit)
        crc ^= Polynomial;
    }
  }
  return ~crc; // same as crc ^ 0xFFFFFFFF
}
void setup() {
  // put your setup code here, to run once:    
}

void loop() {
  // put your main code here, to run repeatedly:    
}

CRCを計算する必要がある場合

uint32_t crc = crc32_bitwise(data_bytes, sizeof(data_bytes));

data_bytesバイト配列です。

次に、すべての設定またはメッセージを取得してbyte data[x]、CRC を計算できます。次に、メッセージにCRCを追加してメッセージを送信できますbyte data[x+sizeof(CRC)]

PSbyteの代わりに使用しintます。たとえば。for(byte x =0; x<sizeof(handShake); x++)

于 2014-10-21T10:08:30.297 に答える