yaoyonghe 发表于 2014-1-13 20:50:24

#请问如何将串口接收到的一串数值分割截取成多个变量?#

本帖最后由 yaoyonghe 于 2014-1-16 22:47 编辑

anduino下载了个模拟遥杆的蓝牙串口app,想搞个航模用接收机,
http://image.geek-workshop.com/forum/201401/14/173820tsf2scb02nr26b2m.png
串口出来的数据如下:

数据格式 :   m±00±00±00±00   //m后面4组数值范围-39~+39,没有逗号分割,模拟遥杆动一下数据会刷新一次


我想将4组数分别定义为4个变量:CH1、CH2、CH3、CH4,方便后面各种舵机电调输出,但是找到的教程都是讲如何读1 个字符,什么ajson的看不懂,请大侠指点下!



感谢i7456,,,,1路油门+1路电磁舵已经好了
http://player.youku.com/player.php/sid/XNjYyNTczOTQ0/v.swf

yhy1993226 发表于 2014-1-13 23:49:12

arduino精华里面学习笔记A6

windaoo 发表于 2014-1-13 23:49:31

新人第一次发贴测试~~

如果是要C语言的,供你参考
真的要在机器上跑最好在 sscanf 之前加点代码检查一下字符串长度、边界什么的

#include <stdio.h>
#include <string.h>

int main()
{
      int CH1, CH2, CH3, CH4;
      char serial_data_buf[] = "m-30+00+00+02m-30+00+00+02m-30+00+00+02";
      char *p = serial_data_buf;

      while (p = strstr(p, "m")) {
                sscanf(++p, "%d%d%d%d", &CH1, &CH2, &CH3, &CH4);
                printf("%d %d %d %d\n", CH1, CH2, CH3, CH4);
      }
}

i7456 发表于 2014-1-14 00:38:39

// serial.ino
String st;

void setup()
{
        Serial.begin(9600);

}

void loop()
{
        while(Serial.available())
        {
          char c = Serial.read();
          //Serial.println(c);
          delay(100);
          if(c == 'm')

          for(int i = 0; i < 4; i++)
          {
                  st = 0;

                  for(int j = 0; j < 3; j++)
                  {
                          charcr = Serial.read();
                          st+= cr;
                  }       
          }

          while(Serial.available())
          Serial.read();


          for(int index = 0; index < 4; index++)
                  Serial.println(st.toInt());
       
        }
}

yaoyonghe 发表于 2014-1-14 10:20:02

i7456 发表于 2014-1-14 00:38 static/image/common/back.gif


:handshake感谢!.....
要是有个注识说明下更好!

yaoyonghe 发表于 2014-1-14 10:21:21

windaoo 发表于 2014-1-13 23:49 static/image/common/back.gif
新人第一次发贴测试~~

如果是要C语言的,供你参考


这段好似更牛...good!

yaoyonghe 发表于 2014-1-14 12:08:53

i7456 发表于 2014-1-14 00:38 static/image/common/back.gif



反回这样的,,似乎不是按我给的输入格式写的?。。。(波特率已改)

i7456 发表于 2014-1-14 13:01:09

yaoyonghe 发表于 2014-1-14 12:08 static/image/common/back.gif
反回这样的,,似乎不是按我给的输入格式写的?。。。(波特率已改)

波特率是9600;

输入框中输入:m+10+20+30-40

返回:
10
20
30
-40

i7456 发表于 2014-1-14 13:33:14

yaoyonghe 发表于 2014-1-14 10:20 static/image/common/back.gif
感谢!.....
要是有个注识说明下更好!

太简单,没办法注释了

pww999 发表于 2014-1-14 13:47:22

能把发送端 代码 也发上来么?

yaoyonghe 发表于 2014-1-14 17:38:26

本帖最后由 yaoyonghe 于 2014-1-14 17:44 编辑

pww999 发表于 2014-1-14 13:47 static/image/common/back.gif
能把发送端 代码 也发上来么?


原码没有哦,是田中鬼子写的APP....play上搜 BT indoorControl

喜欢它界面够简结,无多余的附加功能

friskit 发表于 2014-1-15 22:06:16

本帖最后由 friskit 于 2014-1-15 22:09 编辑

如果发送的信息不为了给人看,建议你最好按照二进制格式发送。。。规定好数据发送格式。这样对数据的发送和解析都非常方便。。。。否则数据解析那头要做的工作太多了!!!

如果你发送的数据的“位格式”是对其的。。例如数字都是00-99这种两位数啊神马的,还是比较好实现的。。。因为收到的数据就是一串字符串数组,固定的位数都有固定的意图,写死了就好

但是如果牵涉到位数不对齐就又麻烦了。。。这时候有两种方法。是以前编译原理课上学到过的方法:
1,递归下降子程序。。。
2,有限状态机。
(反正就是个词法分析器。。。)

_雅丶 发表于 2014-1-16 10:30:23

各种不懂:(:(:(

maxims 发表于 2014-1-16 14:34:32

各种关注,各种学习

yaoyonghe 发表于 2014-1-16 21:03:51

i7456 发表于 2014-1-14 13:33 static/image/common/back.gif
太简单,没办法注释了

原来这样........看了一堆贴子,与'笔记A6'最大区别是用了.toInt() 这个函数,直接将 string字符转换成int数据
页: [1] 2
查看完整版本: #请问如何将串口接收到的一串数值分割截取成多个变量?#