stm32f4 关于strlen无法准确获取char*长度的问题

2019-07-20 13:52发布

不多说废话了,直接上代码

[mw_shl_code=c,true]
u8 tcp_send(void)
{
        u8 err;
        u8 *msg = OSQPend(q_msg,0,&err);
        if (msg!=NULL){
                u32 len = strlen((char *) msg);
                printf("%d ",len);
                err = netconn_write(tcp_clientconn, msg, len, NETCONN_COPY);
                if(err != ERR_OK){
                        myfree(SRAMIN,msg);
                        printf("发送失败 ");
                        return 0;
                }
        } else {
                printf("%s ","等待数据");
        }
        myfree(SRAMIN,msg);
        return 1;
}
[/mw_shl_code]

其中len的获取在1毫秒的发送状况下无法准确的获取长度,并且在出现该情况以后单条发送依然存在该问题,
下面是我发送的数据(每行数据以0D 0A结尾)
通信数据 通信数据

得出来的len都是30,即全是第一组数据的长度

若我使用自己编写的以0D为结尾获取长度的函数,则能够准确获取其长度如下:
[mw_shl_code=c,true]
u8 getSize(u8 *msg){
        u8 len=0;
        while (*msg++!=' ') len++;
        return len;
}
[/mw_shl_code]

希望有高手可以给我解答下,这到底是什么原因造成的
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
20条回答
335920284
1楼-- · 2019-07-21 08:12
 精彩回答 2  元偷偷看……
山丨海
2楼-- · 2019-07-21 09:25
335920284 发表于 2017-6-16 17:49
TCP粘包、断包都可能出现 建议加个数据包头,用几个字节表示长度,这样处理起来比较好吧。

先谢谢你了,不过还有些问题。

在程序里加入了判断后,发现添加进消息队列前输出的字符串是正确的,在另一个任务中取出后发现strlen字符串的长度都变成了最长包的长度了

还有我做的主要就是粘包测试,发送的数据本来就是模拟粘包的,目前断包的情况并没有出现,粘包的拆分也没问题,不过从消息队列取出后字符串的长度获取会出现问题,测试过程中觉得ucosii的消息队列并没什么问题,应该就是在强制转换取数据类型或者读取长度时出了问题,并且之后我再单条发送的话长度获取一直存在问题,一直都是最长的数据长度,怀疑是RAM内某些地方乱了,但是实力有限,没办法再进一步去做问题的分析了,能给我解答下吗?
335920284
3楼-- · 2019-07-21 11:31
在给消息队列赋值时,先做清零操作试试吧
山丨海
4楼-- · 2019-07-21 16:44
 精彩回答 2  元偷偷看……
山丨海
5楼-- · 2019-07-21 19:19
 精彩回答 2  元偷偷看……
jokeym
6楼-- · 2019-07-21 21:14
打个断点仿一下不就知道了

一周热门 更多>