0

ラジオから文字と整数を読み取ることができるコードとループを作成しようとしています。この文字は、パケット回復コマンドを表すコマンドです。このコードは Arduino で実行されています。このコードの目的は、文字コマンドと 0 ~ 512 の整数を読み取ることです。この整数値は、パケットに対応する数値を表します。データは EEPROM を使用して保存されます。私が達成しようとしていることをコードでコメントします。

いくつかの任意のデータがすでに EEPROM にあると仮定します。

//*******Functions to access EEPROM********//

void I2CEEPROM_Write( unsigned int address, byte data )
{
  Wire.beginTransmission(EEPROM_ID);
  Wire.write((int)highByte(address) );
  Wire.write((int)lowByte(address) );
  Wire.write(data);
  Wire.endTransmission();
  delay(5); // wait for the I2C EEPROM to complete the write cycle
}

byte I2CEEPROM_Read(unsigned int address )
{
  byte data;
  Wire.beginTransmission(EEPROM_ID);
  Wire.write((int)highByte(address) );
  Wire.write((int)lowByte(address) );
  Wire.endTransmission();
  Wire.requestFrom(EEPROM_ID,(byte)1);
  while(Wire.available() == 0) // wait for data
    ;
  data = Wire.read();
  return data;
}      

 void sendPackets(uint32_t start, uint32_t ending, char message_type)
 {
     radio.begin(1200);
     uint32_t starting=start;
     int number_of_packets=ceil(((float)ending-start)/total_size);
     uint32_t last_byte=start;
 for (uint32_t j=starting; j<=start+(data_size*i)-1; j++)
{
  if (j>ending-1)
    break;
  Serial.print("Address: ");
  Serial.println(j);
  Serial.print("Value :");
  Serial.println(I2CEEPROM_Read(j));
  last_byte=j;
}

    starting=last_byte;

   delay(100);
   }
}

  //*********Main Function******//

 void setup()
  {
 Serial.begin(9600);
   Serial.setTimeout(100); //don't wait longer than 100ms for incoming data
  }

  void loop(void)
  {
    char cmd;
    int xyz;

 if (Serial.available())
 {
cmd = Serial.read();  
// ***I don't know how the if statement will be structured inside the bracket*****//    
if (cmd == 'C', xyz)
      {
      //**what do I write here such that I can find the packet number
     relating to the integer (xyz). The integer is the packet number I am
     looking for. The C command represents that I am trying to recover a 
     missing packet.**//

      }
else if (cmd == 'S')
      {
  Serial.println("incomplete");
      }
else if (cmd == 'V')
   {
  Serial.println("wrong");
}
  else if (cmd == 'T')
{
  Serial.println("correct");
}
else
{
  Serial.println("retry");
  }
 }
}
4

1 に答える 1

1

私の理解が正しければ、あなたはシリアルからコマンドを読み込もうとしており、「C」コマンドに遭遇した場合は、整数値 (0-512) が続くことを期待しています。整数値を読み取る必要があります。1 つの方法を次に示します。

cmd = Serial.read();
if(cmd == 'C')
{
    int packetNum = Serial.parseInt();
    // Continue on with your packetNum
}
...

Serial.parseInt() 関数は、シリアル ストリームから数値の ASCII 表現を読み取り、それらを解析して整数値として返します。整数値は、コードで操作したいものです。

ただし、注意してください: Serial.parseInt() がシリアル ストリームから整数値を解析できない場合、または待機中にタイムアウトした場合は、値 0 が返されます。その戻り値をテストし、それに応じて対処することはできますが、あなたの場合、値 0 も正当なパケット番号です。可能であれば、許容されるパケット番号を 1 ~ 513 に変更して、このエラー状態を簡単に処理できるようにすることをお勧めします。(他の方法もありますが、これは簡単な修正です)。

Serial.parseInt() の詳細については、http: //arduino.cc/en/Serial/ParseInt を参照してください。

また、余談ですが、可能な引数ごとに多数の if/else if/else if 分岐を使用する代わりに、switch ステートメントを使用することもできます。これは同じことを実現しますが、コードをよりクリーンでエレガントにします。

switch(cmd)
{
    case 'C':
        int packetNum = Serial.parseInt();
        // Continue on with your packetNum
        break;

    case 'S':
        Serial.println("incomplete");
        break;

    case 'V':
        Serial.println("wrong");
        break;

    case 'T':
        Serial.println("correct");
        break;

    default:
        Serial.println("retry");
}

ここでスイッチ/ケースについて学んでください: http://arduino.cc/en/Reference/SwitchCase

于 2015-03-11T02:22:34.727 に答える