从无线电读取字符和整数命令以执行功能
Reading a character and integer command from radio in order to execute a function
我正在尝试创建一个可以从无线电读取字符和整数的代码和循环。该字符是将代表数据包恢复命令的命令。此代码在 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");
}
}
}
如果我对你的理解正确,你正试图从 Serial 读取命令,如果你遇到 'C' 命令,你希望后面跟着一个整数值 (0-512)。您需要读取其中的整数值。这是一种方法:
cmd = Serial.read();
if(cmd == 'C')
{
int packetNum = Serial.parseInt();
// Continue on with your packetNum
}
...
Serial.parseInt() 函数将从串行流中读取数字的 ASCII 表示形式,然后尝试解析它们并 return 将它们作为整数值。整数值是您希望在代码中使用的值。
但要注意:如果 Serial.parseInt() 无法从串行流中解析整数值,或者等待它超时,它将 return 值 0。您可以测试对于那个 return 值并相应地采取行动,但在你的情况下,值 0 也是一个合法的数据包号。如果可能,您可能希望将允许的数据包编号更改为 1-513,以便轻松处理此错误情况。 (还有其他方法可以解决这个问题,但这很容易解决)。
有关 Serial.parseInt() 的详细信息,请参阅 http://arduino.cc/en/Serial/ParseInt
此外,顺便说一句,您可能更喜欢使用 switch 语句,而不是为每个可能的参数使用一堆 if/else if/else if 分支。它完成了同样的事情,但使代码更简洁、更优雅。
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");
}
在此处了解 switch/case:http://arduino.cc/en/Reference/SwitchCase
我正在尝试创建一个可以从无线电读取字符和整数的代码和循环。该字符是将代表数据包恢复命令的命令。此代码在 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");
}
}
}
如果我对你的理解正确,你正试图从 Serial 读取命令,如果你遇到 'C' 命令,你希望后面跟着一个整数值 (0-512)。您需要读取其中的整数值。这是一种方法:
cmd = Serial.read();
if(cmd == 'C')
{
int packetNum = Serial.parseInt();
// Continue on with your packetNum
}
...
Serial.parseInt() 函数将从串行流中读取数字的 ASCII 表示形式,然后尝试解析它们并 return 将它们作为整数值。整数值是您希望在代码中使用的值。
但要注意:如果 Serial.parseInt() 无法从串行流中解析整数值,或者等待它超时,它将 return 值 0。您可以测试对于那个 return 值并相应地采取行动,但在你的情况下,值 0 也是一个合法的数据包号。如果可能,您可能希望将允许的数据包编号更改为 1-513,以便轻松处理此错误情况。 (还有其他方法可以解决这个问题,但这很容易解决)。
有关 Serial.parseInt() 的详细信息,请参阅 http://arduino.cc/en/Serial/ParseInt
此外,顺便说一句,您可能更喜欢使用 switch 语句,而不是为每个可能的参数使用一堆 if/else if/else if 分支。它完成了同样的事情,但使代码更简洁、更优雅。
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");
}
在此处了解 switch/case:http://arduino.cc/en/Reference/SwitchCase