当前位置:首页 > 单片机 > 单片机
[导读]//=====================================================================//TITLE:// STM32F2xx的tcp_echoserver例程解说//AUTHOR:// norains//DATE:// Monday 04-July-2011//Environment:// Keil MDK 4.2// STM32

//=====================================================================
//TITLE:
// STM32F2xx的tcp_echoserver例程解说
//AUTHOR:
// norains
//DATE:
// Monday 04-July-2011
//Environment:
// Keil MDK 4.2
// STM32F207 核心版
//=====================================================================

最近拿到STM32F207的核心版,板载有网卡芯片,自然要拿过来捣鼓一番。而对于一个从未接触过网络的菜鸟来说,最好的入门方式就是揣测ST公司的例程,所以今天norains也不例外。那么我们就一起来看看这个官方的例程吧!

首先我们来了解C/S网络程序的工作流程,如图:


这个图并不是norains所绘制的,而是网上流传的一个名为《TCP/IP Socket网络编程》的PPT所截取的。这个流程各位一定要熟悉,因为接下来所描述的例子流程,和该图例非常吻合。

ST关于TCP的例程分为client和server,根据字面意思,可以知道tcp_echoserver例程是将STM32F2xx作为server来用。而例程的第一步呢,便是初始化,调用的是tcp_echoserver_init()函数。

在tcp_echoserver_init()函数里,主要做了这么几件事情:
1. 创建一个新的TCP协议控制块
2. 绑定地址和端口号(port)
3. 开始监听(listen)
4. 设置accept的回调函数

其完整代码如下:


voidtcp_echoserver_init(void)

{

//创建一个新的TCP控制块

tcp_echoserver_pcb=tcp_new();

if(tcp_echoserver_pcb!=NULL)

{

err_terr;

//绑定到端口7

err=tcp_bind(tcp_echoserver_pcb,IP_ADDR_ANY,7);

if(err==ERR_OK)

{

//开始监听

tcp_echoserver_pcb=tcp_listen(tcp_echoserver_pcb);

//设置tcp_echoserver_accept为accept的回调函数

tcp_accept(tcp_echoserver_pcb,tcp_echoserver_accept);

}

else

{

printf("Cannotbindpcbn");//norains2011-7-4comment

}

}

else

{

printf("Cannotcreatenewpcbn");//norains2011-7-4comment

}

}

当客户端开始连接之后,那么被设置的tcp_echoserver_accept()回调函数就会被调用。该函数主要是创建一个新的数据结构,并且将该数据结构传递给底层的TCP,最后分别是设置receive,error和poll这三个回调函数。
  
  tcp_echoserver_accept()代码如下所示:


staticerr_ttcp_echoserver_accept(void*arg,structtcp_pcb*newpcb,err_terr)

{

err_tret_err;

structtcp_echoserver_struct*es;

LWIP_UNUSED_ARG(arg);

LWIP_UNUSED_ARG(err);

///给新的连接设置优先级

tcp_setprio(newpcb,TCP_PRIO_MIN);

//分配一个结构体空间以保持TCP的连接

es=(structtcp_echoserver_struct*)mem_malloc(sizeof(structtcp_echoserver_struct));

if(es!=NULL)

{

es->state=ES_ACCEPTED;

es->pcb=newpcb;

es->p=NULL;

//传递新分配的结构体数据给新的pcb

tcp_arg(newpcb,es);

//为新的连接设置receive回调函数

tcp_recv(newpcb,tcp_echoserver_recv);

//为新的连接设置error回调函数

tcp_err(newpcb,tcp_echoserver_error);

//为新的连接设置poll回调函数

tcp_poll(newpcb,tcp_echoserver_poll,1);

ret_err=ERR_OK;

}

else

{

/*returnmemoryerror*/

ret_err=ERR_MEM;

}

returnret_err;

}



  
  接下来便是tcp_echoserver_recv()这个回调函数,因为该函数比较大,这里就不再全部罗列代码了。对于使用者来说,只需要知道相应的判定条件来代表什么意思就足够了,如:


staticerr_ttcp_echoserver_recv(void*arg,structtcp_pcb*tpcb,structpbuf*p,err_terr)

