这个知识还热着呢,刚刚学来。...
最近做了一个小东西,通过串口通信,把电脑上运行的labview和单片机连到了一起。
我的想法是这样的,我会在labview的图形界面设置好一系列参数,然后在把所有参数转成字符串然后按顺序连接起来,
例如:p1.2i33d4.445s7这样子。
电脑就把这样一个字符串扔给了单片机,然后我需要在单片机上进行数据提取。
先是定义好几个准备接收的字符串,P[10]、I[10]、D[10]、S[10],
我希望得到这样的结果:
P[10]=1.2
I[10]=33
D[10]=4.44
S[10]=7
弄了半天,都做不出来。
后来上了CSDN发帖 原帖地址http://bbs.csdn.net/topics/390947907?page=1#post-398634936
得到了超级满意的答案。
首先是sscanf()这个函数,之前完全没有接触过,现在突然发觉,C语言的标准库竟如此强大!
//=======================================================================
用法:
1. 常见用法。
char buf[512] = ;
sscanf("123456 ", "%s", buf);
printf("%s\n", buf);
结果为:123456
2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
结果为:1234
3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
结果为:123456
4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf
5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf
6、给定一个字符串iios/[email protected],获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非‘@‘的一串内容送到buf中
sscanf("iios/[email protected]", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
结果为:12DDWDFF
7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
sscanf(“hello, world”, "%*s%s", buf);
printf("%s\n", buf);
结果为:world
%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
如果没有空格则结果为NULL。
//=====================================================================
再回到刚刚的问题,我是这样解决的
char str[];
char *p;
float kp,ki,kd,speedx;
p=str;
sscanf(p,"%fp%fi%fd%fs",&kp,&ki,&kd,&speedx);
最终得到了想要的结果,完美!
再次感叹,C语言真强大。