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条回答
lvehe
1楼-- · 2019-07-20 16:48
 精彩回答 2  元偷偷看……
山丨海
2楼-- · 2019-07-20 18:20
lvehe 发表于 2017-6-16 10:23
标准C字符串是什么意思知道吗,以''结尾的。你发送的字符串没有以''结尾,用strlen读到的字符串长度自 ...

好吧,我把字符串赋值那部分代码也粘上吧
[mw_shl_code=c,true]
u8 find(u8 *msg,u8 err,u32 data_len)
{
        u32 i=0,start=0;
        u8 len=0;
        u8* msg_data;
        if (data_len>0){
                do{
                        if (*(msg+i) == ' ' & *(msg+i+1) == ' '){               
                                msg_data = mymalloc(SRAMIN,len+1);                               
                                mymemcpy(msg_data,msg+start,len+1);
                                putTCPQmsg(msg_data,err);
                                i++;
                                start = i + 1;
                                len=0;
                        } else {
                                len++;
                        }
                }while(i++<data_len-1);
        }
        return 0;
}
[/mw_shl_code]
然后发现3ms为间隔发送的时候不会出这个问题,
1ms为间隔发送的时候一开始也不出这个问题,随着时间的延长才会出现
山丨海
3楼-- · 2019-07-20 19:21
一段段贴代码太麻烦了,直接打包上传了,欢迎高手测试,希望能得到解答,板子是stm32f407zgt的
project7z.zip (3.3 MB, 下载次数: 82) 2017-6-16 10:58 上传 点击文件名下载附件

335920284
4楼-- · 2019-07-20 23:56
 精彩回答 2  元偷偷看……
山丨海
5楼-- · 2019-07-21 05:18
335920284 发表于 2017-6-16 15:40
简单来说就是给数组赋值字符串是要特殊注意结尾的''的;
u8 dataBuf[3];dataBuf[0]='A';dataBuf[1]='B'; ...

是不是说强制转换的(char *)msg的字符串也是需要后面加上''才能保证strlen读取出来的长度是3?

我在实际测试的时候是对TCP数据包的粘包现象进行拆包处理的,每个包以 为结尾,每次发送的数据是应拆成3个数据包然后依次加入消息队列的,

当发送的间隔为1-2ms时,3w条后会出现该现象,3w条前不会,而当发送间隔为3ms及更长时(也就是  写入消息队列速率=读取消息队列速率  的时候)在2亿byte的数据通信中不会出现这种现象,这是由于什么原理呢?
335920284
6楼-- · 2019-07-21 06:34
 精彩回答 2  元偷偷看……

一周热门 更多>