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


2012年1月22日星期日

Arduino录制电视遥控红外编码程序

趁着过年,把录制电视遥控红外编码的程序调试成功。

使用方法:
1.  首先输入遥控品牌名称
2.  输入每个按键需要记录的条数
3.  每个按键录制完成之后,提示按c/C继续,其它键退出。

代码

String brandName="";
byte maxRecordsPerButton=0;
boolean stop=false;
int currentRecord =0;

byte getNumber()
{
  char * value;

  String s;
  s=getChars();
  value = &s[0];

  return atoi(value);
}

String getChars(void)
{
  char rcv=' ';
  String str;
  while (rcv!='\n')
  {
    if (rcv!=' ')
      str += rcv;
    if (Serial.available()>0)
      rcv=Serial.read();
    else
      rcv=' ';
  } 
  return str; 
}

void setup()
{
  Serial.begin(9600);
  Serial.println("Please connect your datapin of IR Receiver to D2 for UNO, or D19 for MEGA1280");
  Serial.println(" ");
  Serial.print("Please enter the brand name of your remote:");

  brandName=getChars();
  Serial.println(brandName);
  Serial.println("");
  Serial.println("Please enter how many records ");
  Serial.print("would be recorded per button:");
  maxRecordsPerButton = getNumber();
  Serial.println(maxRecordsPerButton,DEC);

  Serial.println("  Ready to Record ...  ");
  currentRecord=0;
}

void loop()
{
  if (!stop)
  {
    while (currentRecord<maxRecordsPerButton)
    {
      if (currentRecord==0)
      {
        String buttonName="";
        Serial.println(" ");
        Serial.print("Please enter button name:");
        buttonName= getChars();
        Serial.println(buttonName);
      }
      /////

      Serial.println(" ");      
      Serial.println("Press the button, please...");
      listenIR();
      printpulses();

      Serial.println(" ");
      /////
      currentRecord ++;
      if (currentRecord==maxRecordsPerButton)
      {
        Serial.println(" ");  
        Serial.println(" ");     
        Serial.println("Press c or C to continue, others to exit...");
        char c;
        c=getChars()[0];
        switch(c)
        {
        case 'c':
        case 'C':
          currentRecord=0;
          break;
        default:
          //stop
          stop=true;
        }
      }
    }
  }
}

void listenIR()
{
  listenForIR();
}


采集部分程序是基于ladyada的代码
#define IRpin_PIN  PIND    
#define IRpin          2// the maximum pulse we'll listen for - 65 milliseconds is a long time
#define MAXPULSE 65000// what our timing resolution should be, larger is better// as its more 'precise' - but too large and you wont get// accurate timing
#define RESOLUTION 20 // What percent we will allow in variation to match the same code
#define FUZZINESS 20// we will store up to 100 pulse pairs (this is -a lot-)
uint16_t pulses[100][2];  // pair is high and low pulse 
uint8_t currentpulse = 0; // index for pulses we're storing

int listenForIR(void)
{
  currentpulse = 0;

  while (1) {
    uint16_t highpulse, lowpulse;  // temporary storage timing
    highpulse = lowpulse = 0; // start out with no pulse length

    //  while (digitalRead(IRpin)) { // this is too slow!
    while (IRpin_PIN & (1 << IRpin)) {
      // pin is still HIGH

      // count off another few microseconds
      highpulse++;
      delayMicroseconds(RESOLUTION);

      // If the pulse is too long, we 'timed out' - either nothing
      // was received or the code is finished, so print what
      // we've grabbed so far, and then reset
      if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
        return currentpulse;
      }
    }
    // we didn't time out so lets stash the reading
    pulses[currentpulse][0] = highpulse;

    // same as above
    while (! (IRpin_PIN & _BV(IRpin))) {
      // pin is still LOW
      lowpulse++;
      delayMicroseconds(RESOLUTION);
      if ((lowpulse >= MAXPULSE)  && (currentpulse != 0)) {
        return currentpulse;
      }
    }
    pulses[currentpulse][1] = lowpulse;

    // we read one high-low pulse successfully, continue!
    currentpulse++;
  }
}

