Character analysis operators 字符分析

这段代码是一个Arduino示例程序,用于演示如何使用字符分析操作符来分析接收到的字节。它会读取串行端口接收到的任何字节,并使用一系列函数来分析该字节的特性。它将分析结果通过串行通信发送到串行监视器。这种方法在需要对输入字符进行分类和分析时非常有用。

/*
  Character analysis operators

 Examples using the character analysis operators.
 Send any byte and the sketch will tell you about it.

 created 29 Nov 2010
 modified 2 Apr 2012
 by Tom Igoe

 This example code is in the public domain.
 */

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  // send an intro:
  Serial.println("send any byte and I'll tell you everything I can about it");
  Serial.println();
}

void loop() {
  // get any incoming bytes:
  if (Serial.available() > 0) {
    int thisChar = Serial.read();

    // say what was sent:
    Serial.print("You sent me: \'");
    Serial.write(thisChar);
    Serial.print("\'  ASCII Value: ");
    Serial.println(thisChar);

    // analyze what was sent:
    if (isAlphaNumeric(thisChar)) {
      Serial.println("it's alphanumeric");
    }
    if (isAlpha(thisChar)) {
      Serial.println("it's alphabetic");
    }
    if (isAscii(thisChar)) {
      Serial.println("it's ASCII");
    }
    if (isWhitespace(thisChar)) {
      Serial.println("it's whitespace");
    }
    if (isControl(thisChar)) {
      Serial.println("it's a control character");
    }
    if (isDigit(thisChar)) {
      Serial.println("it's a numeric digit");
    }
    if (isGraph(thisChar)) {
      Serial.println("it's a printable character that's not whitespace");
    }
    if (isLowerCase(thisChar)) {
      Serial.println("it's lower case");
    }
    if (isPrintable(thisChar)) {
      Serial.println("it's printable");
    }
    if (isPunct(thisChar)) {
      Serial.println("it's punctuation");
    }
    if (isSpace(thisChar)) {
      Serial.println("it's a space character");
    }
    if (isUpperCase(thisChar)) {
      Serial.println("it's upper case");
    }
    if (isHexadecimalDigit(thisChar)) {
      Serial.println("it's a valid hexadecimaldigit (i.e. 0 - 9, a - F, or A - F)");
    }

    // add some space and ask for another byte:
    Serial.println();
    Serial.println("Give me another byte:");
    Serial.println();
  }
}

功能概述

硬件部分

  • 使用Arduino开发板连接到计算机,通过串行通信接收数据。

软件部分

  • 读取串行端口接收到的字节。

  • 使用字符分析函数(如isAlphaNumericisAlphaisDigit等)分析该字节的特性。

  • 将分析结果通过串行通信发送到串行监视器。

代码逐行解释

setup() 函数

void setup() {
  // 初始化串行通信,波特率为9600
  Serial.begin(9600);
  while (!Serial) {
    ; // 等待串行端口连接。仅对Leonardo等板子需要
  }

  // 发送介绍信息
  Serial.println("send any byte and I'll tell you everything I can about it");
  Serial.println();
}
  • Serial.begin(9600):初始化串行通信,设置波特率为9600。

  • while (!Serial):等待串行端口连接。对于某些Arduino板子(如Leonardo),在串行端口未连接时,程序会卡在这里。

  • Serial.println():发送介绍信息到串行监视器。

loop() 函数

void loop() {
  // 检查串行端口是否有数据可用
  if (Serial.available() > 0) {
    int thisChar = Serial.read();  // 读取一个字节

    // 打印接收到的字符
    Serial.print("You sent me: '");
    Serial.write(thisChar);
    Serial.print("'  ASCII Value: ");
    Serial.println(thisChar);

    // 分析接收到的字符
    if (isAlphaNumeric(thisChar)) {
      Serial.println("it's alphanumeric");
    }
    if (isAlpha(thisChar)) {
      Serial.println("it's alphabetic");
    }
    if (isAscii(thisChar)) {
      Serial.println("it's ASCII");
    }
    if (isWhitespace(thisChar)) {
      Serial.println("it's whitespace");
    }
    if (isControl(thisChar)) {
      Serial.println("it's a control character");
    }
    if (isDigit(thisChar)) {
      Serial.println("it's a numeric digit");
    }
    if (isGraph(thisChar)) {
      Serial.println("it's a printable character that's not whitespace");
    }
    if (isLowerCase(thisChar)) {
      Serial.println("it's lower case");
    }
    if (isPrintable(thisChar)) {
      Serial.println("it's printable");
    }
    if (isPunct(thisChar)) {
      Serial.println("it's punctuation");
    }
    if (isSpace(thisChar)) {
      Serial.println("it's a space character");
    }
    if (isUpperCase(thisChar)) {
      Serial.println("it's upper case");
    }
    if (isHexadecimalDigit(thisChar)) {
      Serial.println("it's a valid hexadecimal digit (i.e. 0 - 9, a - F, or A - F)");
    }

    // 添加一些空行,并请求下一个字节
    Serial.println();
    Serial.println("Give me another byte:");
    Serial.println();
  }
}
  • if (Serial.available() > 0):检查串行端口是否有数据可用。

  • int thisChar = Serial.read():读取一个字节。

  • Serial.print()Serial.println():将接收到的字符及其ASCII值发送到串行监视器。

  • isAlphaNumeric(thisChar):检查字符是否为字母或数字。

  • isAlpha(thisChar):检查字符是否为字母。

  • isAscii(thisChar):检查字符是否为ASCII字符。

  • isWhitespace(thisChar):检查字符是否为空白字符。

  • isControl(thisChar):检查字符是否为控制字符。

  • isDigit(thisChar):检查字符是否为数字。

  • isGraph(thisChar):检查字符是否为可打印字符且不是空白字符。

  • isLowerCase(thisChar):检查字符是否为小写字母。

  • isPrintable(thisChar):检查字符是否为可打印字符。

  • isPunct(thisChar):检查字符是否为标点符号。

  • isSpace(thisChar):检查字符是否为空格字符。

  • isUpperCase(thisChar):检查字符是否为大写字母。

  • isHexadecimalDigit(thisChar):检查字符是否为有效的十六进制数字(0-9, a-F, A-F)。

  • Serial.println():发送分析结果到串行监视器。

工作原理

初始化

  • setup()函数中,初始化串行通信,设置波特率为9600。

  • 发送介绍信息到串行监视器。

读取数据

  • loop()函数中,检查串行端口是否有数据可用。

  • 如果有数据可用,读取一个字节。

分析数据

  • 使用一系列字符分析函数分析接收到的字节。

  • 将分析结果通过串行通信发送到串行监视器。

请求下一个字节

  • 发送提示信息,请求下一个字节。

视频讲解

BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)