你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

提取出如下字符串,应该用什么函数呢?HAL的库

[复制链接]
tryfly 提问时间:2019-11-19 21:54 /


1,串口发来的数据格式是
"命令名+空格+id1+空格+id2+空格+id3+空格+id4+空格+id5+空格+"string"\r"
例如如下的真实数据:
revdata 1 1 17 1 2 "hi"\r

2,请问我怎么把收到的数据用5个变量保存,比如我定义了变量如下:
uint8_t id1,id2,id3,id4,id5;
char *string;

最终我想要得到的结果是
id1=1
id2=1
id3=17
id4=1
id5=2
*string="string"

3,
有时候命令只带id1,id2
有时候命令只带id1,id2,id3
有时候命令只带id1,id2,id3,id4
有时候命令只带id1,id2,id3,id4,id5
也就是说,revdata后面跟的数据个数不一定。

请问我这个问题应该怎么解决呢?一筹莫展,谢谢大家了。


收藏 1 评论17 发布时间:2019-11-19 21:54

举报

17个回答
radio2radio 回答时间:2019-11-24 20:48:41
sos博 发表于 2019-11-24 18:01
不是不用是不知道啊,你说这个cjson是啥?别告诉我要改原数据,原数据是必须那个格式,不给我商量余地。
...

你这个也不是很难,不过我也没有做过,不能给你完整的方法。

首先,判断是否收到“命令名",没有问题吧。
接下来,调用一个提取数据的子程序:

    1. 取一个字符,如果是引号(")则返回进入结束的字符串处理。
    2. 如果字符为0x30-0x39,则放入temp【0】,否则返回出错。
    3. 取第二个字符,为0x30-0x39,则放入temp【1】;如果为0x20,就返回temp【0】-0x30;否则返回出错。
    4. 取第三个字符,为0x30-0x39,则放入temp【2】;如果为0x20,就返回(temp【0】-0x30)*10 + (temp【1】-0x30);否则返回出错。
    5. 取第四个字符,如果为0x20,就返回(temp【0】-0x30)*100 + (temp【1】-0x30)*10 +  (temp【2】-0x30);否则返回出错。

正常的返回值,放入idx。重复上面的就得到idx+1.

结束的字符串处理,笨办法就是逐个拷贝两个引号之间的字符到string[x],结束后再放一个[0x00]字符串结束符。


yklstudent 回答时间:2019-12-9 21:10:27
sos博 发表于 2019-11-24 18:01
不是不用是不知道啊,你说这个cjson是啥?别告诉我要改原数据,原数据是必须那个格式,不给我商量余地。
...

为什么自己就不会主动去了解cjson?
cjson就是
发送方:把数据打包字符串然后发送出去
接收放:接收字符串,把字符串转换为数据;
tryfly 回答时间:2019-11-24 18:01:14

不是不用是不知道啊,你说这个cjson是啥?别告诉我要改原数据,原数据是必须那个格式,不给我商量余地。
话说告stm32的都是什么思维呢?说个问题,一般不给你解答,然后说你把问题修改一下就好了。
STM1024 回答时间:2019-11-19 23:13:41
C函数:strtok,C 标准库 - <string.h>参考一下,这个基本可以满足要求,就是写起来稍微麻烦一些。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

李康1202 回答时间:2019-11-20 08:49:42
大概就是这个样子
1574210926(1).jpg

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

慎微 回答时间:2019-11-20 08:54:49
单个 内容跟空格比较,得前后地址增量,按起始址及长度取 命令,ID,字符串即可。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

子曰好人 回答时间:2019-11-20 09:10:30
在数据格式中加入数据长度就可以判定了
lwg8458 回答时间:2019-11-20 13:58:38
接收时计数,确定每帧长度,然后根据长度分配
tryfly 回答时间:2019-11-21 12:10:30
lwg8458 发表于 2019-11-20 13:58
接收时计数,确定每帧长度,然后根据长度分配

不行的,只知道第几个空格后面是什么类型数据,数据长度是不一定的。那字符串来什么字符都可能,确定不了长度。
tryfly 回答时间:2019-11-21 12:11:17
子曰好人 发表于 2019-11-20 09:10
在数据格式中加入数据长度就可以判定了

长度不可知。实时数据,长度是不定的。
tryfly 回答时间:2019-11-21 12:13:35
stm1024 发表于 2019-11-19 23:13
C函数:strtok,C 标准库 - 参考一下,这个基本可以满足要求,就是写起来稍微麻烦一些。
...

好像很好。是我想要的。像python和java等里面都有个split函数,很简单就能拆分了字符串。感谢。
子曰好人 回答时间:2019-11-21 15:01:00
sos博 发表于 2019-11-21 12:11
长度不可知。实时数据,长度是不定的。

下位机发数据的时候包含数据长度不就知道了吗,协议自己定,如果你没办法改协议就当我没说
yklstudent 回答时间:2019-11-21 16:47:02
为什么不用cJSON呢
yangc9 回答时间:2019-11-21 16:52:36
你需要sscanf
涛哥2035 回答时间:2019-11-22 10:41:01
sprintf()执行效率是真的低
STM1024 回答时间:2019-11-23 09:45:20
sos博 发表于 2019-11-21 12:13
好像很好。是我想要的。像python和java等里面都有个split函数,很简单就能拆分了字符串。感谢。 ...

Split函数我当然知道,C#里面也有,指定一个分隔符,就可以自动分割并反馈一个字符串数组,问题是C没有对等的函数,除非你自己实现。
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版