{

structtcp_echoserver_struct*es;

err_tret_err;

LWIP_ASSERT("arg!=NULL",arg!=NULL);

es=(structtcp_echoserver_struct*)arg;

if(p==NULL)

{

//如果接收到空的帧,则释放连接

...

}

elseif(err!=ERR_OK)

{

//接收到一个非空的帧,但可能某些原因出错,导致返回值不为ERR_OK,故在此释放缓存

...

}

elseif(es->state==ES_ACCEPTED)

{

//连接成功,在这里需要设置sent回调函数

...

}

elseif(es->state==ES_RECEIVED)

{

//从客户端收到数据

...

}

else

{

//当连接关闭时,还收到了数据

...

}

returnret_err;

}



  
  STM32F207的代码部分就暂时说到这里,现在的问题是,如何测试这代码的正确性呢?这就必须用到ST提供的echotool.exe程序了。该程序位于stm32f2x7_eth_lwip的PC_Software文件夹中。该程序必须在命令行打开,其大致参数如下所示:
  
  
  如果我们的serverip地址为192.168.0.8,那么可以输入如下命令进行测试:
  echotool.exe 192.168.0.8 /p tcp /r 7 /n 15 /t 2 /d Testing LwIP TCP echo server
  
  如果网络联通的话,测试成功将如下如下的画面,如图:
  


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

Sept. 8, 2025 ---- 根据TrendForce集邦咨询最新调查,2025年第二季NVIDIA(英伟达) Blackwell平台规模化出货,以及北美CSP业者持续扩大布局General Server(通用型...

关键字: SSD DDR4 服务器

Sept. 4, 2025 ---- Apple(苹果)即将发布iPhone 17、iPhone 17 Air(暂名)、iPhone 17 Pro及Pro Max四款旗舰新机,除了外观辨识度升级,处理器性能、散热和拍摄功...

关键字: iPhone 16 A19处理器 折叠机

Sept. 3, 2025 ---- 根据TrendForce集邦咨询最新发布的《2025近眼显示市场趋势与技术分析》报告,2025年随着国际品牌陆续推出AR眼镜原型,以及Meta预计在近期发布AR眼镜Celeste,市...

关键字: AR眼镜 OLED

Sept. 2, 2025 ---- TrendForce集邦咨询表示,2025年第二季DRAM产业因一般型DRAM (Conventional DRAM)合约价上涨、出货量显著增长,加上HBM出货规模扩张,整体营收为3...

关键字: DRAM 智能手机 ASP

Sept. 1, 2025 ---- 根据TrendForce集邦咨询最新调查,2025年第二季因中国市场消费补贴引发的提前备货效应,以及下半年智能手机、笔电/PC、Server新品所需带动,整体晶圆代工产能利用率与出货...

关键字: 晶圆代工 智能手机 笔电

Aug. 28, 2025 ---- 根据TrendForce集邦咨询最新调查,2025年第二季NAND Flash产业虽面临平均销售价格(ASP)小幅下滑,所幸原厂减产策略缓解供需失衡,叠加中、美两大市场政策推动,整体...

关键字: NAND Flash SSD AI

Aug. 26, 2025 ---- NVIDIA(英伟达)近日推出的Jetson Thor被视为机器人的物理智慧核心,以Blackwell GPU、128 GB记忆体堆叠出2070 FP4 TFLOPS AI算力,是前...

关键字: 机器人 大型语言模型 AI算力

Aug. 21, 2025 ---- 根据TrendForce集邦咨询最新液冷产业研究,随着NVIDIA GB200 NVL72机柜式服务器于2025年放量出货,云端业者加速升级AI数据中心架构,促使液冷技术从早期试点迈...

关键字: AI 数据中心 服务器

除了充电电路外,锂电池的放电过程也需要保护。锂电池的放电电压不能低于3.0V,否则电池寿命会大幅缩短。为了实现这一保护,工程师们设计了DW01芯片与8205 MOS管的电路组合。DW01芯片能够监控锂电池的放电电压和电流...

关键字: 锂电池 电池

在PCB设计的宏伟蓝图中,布局与布线规则犹如精密乐章中的指挥棒,是铸就电路板卓越性能、坚不可摧的可靠性及经济高效的制造成本的灵魂所在。恰如一位巧手的园艺师,合理的布局艺术性地编排着每一寸空间,既削减了布线交织的繁复迷宫,...

关键字: PCB 电路板
关闭