OpenEdv-开源电子网

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

请教比较有经验的大佬,你们有没有用过sscanf这个格式化解析函数并遇到一些问题

[复制链接]

74

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2021-2-5
在线时间
133 小时
发表于 4 天前 | 显示全部楼层 |阅读模式
现象:在我们的一个项目里面,使用sscanf函数解析一个字符串,大概反复解析100次会遇到一次解析失败
疑惑:其实之前从来没有想过这个解析函数会解析失败,因为这里等于就是1+1一定会等于2一样不会出错,我在解析之前打印了字符串,确实不是空字符串
分析:一开始我以为是因为我们加了freertos,pendsv的快速中断会影响这里的解析,所以我在解析的前后加上了临界区,但还是出错,于是就排除了中断带来的问题,不是空字符串,也不是中断的影响,那就再去怀疑内存的问题,这里解析失败之后,代码还是正常运行所以我又不好再去怀疑内存的问题,最后再去怀疑解析格式的问题,代码如下:
void execEquipCmd(char *btBuff)
{
    uint32_t cmdCode = 0;
    uint32_t i = 0;

        char *p = btBuff;
       
    /* 定位到第三个引号后面(指令值) */
    for (i = 0; i < 3; i++)
        p = strchr(p, '\"') + 1;
       
        /* BDE协议 */
        p = strchr(p,';') + 1;

        /* 解析指令码 */
    sscanf(p, "%d;", &cmdCode);
.................................................

这里就是把字符串中的一个数值解析到cmdcode中,格式用%u或%d都会遇到,实在想不到到底哪里的问题了
       
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

3280

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8182
金钱
8182
注册时间
2020-5-11
在线时间
3694 小时
发表于 4 天前 | 显示全部楼层
不了解\没用过这函数.
建议把堆栈(或任务栈)设置大一些,或不用库函数而是自己写代码去实现解析.
参考:
https://blog.csdn.net/weixin_44583910/article/details/140491852
专治疑难杂症
回复 支持 反对

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4584
金钱
4584
注册时间
2015-1-10
在线时间
573 小时
发表于 4 天前 | 显示全部楼层
加个返回值判断,然后打个断点,看看失败的时候P里面是啥
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 01:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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