void printpulses(void) {
  Serial.println("\n\r\n\rReceived: \n\rOFF \tON");
  for (uint8_t i = 0; i < currentpulse; i++) {
    Serial.print(pulses[i][0] * RESOLUTION, DEC);
    Serial.print(" usec, ");
    Serial.print(pulses[i][1] * RESOLUTION, DEC);
    Serial.println(" usec");
  }
  
  // print it in a 'array' format
  Serial.println("int IRsignal[] = {");
  Serial.println("// ON, OFF (in 10's of microseconds)");
  for (uint8_t i = 0; i < currentpulse-1; i++) {
    Serial.print("\t"); // tab
    Serial.print(pulses[i][1] * RESOLUTION / 10, DEC);
    Serial.print(", ");
    Serial.print(pulses[i+1][0] * RESOLUTION / 10, DEC);
    Serial.println(",");
  }
  Serial.print("\t"); // tab
  Serial.print(pulses[currentpulse-1][1] * RESOLUTION / 10, DEC);
  Serial.print(", 0};");
}

输入的结果如下


Please connect your datapin of IR Receiver to D2 for UNO, or D19 for MEGA1280

Please enter the brand name of your remote:SONY

Please enter how many records
would be recorded per button:3
  Ready to Record ...

Please enter button name:PowerON

Press the button, please...



Received:

OFF ON
26388 usec, 4560 usec
4300 usec, 640 usec
1520 usec, 660 usec
1520 usec, 640 usec
1520 usec, 640 usec
380 usec, 660 usec
400 usec, 680 usec
380 usec, 660 usec
400 usec, 640 usec
420 usec, 640 usec
1560 usec, 620 usec
1540 usec, 620 usec
1540 usec, 640 usec
400 usec, 640 usec
400 usec, 660 usec
400 usec, 660 usec
400 usec, 660 usec
400 usec, 640 usec
420 usec, 640 usec
1560 usec, 620 usec
400 usec, 640 usec
420 usec, 640 usec
420 usec, 640 usec
400 usec, 660 usec
400 usec, 660 usec
400 usec, 660 usec
1540 usec, 620 usec
400 usec, 660 usec
1540 usec, 620 usec
1540 usec, 620 usec
1560 usec, 620 usec
1540 usec, 620 usec
1560 usec, 620 usec
1540 usec, 620 usec
45740 usec, 4560 usec
4280 usec, 640 usec
1540 usec, 620 usec
1540 usec, 640 usec
1540 usec, 620 usec
400 usec, 660 usec
400 usec, 660 usec
400 usec, 640 usec
420 usec, 640 usec
400 usec, 680 usec
1520 usec, 620 usec
1540 usec, 640 usec
1540 usec, 620 usec
400 usec, 660 usec
420 usec, 640 usec
420 usec, 620 usec
440 usec, 620 usec
440 usec, 620 usec
440 usec, 620 usec
1540 usec, 620 usec
420 usec, 640 usec
440 usec, 620 usec
420 usec, 640 usec
420 usec, 640 usec
420 usec, 620 usec
440 usec, 620 usec
1540 usec, 640 usec
420 usec, 620 usec
1540 usec, 640 usec
1540 usec, 620 usec
1540 usec, 620 usec
1560 usec, 620 usec
1540 usec, 620 usec
1540 usec, 640 usec
int IRsignal[] = {
// ON, OFF (in 10's of microseconds)
456, 430,
64, 152,
66, 152,
64, 152,
64, 38,
66, 40,
68, 38,
66, 40,
64, 42,
64, 156,
62, 154,
62, 154,
64, 40,
64, 40,
66, 40,
66, 40,
66, 40,
64, 42,
64, 156,
62, 40,
64, 42,
64, 42,
64, 40,
66, 40,
66, 40,
66, 154,
62, 40,
66, 154,
62, 154,
62, 156,
62, 154,
62, 156,
62, 154,
62, 4574,
456, 428,
64, 154,
62, 154,
64, 154,
62, 40,
66, 40,
66, 40,
64, 42,
64, 40,
68, 152,
62, 154,
64, 154,
62, 40,
66, 42,
64, 42,
62, 44,
62, 44,
62, 44,
62, 154,
62, 42,
64, 44,
62, 42,
64, 42,
64, 42,
62, 44,
62, 154,
64, 42,
62, 154,
64, 154,
62, 154,
62, 156,
62, 154,
62, 154,
64, 0};

