硬汉嵌入式论坛

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

[以太网] 如何再STM32上做一个比较稳定的tcp服务程序

[复制链接]

4

主题

20

回帖

32

积分

新手上路

积分
32
发表于 昨天 11:07 | 显示全部楼层 |阅读模式
目前使用的STM32H723芯片,PHY芯片LAN8720A,移植LWIP程序,单独测试固定IP,使用ATKPING程序ping网络稳定性基本上30万包数据未出现超时丢包问题,但在使用简单的TCPserver,通过网络助手发送数据,单片机收到数据返回,低数据量(十几个字节)能在50Hz频率下正常工作,但是当数据量增加到几百个字节时,会出现网络卡死,丢数据的情况。出现这种情况应该怎么样处理,如何在网络本身ping稳定性好的情况下做一个比较健壮的STM32芯片下的tcpserver程序。本人网络通信方面的小白,有描述不对的地方请指正。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 昨天 11:45 | 显示全部楼层
当前楼主用的那种方式,raw原始api,netconn还是bsd socket
回复

使用道具 举报

4

主题

20

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 昨天 13:56 | 显示全部楼层
eric2013 发表于 2025-4-24 11:45
当前楼主用的那种方式,raw原始api,netconn还是bsd socket

参照的时V7-2001_LwIP V2.X_实验_工程移植模板(FreeRTOS)V1.1,具体参照的代码如下:
[C] 纯文本查看 复制代码
void LwIPTest(void)
{
	struct netconn *conn, *newconn;
	err_t err;

	/* 创建服务器 */
	conn = netconn_new(NETCONN_TCP);
	netconn_bind(conn, IP_ADDR_ANY, PORT_NUM);

	/* 设置监听 */
	netconn_listen(conn);
	
	while (1) 
	{
		/* 等待接收新的连接 */
		err = netconn_accept(conn, &newconn);

		/* 处理新连接 */
		if (err == ERR_OK) 
		{
			struct netbuf *buf;
			void *data;
			u16_t len;

			/* 简单的数据回环 */
			while ((err = netconn_recv(newconn, &buf)) == ERR_OK) 
			{
		        do {
		             netbuf_data(buf, &data, &len);
		             err = netconn_write(newconn, data, len, NETCONN_COPY);
		        } while (netbuf_next(buf) >= 0);
				netbuf_delete(buf);
			}
			
			/* 删除连接  */
			netconn_close(newconn);
			netconn_delete(newconn);
		}

	}
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 8 小时前 | 显示全部楼层
Ainit 发表于 2025-4-24 13:56
参照的时V7-2001_LwIP V2.X_实验_工程移植模板(FreeRTOS)V1.1,具体参照的代码如下:
[mw_shl_code=c,tru ...

考虑判断下netconn_write的返回值,看看是不是好点
回复

使用道具 举报

4

主题

20

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 3 小时前 | 显示全部楼层
eric2013 发表于 2025-4-25 10:36
考虑判断下netconn_write的返回值,看看是不是好点

试了一下,也会有相同的问题,可能是我描述问题错误了。我的理解是,比如使用串口通信,波特率限制了这个串口的收发字节数,比如1S内,115200波特率下,串口收发数据是有一个极限的,比如为11520字节/s,那我将发送数据周期修改成20ms时,那么一次发送数据最大值不能超过230字节。类比到以太网,应该有个理论速度,且我可以根据理论速度设置20ms周期内,一次最多可以发送多少字节数据。我不确定这样理解对不对。如我理解错误,请帮忙指正,谢谢
回复

使用道具 举报

4

主题

20

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 2 小时前 | 显示全部楼层
使用TCP server 简单数据回环测试,一帧数据120字节,会出现收发一会儿自动卡死的情况,并且tcp连接自动断开。
50Hz数据收发测试-120字节卡死.png
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 19:05 , Processed in 0.241525 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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