[Arduino] 在串口读取多个字符串,并且转换为数字数组

功能如题目。
在串口收到逗号分割的6串数字比如
100,200,45,4,87,99
然后在6个PWM端口3, 5, 6, 9, 10, 11输出对应PWM值
代码注释很详细了,就不再说明了。

 

//定义一个comdata字符串变量,赋初值为空值
    String comdata = "";
    //numdata是分拆之后的数字数组
    int numdata[6] = {0}, PWMPin[6] = {3, 5, 6, 9, 10, 11}, mark = 0;
    void setup()
    {
    //定义0~6脚是输出
      for(int i = 0; i < 6; i++) pinMode(PWMPin[i], OUTPUT);
      Serial.begin(9600);
    }
     
    void loop()
    {
    //j是分拆之后数字数组的位置记数
      int j = 0;
     
      //不断循环检测串口缓存,一个个读入字符串,
      while (Serial.available() > 0)
      {
      //读入之后将字符串,串接到comdata上面。
        comdata += char(Serial.read());
          //延时一会,让串口缓存准备好下一个数字,不延时会导致数据丢失,
        delay(2);
        //标记串口读过数据,如果没有数据的话,直接不执行这个while了。
        mark = 1;
      }
     
      if(mark == 1)  //如果接收到数据则执行comdata分析操作,否则什么都不做。
      {
      //显示刚才输入的字符串(可选语句)
        Serial.println(comdata);
          //显示刚才输入的字符串长度(可选语句)
        Serial.println(comdata.length());
     
    /*******************下面是重点*******************/
    //以串口读取字符串长度循环,
        for(int i = 0; i < comdata.length() ; i++)
        {
        //逐个分析comdata[i]字符串的文字,如果碰到文字是分隔符(这里选择逗号分割)则将结果数组位置下移一位
        //即比如11,22,33,55开始的11记到numdata[0];碰到逗号就j等于1了,
        //再转换就转换到numdata[1];再碰到逗号就记到numdata[2];以此类推,直到字符串结束
          if(comdata[i] == ',')
          {
            j++;
          }
          else
          {
             //如果没有逗号的话,就将读到的数字*10加上以前读入的数字,
             //并且(comdata[i] - '0')就是将字符'0'的ASCII码转换成数字0(下面不再叙述此问题,直接视作数字0)。
             //比如输入数字是12345,有5次没有碰到逗号的机会,就会执行5次此语句。
             //因为左边的数字先获取到,并且numdata[0]等于0,
             //所以第一次循环是numdata[0] = 0*10+1 = 1
             //第二次numdata[0]等于1,循环是numdata[0] = 1*10+2 = 12
             //第三次是numdata[0]等于12,循环是numdata[0] = 12*10+3 = 123
             //第四次是numdata[0]等于123,循环是numdata[0] = 123*10+4 = 1234
             //如此类推,字符串将被变成数字0。
            numdata[j] = numdata[j] * 10 + (comdata[i] - '0');
          }
        }
        //comdata的字符串已经全部转换到numdata了,清空comdata以便下一次使用,
        //如果不请空的话,本次结果极有可能干扰下一次。
        comdata = String("");
     
     
        //循环输出numdata的内容,并且写到PWM引脚
        for(int i = 0; i < 6; i++)
        {
          Serial.print("Pin ");
          Serial.print(PWMPin[i]);
          Serial.print(" = ");
          Serial.println(numdata[i]);
          analogWrite(PWMPin[i], numdata[i]);
          numdata[i] = 0;
        }
        //输出之后必须将读到数据的mark置0,不置0下次循环就不能使用了。
        mark = 0;
      }
    }

转载于:https://www.cnblogs.com/jqmtony/p/3764846.html

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将 Arduino 串口输入的字符串转换数组,可以使用 `strtok()` 函数将字符串分割成多个字符串,并将它们存储在一个字符数组中。以下是一个示例代码: ```c++ #define MAX_INPUT_LENGTH 50 // 定义最大输入长度 char inputString[MAX_INPUT_LENGTH]; // 定义输入字符串数组 char *tokens[MAX_INPUT_LENGTH]; // 定义分割后的子字符串数组 int tokenCount = 0; // 分割后的子字符串数量 void setup() { Serial.begin(9600); // 初始化串口 } void loop() { if (Serial.available()) { // 如果串口有输入 char c = Serial.read(); // 读取输入字符 if (c == '\n') { // 如果输入字符为换行符 inputString[tokenCount] = '\0'; // 在输入字符串末尾添加结束符 tokenCount = 0; // 重置子字符串数量 char *token = strtok(inputString, ","); // 分割输入字符串并获取第一个子字符串 while (token != NULL) { // 如果还有子字符串 tokens[tokenCount++] = token; // 将子字符串添加到数组中 token = strtok(NULL, ","); // 获取下一个子字符串 } // 现在 tokens 数组中存储了分割后的子字符串,可以对它们进行处理 Serial.println("Input received:"); // 输出提示信息 for (int i = 0; i < tokenCount; i++) { // 遍历子字符串数组 Serial.print(i); // 输出子字符串的下标 Serial.print(": "); // 输出分隔符 Serial.println(tokens[i]); // 输出子字符串 } } else if (tokenCount < MAX_INPUT_LENGTH - 1) { // 如果输入字符不是换行符且输入字符串未满 inputString[tokenCount++] = c; // 将输入字符添加到输入字符串中 } } } ``` 在上面的示例代码中,我们首先定义了一个最大输入长度为 50 的输入字符串数组 `inputString`,以及一个最大长度为 `MAX_INPUT_LENGTH` 的分割后的子字符串数组 `tokens`。然后在 `setup()` 函数中初始化串口,然后在 `loop()` 函数中不断读取串口输入。 当读取到的输入字符为换行符时,我们先在输入字符串末尾添加结束符,然后使用 `strtok()` 函数将输入字符串分割成多个字符串,并将它们存储在 `tokens` 数组中。在遍历 `tokens` 数组时,我们可以对每个子字符串进行处理。 如果输入字符不是换行符且输入字符串未满,我们将输入字符添加到输入字符串中。如果输入字符串已满,我们将不再添加新字符,直到读取到换行符为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值