(Arduino)我可以在parseInt()中跳过多个字符吗?

时间:2018-07-26 19:01:23

标签: c++ arduino

标题说的差不多。在arduino网站上:

  

语法

     

Serial.parseInt()

     

Serial.parseInt(char skipChar)

     

参数

     

skipChar:用于跳过搜索中指示的字符。例如,用于跳过数千个分隔线。

我可以使用护符或类似的功能跳过多个字符吗?

2 个答案:

答案 0 :(得分:0)

也许您可以从Serial上阅读,但只能输入数字?然后解析字符串?肮脏的例子:

val = 0;
while (Serial.available() > 0) {
    int c = Serial.read();
    if (isDigit(c)) {
        val = val * 10 + c; // Thanks to @Danny_ds for this
    }
}
// Print *val*

答案 1 :(得分:0)

我最终使用了一种非常不同的方法来通过使用char数组而不依赖时序来使其工作。到目前为止,它运行良好。我用它来使我的arduino用作温度监视器。


它如何传达温度

PC> OpenHardwaremonitor> WMI>批处理脚本(如下所示)> COM端口> Arduino> LCD

这是我可以正确获取CPU临时温度的唯一方法,因为它太旧了

批处理代码:

@echo off
mode COM3: baud=9600 data=8 >nul
wmic /namespace:\\root\openhardwaremonitor path sensor where "Identifier='/intelcpu/0/temperature/0' or Identifier='/nvidiagpu/0/temperature/0'" get Value /every:2|findstr [0-9]>COM3

Arduino代码:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

bool sounded = false;
int cpu = 0;
int gpu = 0;

char invalids[3] = {10, 32, '\0'}; // line feed, space
boolean newData = false;
const byte numChars = 8;
char charMap[numChars];
char tempChars[numChars];

void setup() {
  pinMode(6, OUTPUT); // character intensity
  pinMode(8, OUTPUT); // buzzer
  pinMode(10, OUTPUT); // backlight
  lcd.begin(16, 2);
  Serial.begin(9600);
  analogWrite(6, 100); // set intensity without POT
  analogWrite(10, 168); // ~3.3v
  analogReference(EXTERNAL);
  lcd.print("CPU:   ");
  lcd.print((char)223);
  lcd.print("C  AIR:");
  lcd.setCursor(0, 1);
  lcd.print("GPU:   ");
  lcd.print((char)223);
  lcd.print("C     ");
  lcd.print((char)223);
  lcd.print("F");
}

void loop() {
  recvWithoutWhitespace();
  if (newData == true) {
    parseData();
    lcd.setCursor(4, 0);
    lcd.print(cpu);
    lcd.setCursor(4, 1);
    lcd.print(gpu);
    int reading = analogRead(A0);
    float degreesF = (((reading * 3.3 / 1024 - 0.5) * 100) * 1.8) + 32.0;
    lcd.setCursor(11, 1);
    lcd.print((int)(degreesF+0.5));
    if(!sounded && (cpu > 75 || gpu > 85)) { // used for buzzer alarm
      tone(8, 500);
      delay(250);
      noTone(8);
      delay(250);
      tone(8, 500);
      delay(250);
      noTone(8);
      delay(250);
      tone(8, 500);
      delay(250);
      noTone(8);
      sounded = true;
    } else if(sounded && (cpu <= 75 && gpu <= 85)) {
      sounded = false;
    }
    newData = false;
  } 
}
void recvWithoutWhitespace() {
    static byte ndx = 0;
    static byte control = 0; // switch control variable
    char endMarker = 13; // ASCII code for carriage return
    char rc;
    char * check;

    while (Serial.available() > 0 && newData == false) {
        rc = Serial.read();
        check=strchr(invalids,rc); //checks if any spaces or line feeds get in

            if (check==NULL){ 
              if (rc != endMarker) {
                  charMap[ndx] = rc;
                  ndx++;
                 if (ndx >= numChars) {
                      ndx = numChars - 1;
                  }
             }
              else {
                switch(control) { // expect 4 CRs in format: (num)CRCR(num)CRCR
                  case 0:
                    control = 1; // skip first of 2 CRs
                    break;
                  case 1:
                    charMap[ndx] = 44; // put comma in place of CR between numbers as delimeter
                    ndx++;
                      if (ndx >= numChars) {
                        ndx = numChars - 1;
                      }
                    control = 2;
                    break;
                  case 2:
                    control = 3; // skip first of 2 CRs
                    break;
                  case 3:
                    charMap[ndx] = '\0'; // string terminator in place of last CR
                    ndx = 0;
                    control = 0;
                    newData = true;
                    break;
                }
              }
            }
    }
}
void parseData() {

    strcpy(tempChars, charMap); //strtok is destructive so copy string temporarily

    char * strtokIndx; // this is used by strtok() as an index

    strtokIndx = strtok(tempChars, ",");
    cpu = atoi(strtokIndx);     // convert cpu to an integer

    strtokIndx = strtok(NULL, ",");
    gpu = atoi(strtokIndx);     // convert gpu to an integer

}