串口处理字符串输出指定统计信息-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6137|回复: 7

串口处理字符串输出指定统计信息

[复制链接]
发表于 2020-11-22 21:01 | 显示全部楼层 |阅读模式
本帖最后由 topdog 于 2021-1-24 15:04 编辑

设问串口接收一串字符串,要求打印出全部字符串,统计一共有几个整数,找出最大的整数数值,这个数字在字符串中的位置。

question9c.JPG


1,串口接收单个的字符,把它们连接成字符串inputString。

2,do-while循环与while循环的不同在于:它会先执行循环体,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while 循环至少要执行一次循环体。

3,字符串处理函数
myString.indexOf(),在一个字符串中查找一个字符或字符串的索引。默认情况下,搜索从字符串的开头开始,但也可以从给定的索引开始,从而允许至尾端查找字符或字符串的所在索引。myString.indexOf(val, from),小括号里val是查找条件, 题目里给出的空格。from开始搜索的索引。缺省值零。字符串中val的索引,如果没有找到则为-1。

4,字符串处理函数
myString.substring(A,B),获取字符串的子字符串。起始索引A是包含性的(对应字符包含在子字符串中),但是可选的结束索引B是独占性的(对应字符不包含在子字符串中)。如果省略了结束索引,则子字符串将继续到字符串的末尾。

5,字符串处理函数
myString.toInt()将有效字符串转换为整数。输入字符串应该以一个整数开始。如果字符串包含非整数,函数将停止执行转换。

6,例如:809,66,829,432,113,971,338,816,590,238,358,330,636,867,  为了看清楚空格位置用逗号标注。SpaceIndex = inputString.indexOf(', ')给出第一个逗号的序列值,然后inputString.substring(0, SpaceIndex).toInt() 第一截取字符串,第二把它转化成整数,再次,去除809形成新的字符串
inputString.substring(SpaceIndex + 1)。如此循环直到尾端。特别强调867后面有个逗号,如果是空格的话请不要忘记输入。

7,请注意程序首部是全局变量,在loop花括号里面的是局部变量,运行结束都要清零呦。

[pre]String inputString = "";
bool Status = false;

void setup()
{
  Serial.begin(9600);
  inputString.reserve(200);
  Serial.println("Please input");
}

void loop()
{
  int SpaceNum = 0;
  int Max = 0;
  int MaxPosition = 0;
  int Position = 0;
  int SpaceIndex = 0;

  if (Status)
  {
    Serial.println(inputString);   

    do
    {
      SpaceIndex = inputString.indexOf(' ');

      if (SpaceIndex != -1)
      {
        SpaceNum = inputString.substring(0, SpaceIndex).toInt();
        inputString = inputString.substring(SpaceIndex + 1);
        ++Position;
        if (SpaceNum > Max)
        {
          Max = SpaceNum;
          MaxPosition = Position;
        }
      }
      else
      {
        Serial.print("Size of input data = ");
        Serial.print(Position);
        Serial.println(" integers");
        Serial.print("Max = ");
        Serial.println(Max);
        Serial.print("Max position = ");
        Serial.println(MaxPosition);
        Serial.println(" ");
        Serial.println("Please input");

        inputString = "";
        Serial.flush();
        Status = false;
      }
    } while (inputString.length() > 0);
  }
}

void serialEvent()
{
  if (Serial.available())
  {
    char inChar = (char)Serial.read();

    inputString += inChar;

    if (inChar == '\n')
    {
      Status = true;
    }
  }
}[/pre]



发表于 2020-11-22 23:33 | 显示全部楼层
感谢前辈详解,获益良多
 楼主| 发表于 2020-11-22 23:38 | 显示全部楼层
p1230 发表于 2020-11-22 23:33
感谢前辈详解,获益良多

感谢p123的关注和指导,一起学习一起进步。
 楼主| 发表于 2020-11-22 23:41 | 显示全部楼层

这是一个很有趣的例子,Aduino字符串处理语法非常独特值得推敲。小巧玲珑,独具匠心。
发表于 2020-11-26 18:23 | 显示全部楼层
老师是什么专业的?基本功很扎实,我遇到串口就懵了,前两天那个串口接收再处理的东西到现在还没搞定呢
 楼主| 发表于 2020-11-26 21:50 | 显示全部楼层
redtxd 发表于 2020-11-26 18:23
老师是什么专业的?基本功很扎实,我遇到串口就懵了,前两天那个串口接收再处理的东西到现在还没搞定呢:' ...

这是给你的两个控制程序 https://www.arduino.cn/thread-102053-1-1.html 都可以用呀!
发表于 2022-3-20 19:40 | 显示全部楼层
学习了,谢谢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-30 23:50 , Processed in 0.173432 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表