Press the button, please...



Received:

OFF ON
45080 usec, 4560 usec
4260 usec, 660 usec
1540 usec, 620 usec
1540 usec, 620 usec
1560 usec, 620 usec
400 usec, 660 usec
420 usec, 640 usec
400 usec, 640 usec
440 usec, 620 usec
440 usec, 620 usec
1540 usec, 620 usec
1540 usec, 640 usec
1540 usec, 620 usec
400 usec, 660 usec
420 usec, 640 usec
420 usec, 620 usec
440 usec, 620 usec
440 usec, 620 usec
440 usec, 620 usec
1540 usec, 620 usec
400 usec, 660 usec
440 usec, 620 usec
420 usec, 640 usec
420 usec, 640 usec
420 usec, 640 usec
420 usec, 620 usec
1540 usec, 640 usec
420 usec, 620 usec
1560 usec, 620 usec
1540 usec, 620 usec
1540 usec, 640 usec
1540 usec, 620 usec
1540 usec, 620 usec
1540 usec, 620 usec
45760 usec, 4540 usec
4280 usec, 640 usec
1560 usec, 620 usec
1540 usec, 620 usec
1540 usec, 620 usec
420 usec, 640 usec
440 usec, 620 usec
420 usec, 640 usec
420 usec, 640 usec
420 usec, 640 usec
1540 usec, 620 usec
1540 usec, 620 usec
1540 usec, 640 usec
400 usec, 640 usec
440 usec, 620 usec
440 usec, 620 usec
440 usec, 620 usec
440 usec, 620 usec
420 usec, 640 usec
1540 usec, 620 usec
420 usec, 640 usec
420 usec, 640 usec
420 usec, 620 usec
440 usec, 620 usec
440 usec, 620 usec
420 usec, 640 usec
1540 usec, 620 usec
440 usec, 620 usec
1540 usec, 620 usec
1560 usec, 620 usec
1540 usec, 620 usec
1540 usec, 640 usec
1540 usec, 620 usec
1540 usec, 620 usec
int IRsignal[] = {
// ON, OFF (in 10's of microseconds)
456, 426,
66, 154,
62, 154,
62, 156,
62, 40,
66, 42,
64, 40,
64, 44,
62, 44,
62, 154,
62, 154,
64, 154,
62, 40,
66, 42,
64, 42,
62, 44,
62, 44,
62, 44,
62, 154,
62, 40,
66, 44,
62, 42,
64, 42,
64, 42,
64, 42,
62, 154,
64, 42,
62, 156,
62, 154,
62, 154,
64, 154,
62, 154,
62, 154,
62, 4576,
454, 428,
64, 156,
62, 154,
62, 154,
62, 42,
64, 44,
62, 42,
64, 42,
64, 42,
64, 154,
62, 154,
62, 154,
64, 40,
64, 44,
62, 44,
62, 44,
62, 44,
62, 42,
64, 154,
62, 42,
64, 42,
64, 42,
62, 44,
62, 44,
62, 42,
64, 154,
62, 44,
62, 154,
62, 156,
62, 154,
62, 154,
64, 154,
62, 154,
62, 0};

Press the button, please...



Received:

