硬汉嵌入式论坛

 找回密码
 立即注册
查看: 322|回复: 7
收起左侧

[有问必答] STM32F407+RL-TCPnet客户端例程修改出现的问题

[复制链接]

2

主题

6

回帖

12

积分

新手上路

积分
12
发表于 2023-5-16 22:16:25 | 显示全部楼层 |阅读模式
参照测试例程自己封装了一下发送函数,发现一个奇怪现象

我想要实现的功能是收到指令后,SYSSTATUS_SET(Status,STA_SCAN),然后一直发送数据,但是这样的话,发送速度大概就在500KB/S左右,提高单次发送长度后速度也不会有太大改变。
如果是去掉if(SYSSTATUS_GET(Status)==STA_SCAN)这个判断,或者初始赋值SYSSTATUS_SET(Status,STA_SCAN),那么发送速度大概在4MB/S,且提高单次发送长度速度还会提升。
所以就是感觉接收指令后速度就变慢了,但是在去掉if(SYSSTATUS_GET(Status)==STA_SCAN)这个判断后,我也尝试发送指令,但速度并不会降低,有遇到过这样的情况吗?
以下是测试代码,其中speedtest(sendbuf,138)就是把例程中按键按下的发送代码封装起来了。


while (1)
{
      /* TCP轮询 */
     tcpnet_poll();
               
     /* 用于网线插拔的处理 */
     tcp_status = TCP_StatusCheck();

    if (tcp_status == __TRUE)
    {
            if(SYSSTATUS_GET(Status)==STA_SCAN)
            {
                speedtest(sendbuf,138);
            }
    }
}



回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2023-5-16 23:34:57 | 显示全部楼层
本帖最后由 慕诗客 于 2023-5-17 21:47 编辑

这条误发送了,见下一条
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2023-5-16 23:37:08 | 显示全部楼层
U16 tcp_callback (U8 soc, U8 evt, U8 *ptr, U16 par)
{
/*省略*/
/* 接收到TCP数据帧,ptr指向数据地址,par记录数据长度,单位字节 */
        case TCP_EVT_DATA:
//                        printf_debug("Data length = %d\r\n", par);
//                        for(i = 0; i < par; i++)
//                        {
//                                printf_debug("ptr[%d] = %d\r\n", i, ptr[i]);
//                        }
            if(ptr[0]==0xc5&&ptr[2]==0x01&&ptr[3]==0x01)
            {               
                SYSSTATUS_SET(Status,STA_SCAN);
                TIM_Cmd(TIM3, ENABLE);
            }
    break;
/*省略*/
}
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106422
QQ
发表于 2023-5-17 11:17:01 | 显示全部楼层
SYSSTATUS_SET和speedtest怎么实现的,贴下。另外你这个工程是不是裸机玩法。
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2023-5-17 21:42:05 | 显示全部楼层
eric2013 发表于 2023-5-17 11:17
SYSSTATUS_SET和speedtest怎么实现的,贴下。另外你这个工程是不是裸机玩法。

SYSSTATUS_SET实际就是给一个全局的结构体中某个变量赋值,speedtest就是把裸机例程那个按键按下发送的代码打了个包
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2023-5-17 21:43:38 | 显示全部楼层
eric2013 发表于 2023-5-17 11:17
SYSSTATUS_SET和speedtest怎么实现的,贴下。另外你这个工程是不是裸机玩法。

void speedtest(uint8_t *usrbuf,int buflen)
{
    uint16_t maxlen;
    uint8_t *sendbuf;
    do
    {
        tcpnet_poll();
        if(tcp_check_send (socket_tcp) == __TRUE)
        {
            maxlen = tcp_max_dsize (socket_tcp);

            buflen -= maxlen;
            
            if(buflen < 0)
            {
                /* 这么计算没问题的 */
                maxlen = buflen + maxlen;
            }
            
            sendbuf = tcp_get_buf (maxlen);
            memcpy(sendbuf,usrbuf,maxlen);
            usrbuf+=maxlen;
            
            /* 必须使用申请的内存空间 */
            tcp_send (socket_tcp, sendbuf, maxlen);
        }
        
    }while(buflen > 0);
}



SINGLETON(SYSSTATUS)
{
    SYSTEM_STATUS        Status;                // 系统状态   
};
void SYSSTATUS_Init(SYSSTATUS *cthis);


#define SYSSTATUS_SET(opt, num)  SYSSTATUS_instance()->opt=num
#define SYSSTATUS_GET(opt)       SYSSTATUS_instance()->opt
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2023-5-17 21:45:14 | 显示全部楼层
eric2013 发表于 2023-5-17 11:17
SYSSTATUS_SET和speedtest怎么实现的,贴下。另外你这个工程是不是裸机玩法。

跟那个应该没关系,现在差别就是一个连上后自动发送,另一个需要指令触发
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2023-5-17 21:45:51 | 显示全部楼层
eric2013 发表于 2023-5-17 11:17
SYSSTATUS_SET和speedtest怎么实现的,贴下。另外你这个工程是不是裸机玩法。

是STM32F407+RL-TCPnet客户端裸机例程
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-20 07:40 , Processed in 0.180723 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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