当前位置:首页 > 单片机 > 单片机
[导读]//=====================================================================//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
  
  如果网络联通的话,测试成功将如下如下的画面,如图:
  


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

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