OFF ON
40692 usec, 4560 usec
4280 usec, 640 usec
1540 usec, 620 usec
1540 usec, 640 usec
1540 usec, 640 usec
380 usec, 660 usec
400 usec, 660 usec
420 usec, 640 usec
400 usec, 640 usec
440 usec, 620 usec
1540 usec, 620 usec
1560 usec, 620 usec
1540 usec, 620 usec
400 usec, 660 usec
420 usec, 640 usec
420 usec, 640 usec
420 usec, 640 usec
420 usec, 620 usec
440 usec, 620 usec
1540 usec, 620 usec
420 usec, 640 usec
440 usec, 620 usec
440 usec, 620 usec
420 usec, 640 usec
420 usec, 640 usec
420 usec, 620 usec
1540 usec, 640 usec
400 usec, 660 usec
1540 usec, 620 usec
1540 usec, 620 usec
1540 usec, 640 usec
1540 usec, 620 usec
1540 usec, 620 usec
1540 usec, 640 usec
45740 usec, 4560 usec
4260 usec, 660 usec
1520 usec, 640 usec
1540 usec, 620 usec
1540 usec, 620 usec
420 usec, 640 usec
440 usec, 620 usec
420 usec, 640 usec
420 usec, 640 usec
420 usec, 640 usec
1540 usec, 620 usec
1540 usec, 620 usec
1540 usec, 640 usec
400 usec, 660 usec
420 usec, 640 usec
420 usec, 620 usec
440 usec, 620 usec
440 usec, 620 usec
420 usec, 640 usec
1540 usec, 620 usec
400 usec, 660 usec
420 usec, 640 usec
420 usec, 620 usec
440 usec, 620 usec
440 usec, 620 usec
420 usec, 640 usec
1540 usec, 620 usec
440 usec, 620 usec
1540 usec, 620 usec
1560 usec, 620 usec
1540 usec, 620 usec
1540 usec, 640 usec
1540 usec, 620 usec
1540 usec, 620 usec
int IRsignal[] = {
// ON, OFF (in 10's of microseconds)
456, 428,
64, 154,
62, 154,
64, 154,
64, 38,
66, 40,
66, 42,
64, 40,
64, 44,
62, 154,
62, 156,
62, 154,
62, 40,
66, 42,
64, 42,
64, 42,
64, 42,
62, 44,
62, 154,
62, 42,
64, 44,
62, 44,
62, 42,
64, 42,
64, 42,
62, 154,
64, 40,
66, 154,
62, 154,
62, 154,
64, 154,
62, 154,
62, 154,
64, 4574,
456, 426,
66, 152,
64, 154,
62, 154,
62, 42,
64, 44,
62, 42,
64, 42,
64, 42,
64, 154,
62, 154,
62, 154,
64, 40,
66, 42,
64, 42,
62, 44,
62, 44,
62, 42,
64, 154,
62, 40,
66, 42,
64, 42,
62, 44,
62, 44,
62, 42,
64, 154,
62, 44,
62, 154,
62, 156,
62, 154,
62, 154,
64, 154,
62, 154,
62, 0};


Press c or C to continue, others to exit...




2012年1月19日星期四

哈哈 GoAent配置成功

以前也弄过,但是教程写的不明不白,尤其是有些个细节地方交代的不清楚,总是不成功。今天google了一篇图文并茂的教程,终于配置成功,终于可以自由自在的来blogspot。 教程地址 http://maolihui.com/goagent-detailed-version-of-the-tutorial.html 我的goagent地址是 unblokin,采用mxxx.cn邮箱申请的。 配置成功之后,可以把goagent整个文件夹拷入U盘,这样可以在其他电脑上使用goagent服务。

2011年12月25日星期日

利用Arduino演示C++位运算

