2012年1月25日星期三

将读取/发送字符的功能封装在类中间

由于HardwareSerial没有函数直接读取字符、整数等,而在实际应用中却常常会用到,因此把这部分功能封装到类中间去,便于今后调用。最好的方式是子类化HardwareSerial类,但是该类的构造函数比较复杂,因此先将读取或者发送字符的功能封装到普通的类,在实现过程中调用Serial实例。
class jzSerial
{
public:
  jzSerial()
  {
  }

  String readString(char terminalChar = '\n')
  {
    char rcv='\0';
    String str="";
    while (rcv!=terminalChar)
    {
      while (Serial.available()>0)
      {
        rcv=Serial.read();
        str+=rcv;
      }
    }
    return str;
  }

  int readInteger(char terminalChar='\n')
  {
    char * value;
    String s;
    s=readString(terminalChar);
    value = &s[0];
    return atoi(value);    
  }

  void printString(String value)
  {
    int len;
    char c;
    len= value.length();
    for (int i=0; i<len; i++)
    {
      c=value[i];
      Serial.print(char(c));
    }
  }

  void printLineString (String value)
  {
    printString(value);
    Serial.println("");
  }

  void printInteger(int value)
  {
    int bufSize = 20;
    char buf[bufSize];
    itoa(value,buf,10);
    char c;
    int i=0;
    c=buf[i];
    while (c!='\0')
    {
      Serial.print(char(c));
      i++;
      c=buf[i];
    }
  }

  void printLineInteger(int value)
  {
    printInteger(value);
    Serial.println("");  
  }

  float readFloat(char terminalChar='\n')
  {
    String str="";
    char * buf;
    str=readString(terminalChar);
    buf=&str[0];
    return (atof(buf));
  }

  void printFloat(float value)
  {
    Serial.print(value);
  }

  void printLineFloat(float value)
  {
    Serial.println(value);
  }

};


//测试
jzSerial newSerial;
int i;
String s;

void setup()
{
  Serial.begin(9600);
  Serial.print(236545845);
  Serial.println("Read integer from keyboard");
  i=newSerial.readInteger();
  newSerial.printLineInteger(i);
  Serial.println("Read string from keyboard");  
  s=newSerial.readString();
  newSerial.printLineString(s);
}

void loop()
{
  Serial.println("Read float from keyboard");   
  Serial.println(newSerial.readFloat());
}


没有评论:

发表评论