OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3383|回复: 7

串口接收到数据+1返回,求主函数

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-10-29
在线时间
10 小时
发表于 2019-12-4 11:30:50 | 显示全部楼层 |阅读模式
1金钱
初学者求助:
求一个串口接收到数据+1后返回的主函数,根据原子哥的程序,自己琢磨了2天没琢磨出来怎么改,不清楚接收到字节后,应该怎么处理整合为一个数字,然后加1,返回出来。
捕获.PNG

最佳答案

查看完整内容[请看2#楼]

http://www.openedv.com/forum.php?mod=viewthread&tid=301408&extra=
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-12-4 11:30:51 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-12-5 02:12:27 | 显示全部楼层
继续努力
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2019-12-5 08:56:46 | 显示全部楼层
接收到的数据是ascii码,可以把数据存到字符数组里面,再atoi转成整形变成数字。

比如这段程序就是简单的分离美元号之间的数字 A$1000$3000 就能分离出1000 和 3000

  1. void Analysis_data(u8 *USART_RX_BUF,u32 *freq, u16 *pulse)
  2. {
  3.         u8 *p = USART_RX_BUF;
  4.         u8 pos = 0, pos1 = 0;
  5.         u8 len = 0;
  6.         u8 *ff,*pp;
  7.         u8 ff1[6] = {0};
  8.        
  9.         pos = NMEA_Comma_Pos(p,1);
  10.         pos1 = NMEA_Comma_Pos(p,2);
  11.         len = pos1 - pos - 1;
  12.        
  13.         ff = p+pos;
  14.         pp = p+pos1;
  15.         if(len>6)
  16.         {
  17.                 printf("输入格式有误!!!\r\n");
  18.                 return ;
  19.         }
  20.         strncpy((char *)ff1,(char *)ff,len);
  21.         *freq = atoi((char *)ff1);
  22.         *pulse = atoi((char *)pp);
  23. }


  24. //m^n函数
  25. //返回值:m^n次方.
  26. u32 NMEA_Pow(u8 m,u8 n)
  27. {
  28.         u32 result=1;         
  29.         while(n--)result*=m;   
  30.         return result;
  31. }

  32. u8 NMEA_Comma_Pos(u8 *buf,u8 cx)
  33. {                             
  34.         u8 *p=buf;
  35.         while(cx)
  36.         {
  37. //                if(*buf==''||*buf<' '||*buf>'z')
  38. //                {
  39. //                        return 0XFF;//遇到'*'或者非法字符,则不存在第cx个逗号
  40. //                }
  41.                 if(*buf==')cx--;
  42.                 buf++;
  43.         }
  44.         return buf-p;
  45. }
复制代码
茵茵猪头
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-12-5 09:40:00 | 显示全部楼层
htao 发表于 2019-12-5 08:56
接收到的数据是ascii码,可以把数据存到字符数组里面,再atoi转成整形变成数字。

比如这段程序就是简单 ...

sscanf("A$1000$3000","A$%d$%d",&a,&b)  
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2019-12-5 10:06:02 | 显示全部楼层
nashui_sx 发表于 2019-12-5 09:40
sscanf("A$1000$3000","A$%d$%d",&a,&b)

是的哦,,,被GPS的解析带偏了,写了个类似的。。。
为啥GPS里面不用 sscanf


茵茵猪头
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-12-5 10:17:30 | 显示全部楼层
htao 发表于 2019-12-5 10:06
是的哦,,,被GPS的解析带偏了,写了个类似的。。。
为啥GPS里面不用 sscanf

也可以但是gps有个硬伤 就是数据段可以为空就是两个逗号之间可以无数据sscanf虽然可以用通配符设置遇到,号截止扫描 但是数据段为空就bug了  sscanf之前还要检测数据起始是第几个逗号 在检测和下一个逗号之间有没有数据 有sscanf    所以省事不到那里去
还有就是c标准字符串没有查询第n个指定字符位置的标准函数strnchr 要自己写
估计基于这几种原因他们就自己写了(还有就是他们爱自己造函数,很少见他们用标准函数),不过用的话还是舒服点 通用性高
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2019-12-5 10:43:04 | 显示全部楼层
nashui_sx 发表于 2019-12-5 10:17
也可以但是gps有个硬伤 就是数据段可以为空就是两个逗号之间可以无数据sscanf虽然可以用通配符设置遇到, ...

受教了
茵茵猪头
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 20:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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