用10位的光条来显示二进制应该是很有趣的事情。 下面直接上代码: Exported from Notepad++
/* 免费程序,您可以任意修改与发布。 C++位运算演示程序 从串口监视工具输入数字,可以是二进制/八进制/十进制/十六进制 测试的二进制与十进制效果不错,其余进制的数未测试。 显示结果用10位的光条显示,比较直观。 已知问题: NOT运算的结果可能是错的 */ #include "converter.h" #include "String.h" const int xTyping = 0; //正在输入x值 const int yTyping = 1; //正在输入y值 String x = ""; //接收到的x字符串 String y = ""; //接收到的y字符串 int xValue = 0; //保存x值 int yValue = 0; //保存y值 int flag; //输入进度标识,输入x/输入y/输入运算符选项 int pinFirst = 29; //光条第一脚IO口位置 int pinLast = 38; //光条最后脚IO口位置 Converter converter; //声明转换类变量 void setup() { Serial.begin(9600); flag=xTyping; for (int i=pinFirst; i<=pinLast; i++) pinMode(i,OUTPUT); Diagnose(); //测试光条是否正常 } void loop() { if (Serial.available()>0) { char c; c=Serial.read(); String str; if (c=='\n') //字符串结束标识 { switch (flag) { case xTyping: Serial.print("x = "); Serial.println(x); //显示接收到的字串 Serial.print("x in binary base: "); xValue = converter.StrToInt(x); //转换成数字 str= converter.toBinary(xValue);//转换成二进制,并且用光条显示出来 Serial.println(str); displayStrWithLED(str); Serial.println(""); break; case yTyping: Serial.print("y = "); Serial.println(y); Serial.print("y in binary base: "); yValue=converter.StrToInt(y); str = converter.toBinary(yValue); Serial.println(str); displayStrWithLED(str); Serial.println(""); Serial.println("Please select the bitwise operator "); Serial.println(" 1: & bitwise AND"); Serial.println(" 2: | bitwise OR"); Serial.println(" 3: ^ bitwise XOR"); Serial.println(" 4: ~ bitwise NOT"); Serial.println(" 5: << bitwise LEFT"); Serial.println(" 6: >> bitwise RIGHT"); Serial.print(""); Serial.print("Your choice: "); } flag ++; flag=flag % 3; } else { if (flag == xTyping) //将收到的字符拼接成字符串 x +=c; else if(flag==yTyping) y+=c; else { Serial.println(c); //CHECK doBitwiseOperate(c); } } } } void displayFormula(char op, boolean full)//显示公式,第一个参数是运算符, //第二个参数是决定是否显示y,NOT运算不显示y { Serial.print(" "); Serial.println( converter.toBinary(xValue)); Serial.print(" "); switch (op) { case '<': Serial.print("<<"); break; case '>': Serial.print(">>"); break; default: Serial.print(" "); Serial.print(op); } Serial.print(" "); if (full) Serial.println( converter.toBinary(yValue)); //NOT运算不显示y else Serial.println(""); Serial.println("-----------------"); Serial.print(" = "); } void doBitwiseOperate(char opt) { String result=""; Serial.println(""); switch (opt) { case '1': //bitwise AND displayFormula('&',true); result = converter.toBinary( xValue &=yValue); break; case '2': // bitwise OR displayFormula('|',true); result = converter.toBinary(xValue |= yValue); break; case '3': //bitwise XOR displayFormula('^',true); result = converter.toBinary(xValue ^= yValue); break; case '4': //bitwise NOT Serial.println("NOT operation is not well supported yet"); //NOT运算涉及到负数,有时候会出现错误 Serial.println(""); displayFormula('~',false); yValue = ~ xValue; xValue = yValue; result = converter.toBinary(xValue ); break; case '5': //bitwise LEFT displayFormula('<',true); result = converter.toBinary(xValue << yValue); break; case '6': //bitwise RIGHT displayFormula('>',true); result = converter.toBinary(xValue>>yValue); } Serial.println(result); displayStrWithLED(result); x=""; y=""; xValue=0; yValue=0; Serial.println(""); Serial.println(""); Serial.println(""); } void Clear() { for (int i=pinFirst; i<=pinLast; i++) //清楚前面的显示结果 digitalWrite(i,LOW); } void Diagnose() //诊断光条是否正常 { for (int i=pinFirst; i<=pinLast; i++) { digitalWrite(i,HIGH); delay(50); } delay(500); for (int i=pinLast; i>=pinFirst; i--) { digitalWrite(i,LOW); delay(50); } } void displayStrWithLED(String value) { Clear(); for (int i=0; i<value.length(); i++) { if (value[i]=='1') digitalWrite(i+pinFirst,HIGH); else digitalWrite(i+pinFirst,LOW); } } 下面是转换类的代码: Exported from Notepad++
#ifndef CONVERTER_H #define CONVERTER_H #include "Arduino.h" #include "String.h" //#include "types.h" enum Alignment { alLeft, alCenter, alRight }; class Converter { private: int getActualSize(String value); public: Converter(); unsigned int StrToInt(String value); String toBinary(int value); String toBinary(int value, Alignment align); void setDelimeter(char value); }; #endif // CONVERTER_H
Exported from Notepad++
#include "converter.h" /* 将字符转换成数字 数字字串的字头 b or B for binary numbers, o or O for oct, d or D for decimal, and h or H for hex, if no flag char exists, the number would be consider a decimal. if the number entered is an illegal one, then return -1. This class could NOT handle negative numbers. */ #define errValue -1 //字串中如果有无效的字符,则返回-1 //#include <iostream> using namespace std; char delimeter; int Power(int base, int power) //This is an equivalent of pow, but this one only handle integer, however. { int v = 1; switch (power) { case 0: return 1; break; case 1: return base; break; default: for (int i = 1; i <= power; i++) v *= base; } return v; } int binStr2Int(String value, int len) { int v = 0; for (int i = 1; i <= len ; i++) { switch (value[i]) { case '0': break; case '1': v += Power(2, len - i); break; default: return errValue;// exit the function early when it runs into error } } return v; } int octStr2Int(String value, int len) { int v = 0; int c; for (int i = 1; i <= len ; i++) { c = value[i]; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': v += ((c - '0') * Power(8, len - i)); break; default: return errValue; } } return v; } int decStr2Int(String value, int len) { int v = 0; int c; c = value[0]; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': break; case 'd': case 'D': value[0] ='0'; len++; break; default: return errValue; } char t; for (int i = 0; i <= (len-1 ); i++) { t = value [i]; switch (t) { case '0': break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': v += Power(10, len -1 - i )*(t-'0'); break; default: v = errValue; } } return v; } int hexStr2Int(String value, int len) { int v = 0; int c; for (int i = 1; i <= len ; i++) { c = value[i]; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': v += ((c - '0') * Power(16, len - i)); break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': v += ((c - 'A' + 10) * Power(16, len - i)); break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': v += ((c - 'a' + 10) * Power(16, len - i)); break; default: return errValue; } } return v; } unsigned int lenOfString(String value) //字符长度 { int result =0; char terminal= value[0]; while (terminal!=delimeter) { result ++; terminal = value [result]; } switch (value[0]) { case 'b': case 'B': case 'o': case 'O': case 'd': case 'D': case 'h': case 'H': result --; } return result ; } unsigned int Converter::StrToInt(String value) { char c; unsigned int result; int len; len = lenOfString(value); c= value[0]; switch (c) { case 'b': case 'B': result = ::binStr2Int(value,len); break; case 'o': case 'O': result = octStr2Int(value, len); break ; case 'd': case 'D': result = decStr2Int(value,len); break; case 'h': case 'H': result = hexStr2Int(value,len); break; default: result = decStr2Int(value,len); } return result ; } Converter::Converter() { delimeter = '\0'; //输入时字串的结束标志 } void Converter::setDelimeter(char value) { delimeter=value ; } String Converter::toBinary(int value) { return toBinary(value, alRight); } String Converter::toBinary(int value, Alignment align) { String result="0000000000"; char bin[10]={ '0000000000' }; itoa(value,bin,2); //#define DEBUG; #ifdef DEBUG Serial.println(""); Serial.println("********************************"); Serial.println("parse bin[]"); for (int i=0; i<10; i++) { Serial.print(bin[i]); Serial.print("->"); Serial.println(bin[i],DEC); } Serial.println("length of bin[]"); int len; //len= sizeof(bin)/sizeof(bin[0]); //return 10, which is declared before, is not the actural size data occupied, however. len = getActualSize(bin); Serial.println(len); Serial.println("end of parsing bin[]"); Serial.println("********************************"); #endif if (align==alLeft) result = bin; else { int len; len = getActualSize(bin); int offset = 10- len; for (int i=0; i<len; i++) result[i+offset] = bin[i]; } return result; } int Converter::getActualSize(String value) { int result = 0; for (int i=0; i<10; i++) { if (value[i]=='\0') { result= i; break; } } return result; }
手头上还有几个8*8的LED点阵,用它来做应该更加直观,哪天改改。