极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26005|回复: 15

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

[复制链接]
发表于 2014-1-13 20:50:24 | 显示全部楼层 |阅读模式
本帖最后由 yaoyonghe 于 2014-1-16 22:47 编辑

anduino下载了个模拟遥杆的蓝牙串口app,想搞个航模用接收机,

串口出来的数据如下:

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


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



感谢i7456,,,,1路油门+1路电磁舵已经好了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-1-13 23:49:12 | 显示全部楼层
arduino精华里面学习笔记A6
回复 支持 反对

使用道具 举报

发表于 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);
        }
}
回复 支持 反对

使用道具 举报

发表于 2014-1-14 00:38:39 | 显示全部楼层
  1. // serial.ino
  2. String st[4];

  3. void setup()
  4. {
  5.         Serial.begin(9600);

  6. }

  7. void loop()
  8. {
  9.         while(Serial.available())
  10.         {
  11.             char c = Serial.read();
  12.             //Serial.println(c);
  13.             delay(100);
  14.             if(c == 'm')

  15.             for(int i = 0; i < 4; i++)
  16.             {
  17.                     st[i] = 0;

  18.                     for(int j = 0; j < 3; j++)
  19.                     {
  20.                             char  cr = Serial.read();
  21.                             st[i]+= cr;
  22.                     }       
  23.             }

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


  26.             for(int index = 0; index < 4; index++)
  27.                     Serial.println(st[index].toInt());  
  28.        
  29.         }
  30. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-14 10:20:02 | 显示全部楼层
i7456 发表于 2014-1-14 00:38

感谢!.....
要是有个注识说明下更好!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-14 10:21:21 | 显示全部楼层
windaoo 发表于 2014-1-13 23:49
新人第一次发贴测试~~

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

这段好似更牛...good!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-14 12:08:53 | 显示全部楼层
i7456 发表于 2014-1-14 00:38


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-1-14 13:01:09 | 显示全部楼层
yaoyonghe 发表于 2014-1-14 12:08
反回这样的,,似乎不是按我给的输入格式写的?。。。(波特率已改)

波特率是9600;

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

返回:
10
20
30
-40

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-1-14 13:33:14 | 显示全部楼层
yaoyonghe 发表于 2014-1-14 10:20
感谢!.....
要是有个注识说明下更好!

太简单,没办法注释了
回复 支持 反对

使用道具 举报

发表于 2014-1-14 13:47:22 | 显示全部楼层
能把发送端 代码 也发上来么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-14 17:38:26 | 显示全部楼层
本帖最后由 yaoyonghe 于 2014-1-14 17:44 编辑
pww999 发表于 2014-1-14 13:47
能把发送端 代码 也发上来么?



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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-1-15 22:06:16 | 显示全部楼层
本帖最后由 friskit 于 2014-1-15 22:09 编辑

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

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

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

使用道具 举报

发表于 2014-1-16 10:30:23 | 显示全部楼层
各种不懂
回复 支持 反对

使用道具 举报

发表于 2014-1-16 14:34:32 来自手机 | 显示全部楼层
各种关注,各种学习
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-16 21:03:51 | 显示全部楼层
i7456 发表于 2014-1-14 13:33
太简单,没办法注释了

原来这样........看了一堆贴子,与'笔记A6'最大区别是用了.toInt() 这个函数,直接将 string字符转换成int数据
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 17:37 , Processed in 0.044225 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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