c++ 从无线电阅读一个字符和整数命令以执行一个功能

u4vypkhs  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(97)

我正在尝试创建一个代码和循环,可以从无线电读取字符和整数。这个字符是一个命令,将代表一个数据包恢复命令。这个代码正在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");
  }
 }
}

字符串

wydwbb8l

wydwbb8l1#

如果我理解正确的话,您正在尝试从Serial读入命令,如果遇到'C'命令,您希望后面跟着一个整数值(0-512)。您需要读入整数值。这里有一种方法:

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");
}


了解开关/ shell :http://arduino.cc/en/Reference/SwitchCase

相关问题