zerglingbug 发表于 2014-4-11 00:29:24

arduino如何分割字符串

RT 从串口读取一个数据例如11,22,33,44 如何将数据从逗号处分开 吧11 22 33 44分别丢到4个不同的变量里面并且转换成int型啊
#include <Stdio.h>
String comdata = "";
void setup()
{
Serial.begin(9600);
}
void loop()
{
while (Serial.available() > 0)
{
   comdata += char(Serial.read());
   delay(2);
}
Serial.print(comdata);
Serial.println("");
if(Serial.available() > 0)
comdata = "";
}

Super169 发表于 2014-4-11 02:16:26

我習慣自己 檢查輸入的 string, 不知是否有類似 split 的 function.

先設定數值為 0, 再由左至右不斷向每一個 字符 測試, 如果是數字, 就把原先的值 X 10 + 新的數字.如果不是數字, 已又已經有數值, 就輸出一該數值, 然後 reset 為 0 再向後檢查直到完成整個 string.

转角 发表于 2014-4-11 08:57:51

char *strtok(char s[], const char *delim); char input = "abc,d";
    char *p;
    /**/ /* strtok places a NULL terminator
    in front of the token, if found */
    p = strtok(input, ",");
    if (p) printf("%s\n", p);
    /**/ /* A second call to strtok using a NULL
    as the first parameter returns a pointer
    to the character following the token */
    p = strtok(NULL, ",");
    if (p) printf("%s\n", p);

zerglingbug 发表于 2014-4-11 10:05:26

Super169 发表于 2014-4-11 02:16 static/image/common/back.gif
我習慣自己 檢查輸入的 string, 不知是否有類似 split 的 function.

先設定數值為 0, 再由左至右不斷向每 ...

根据你的思路写了这坨 但是打印t1的时候依旧没有内容
#include <Stdio.h>
String comdata = "";
int t1={0};
int mark =0;
void setup()
{
Serial.begin(9600);
}
void loop()
{int j=0;
while (Serial.available() > 0)
{comdata += char(Serial.read());
   delay(2);
   mark = 1;
}
if(mark == 1)
{Serial.println(comdata);
for(int i = 0; i < comdata.length() ; i++)
{if(comdata == ',')
{j++;}
else
{t1=t1*10+(comdata-'0');
}
}
Serial.println(t1);
}

//Serial.print(comdata);
//Serial.print(t1);
//Serial.println("");
if(Serial.available() > 0)
comdata = "";
}

转角 发表于 2014-4-11 11:01:26

这样哪?你试试
String comdata = "";
int t1={0};
int mark =0,i=0;
char *p=NULL;
void setup()
{
Serial.begin(9600);
}
void loop()
{
int j=0;
comdata="";
while (Serial.available() > 0)
{
   comdata += char(Serial.read());
   delay(2);
   mark = 1;
}
if(mark == 1)
{
    Serial.println(comdata);
    p=strtok((char*)comdata.c_str(),",");
    while(p)
    {
      t1=atoi(p);
      i++;
      p=strtok(NULL,",");
    }
}
for(int j=0;j<6;j++)
{
    Serial.println(t1);
}
}

Super169 发表于 2014-4-11 11:12:57

zerglingbug 发表于 2014-4-11 10:05 static/image/common/back.gif
根据你的思路写了这坨 但是打印t1的时候依旧没有内容
#include
String comdata = "";


ching 對 integer array 好像有些地方攪錯了.

只用 Serial.println(t1); 去顯示, 如果少於 7 個數, t1 無資料是合理的.
而且 int t1,t1 只有 6 個空間 , t1 會指向 t1 後的一個 資料, t1 是無意義的.

Serial.print 不支援 integer array, 不可以直接列印整個 array, 要用 loop 去顯示:
for (int x=0; x < 6; x++) Serial.println(t1);

春泥蛋炒饭 发表于 2014-4-11 11:14:44

最简单的办法是使用 Serial.parseInt() 函数。参考IDE里的例程 Read ASCII String

麽麽茶㊣ 发表于 2014-4-11 11:17:26

StringToIntRGB这个例子中直接有你要的代码
几乎一模一样。
这样回答多省事情!!!

Super169 发表于 2014-4-11 11:30:01

春泥蛋炒饭 发表于 2014-4-11 11:14 static/image/common/back.gif
最简单的办法是使用 Serial.parseInt() 函数。参考IDE里的例程 Read ASCII String

Serial.parseInt 也是用同一方法做的, 不斷檢查 個別字符, 遇數字再 x10 + c - '0', 針對 Stream input 的.

自己拆可以一次過完成整個 input string, 並針對有關需要作出不同變化, 而且可以對一般 String (char*) 進行分折, 但就要自己做點功夫了.

針對串口輸入, Serial.parseInt 確實會比較簡單一點.



zerglingbug 发表于 2014-4-11 12:35:31

麽麽茶㊣ 发表于 2014-4-11 11:17 static/image/common/back.gif
StringToIntRGB这个例子中直接有你要的代码
几乎一模一样。
这样回答多省事情!!!

看了例程
又写了一坨 发现com口的数据如果不是直接存到string里 而是先存到int型 然后在放到string里的话 输出就不知道是啥玩意了。。。。
#include <Stdio.h>
String comdata1 = "";
String comdata2 = "";

void setup()
{
Serial.begin(9600);
}
void loop()
{int inChar;
while (Serial.available() > 0)
{
   inChar = char(Serial.read());
}
if (isDigit(inChar)) {
    comdata1 += (char)inChar;
}
Serial.print(comdata1);

麽麽茶㊣ 发表于 2014-4-11 13:27:36

available 是一个缓冲区
Serial.read提取出一个 他就少一个
在while里面直接将缓冲区的东西提出完
String str += (char)Serial.read();
这就是你要的全部的字符串了。

你可以用mills函数 定时提取。也可以用停止符的方法提取。
“1,2,3#” 读到#否则一直提取。在单片机里面用停止符的方法是最好的。

你是要思路还是直接代码? 思路理解完是你自己的东西。


Super169 发表于 2014-4-11 14:12:07

zerglingbug 发表于 2014-4-11 12:35 static/image/common/back.gif
看了例程
又写了一坨 发现com口的数据如果不是直接存到string里 而是先存到int型 然后在放到string里的话 ...

串口收到的資料, 本身沒有什麼類型的, 就是最基本的一個一個 byte 的.
它是什麼類, 是由你自己去決定的.

就像是 0x31 的一個 byte, 你說它是一個 整數, 就把它看成是 49 的數值去用; 你說它是 '1', 就把它當成是 '1' 去用.

zerglingbug 发表于 2014-4-11 14:22:03

麽麽茶㊣ 发表于 2014-4-11 13:27 static/image/common/back.gif
available 是一个缓冲区
Serial.read提取出一个 他就少一个
在while里面直接将缓冲区的东西提出完


我的思路是这样子的 先用一个string类型+=char(Serial.read()); 这样就把串口发送的指令全部存到string类型里
然后再用一个char类型的数组 把string里面的东西扔到数组里面
最后在到数组里面一个一个字符判断 找到,就把剩下的字符写到第二个变量里面 否则就写进第一个变量里面
这样最后就能获得若干个char类型的数组 然后在转成int形式 就可以对元件进行控制了

麽麽茶㊣ 发表于 2014-4-11 14:29:40

你想的太多了。写代码前先排个草稿。既然要对元件控制还去考虑char数组干什么?直接int数组不就完了?
int led   int led .....

下面写了一个没试过。
int led;
void setup()
{
Serial.begin(9600);
}

int currentColor = 0;
int red, green, blue = 0;
String str0 = "";
void loop()
{
boolean bRev = false;

if(Serial.available()>0)
{
    char c = (char)Serial.read();
    if (c != '#')
    {
      str0 += c;
    }
    else
    {
      str0 += c;
      bRev = true;
    }
}
if(bRev)
{
    String light = "";
    int sLen = str0.length();
    for(int j = 0; j < sLen; j++)
    {
      if(str0 == ',')
      {
      j++;
      switch(currentColor)
      {
          case 0:
            red = light.toInt();
            led = red;
            light = "";
            break;
          case 1:
            green = light.toInt();
            led = green;
            light = "";
            break;
      }
      currentColor++;
      }
      if(str0 == '#')break;
      light += str0;
    }
    blue = light.toInt();
    led = blue;
    light = "";
    currentColor = 0;
   
    Serial.print(led);
    Serial.print('');
    Serial.print(led);
    Serial.print('');
    Serial.print(led);
    Serial.println("------------");
}
}

zerglingbug 发表于 2014-4-11 14:50:21

麽麽茶㊣ 发表于 2014-4-11 14:29 static/image/common/back.gif
你想的太多了。写代码前先排个草稿。既然要对元件控制还去考虑char数组干什么?直接int数组不就完了?
int ...

主要是int类型的话 我在com监视窗口不太好判断啊 搞了半天我已经接近成功了 已经能把com数据放到字符串里面并且判断逗号分割成两个量了。。现在就是不知道怎么分成3个量,循环想不出该咋写
#include <Stdio.h>
String comdata1 = "";
char t1;
void setup()
{
Serial.begin(9600);
}
void loop()
{int inChar;
while (Serial.available() > 0)
{
   comdata1 += char(Serial.read());
   delay(2);};
for(int i=0;i<10;i++)
{if (comdata1==',')
break;
t1=comdata1;}
Serial.print(comdata1);
Serial.print("//");
Serial.print(t1);
Serial.println("");
if(Serial.available() > 0)
comdata1="";
for(int i=0;i<10;i++)
t1='\0';
}
页: [1] 2
查看完整版本: arduino如何分割字符串