lwip 怎么关闭脱粪scat javscat模式

查看: 10169|回复: 16
stm32有自带的以太网模块,为什么还要用ENC28J60?
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间0 小时
STM32中文手册第27章不是有"以太网(ETH):具有DMA控制器的介质访问控制(MAC)"模块吗?自带的以太网模块与ENC28J60控制器有什么区别?不用ENC28J60直接用STM32自带的以太网模块行吗?
一个是MAC一个是HPY,缺一不可。
主题帖子精华
初级会员, 积分 104, 距离下一级还需 96 积分
在线时间0 小时
一个是MAC一个是HPY,缺一不可。
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间0 小时
但ENC28J60的手册又包括了MAC和PHY,如图1-2
1f95acd87f7375de3eff451f.jpg (0 Bytes, 下载次数: 58)
22:54 上传
主题帖子精华
初级会员, 积分 104, 距离下一级还需 96 积分
在线时间0 小时
买一送一有什么不好。比如有的就只有hpy,也能和stm32驳接,28j60也不只是和stm32用。我只喜欢用带协议栈的芯片。
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间0 小时
回复【4楼】好人:
---------------------------------原来这样
谢谢了,有什么网络方面的资料介绍学习
主题帖子精华
初级会员, 积分 104, 距离下一级还需 96 积分
在线时间0 小时
我也不知道看啥资料,只看过芯片的手册。我只用过带协议栈的芯片,比如W5500。感觉自己弄lwip太费神。
主题帖子精华
在线时间578 小时
所有的STM&IC都带么?&楼主是来搞笑的。。。。
道不同,不相与为谋
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间0 小时
回复【7楼】jermy_z:
---------------------------------
回复【6楼】好人:
---------------------------------
现在刚开始了解网络方面的,对很多网络方面的概念还很混乱,还没找到入手方向。
主题帖子精华
初级会员, 积分 104, 距离下一级还需 96 积分
在线时间0 小时
网络只是一个通讯通道而已。如果是新接触网络,我建议还是用带协议栈的芯片。省事,快捷。比串口复杂不了多少。让更多的精力去搞应用程序。
主题帖子精华
在线时间578 小时
回复【9楼】好人:
---------------------------------
赞同&&&自己搞协议&&会被搞傻掉
道不同,不相与为谋
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间0 小时
回复【9楼】好人:
---------------------------------
回复【10楼】jermy_z:
---------------------------------
多谢两位的建议
主题帖子精华
在线时间624 小时
回复【5楼】wuyingsheng:
---------------------------------
我们的STM32F407有专门的网络开发手册和例程,用的是STM32407内部MAC+LAN8720的PHY,协议采用的LWIP。
开往春天的手扶拖拉机
主题帖子精华
高级会员, 积分 641, 距离下一级还需 359 积分
在线时间27 小时
楼主是来搞笑的嘛!
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间0 小时
回复【13楼】三叶草:
---------------------------------
没有啊,这个真不懂
主题帖子精华
高级会员, 积分 641, 距离下一级还需 359 积分
在线时间27 小时
STM32上是MAC层,下面还的接一层PHY层即物理层,其实在网络上分属不同的层!回复【14楼】wuyingsheng:
---------------------------------
主题帖子精华
初级会员, 积分 64, 距离下一级还需 136 积分
在线时间0 小时
对于不带MAC层的芯片比如103可以用带MAC+PHY的网络芯片,比如ENC28J60,对于带MAC层的芯片比如107或者407之类的,就可以用只有PHY层的网络芯片,比如DP83848。都可以用lwip或者其他的软协议。
主题帖子精华
高级会员, 积分 573, 距离下一级还需 427 积分
在线时间20 小时
Powered by21ic官方微信-->
后使用快捷导航没有帐号?
查看: 4892|回复: 4
科星F107开发板学习笔记第17章--lwip下TCP客户端的实现
&&已结帖(0)
主题帖子积分
助理工程师, 积分 1682, 距离下一级还需 318 积分
助理工程师, 积分 1682, 距离下一级还需 318 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
助理工程师, 积分 1682, 距离下一级还需 318 积分
助理工程师, 积分 1682, 距离下一级还需 318 积分
stm32f107vc lwip tcp客户端 服务器数据传输
第一篇& & & & TCP客户端模式简单数据收发
& && && && & ----控制开发板LED灯
&&建立LWIP客户端模式,科星F107开发板做为客户端去连接PC测试软件模拟的服务器,实现简单的数据收发,通过上位机控制板子的LED灯
一 打开工程《科星F107开发板网络应用篇之TCP客户端》
& &打开MAIN.C主文件
int main(void)
&&System_Setup();
&&LwIP_Init();
&&//Client_init();
& &&&LwIP_Periodic_Handle(LocalTime);
上面和前面讲到的服务器模式,区别只在于Client_init();函数,别的和前面都一样,这里不再讲解,我们主要看一下Client_init();函数里的内容 看看客户端和服务器的区别。
void Client_init(void)
&&struct tcp_pcb *& & & &
&&struct ip_
&&IP4_ADDR(&ipaddr,192,168,0,22); 远程服务器IP 写进全局变量
&&pcb = tcp_new();& & & && & 建立一个新的tcp 链接& && && && && & & & & & & &&&& & & &
&&tcp_bind(pcb, IP_ADDR_ANY, 23);& &绑定开发板IP和端口号 这里端口号可以是0 也就是随机,因为是客户端 不必知道端口号。& &
&&tcp_connect(pcb, &ipaddr, PEER_PORT, tcp_Client_connected);& & & & 主要是这里和服务器不太一样,服务器模式是监听listen,客户端的话 就要主动去连接服务器 我们看一下 参数的含义
PCB 就是我们前面建立的tcp端口
IPADDR 要连接的远程服务器IP 这里设置的是测试的电脑的IP
& && && &这里设置的是IP4_ADDR(&ipaddr,192,168,0,22);
PEER_PORT 远程端口号 我们要连接的端口号 这里我们设置的是5000
#define PEER_PORT& & 5000& & & &
看一下我们测试软件和电脑的设置截图 主要是电脑的IP和上位机的本地端口号 别的没用
tcp_Client_connected 连接到远程服务器成功后的回调函数 连接成功后会调用这个函数,我们看一下这个过程是怎么到这个函数的
进入函数:& & & & tcp_connect(pcb,&ipaddr, PEER_PORT, tcp_Client_connected);
&&下面第四个参数* connected就是回调函数 在程序里找到这个
tcp_connect(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port,
& && &err_t (* connected)(void *arg, struct tcp_pcb *tpcb, err_t err))
&&LWIP_ERROR(&tcp_connect: can only connected from state CLOSED&, pcb-&state == CLOSED, return ERR_ISCONN);
&&LWIP_DEBUGF(TCP_DEBUG, (&tcp_connect to port %&U16_F&\n&, port));
&&if (ipaddr != NULL) {
& & pcb-&remote_ip = * 远程IP
&&} else {
& & return ERR_VAL;
&&pcb-&remote_port = 端口号
&&if (pcb-&local_port == 0) {
& & pcb-&local_port = tcp_new_port(); 本地端口号
&&iss = tcp_next_iss();
&&pcb-&rcv_nxt = 0;
&&pcb-&snd_nxt =
&&pcb-&lastack = iss - 1;
&&pcb-&snd_lbb = iss - 1;
&&pcb-&rcv_wnd = TCP_WND;
&&pcb-&rcv_ann_wnd = TCP_WND;
&&pcb-&rcv_ann_right_edge = pcb-&rcv_
&&pcb-&snd_wnd = TCP_WND;
&&/* As initial send MSS, we use TCP_MSS but limit it to 536.
& &&&The send MSS is updated when an MSS option is received. */
&&pcb-&mss = (TCP_MSS & 536) ? 536 : TCP_MSS;
#if TCP_CALCULATE_EFF_SEND_MSS
&&pcb-&mss = tcp_eff_send_mss(pcb-&mss, ipaddr);
#endif /* TCP_CALCULATE_EFF_SEND_MSS */
&&pcb-&cwnd = 1;
&&pcb-&ssthresh = pcb-&mss * 10;
&&pcb-&state = SYN_SENT;
#if LWIP_CALLBACK_API&&
&&pcb-&connected = 回调函数传递给我们网络端口connected
& &既然是连接成功后回调这个函数 那么在哪里检测是不是连接成功呢?
&&如果调用的话肯定是调用pcb-&connected 因为他就是回调函数 我们刚才已经传递给他了
这里如果对LWIP不熟的话 可能就搜不到了,我们直接告诉大家 在TCP.h中
&&#define TCP_EVENT_CONNECTED(pcb,err,ret)& && && && && && && && & \
&&do {& && && && && && && && && && && && && && && && && && && &&&\
& & if((pcb)-&connected != NULL)& && && && && && && && && && && &\
& && &(ret) = (pcb)-&connected((pcb)-&callback_arg,(pcb),(err)); \
& & else (ret) = ERR_OK;& && && && && && && && && && && && && &&&\
&&} while (0)
所以我们搜索TCP_EVENT_CONNECTED就能找到连接远程服务器成功后 程序到了哪里 并且调用了我们的回调函数。搜一下:
&&在tcp_process(struct tcp_pcb *pcb)函数中 果然 这个就是tcp进程的函数,我们看在哪里调用了?
switch (pcb-&state) {
&&case SYN_SENT:
& & LWIP_DEBUGF(TCP_INPUT_DEBUG, (&SYN-SENT: ackno %&U32_F& pcb-&snd_nxt %&U32_F& unacked %&U32_F&\n&, ackno,
& &&&pcb-&snd_nxt, ntohl(pcb-&unacked-&tcphdr-&seqno)));
& & /* received SYN ACK with expected sequence number? */
& & if ((flags & TCP_ACK) && (flags & TCP_SYN)
& && &&&&& ackno == ntohl(pcb-&unacked-&tcphdr-&seqno) + 1) {
& && &pcb-&snd_buf++;
& && &pcb-&rcv_nxt = seqno + 1;
& && &pcb-&rcv_ann_right_edge = pcb-&rcv_
& && &pcb-&lastack =
& && &pcb-&snd_wnd = tcphdr-&
& && &pcb-&snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
& && &pcb-&state = ESTABLISHED;
#if TCP_CALCULATE_EFF_SEND_MSS
& && &pcb-&mss = tcp_eff_send_mss(pcb-&mss, &(pcb-&remote_ip));
#endif /* TCP_CALCULATE_EFF_SEND_MSS */
& && &/* Set ssthresh again after changing pcb-&mss (already set in tcp_connect
& && & * but for the default value of pcb-&mss) */
& && &pcb-&ssthresh = pcb-&mss * 10;
& && &pcb-&cwnd = ((pcb-&cwnd == 1) ? (pcb-&mss * 2) : pcb-&mss);
& && &LWIP_ASSERT(&pcb-&snd_queuelen & 0&, (pcb-&snd_queuelen & 0));
& && &--pcb-&snd_
& && &LWIP_DEBUGF(TCP_QLEN_DEBUG, (&tcp_process: SYN-SENT --queuelen %&U16_F&\n&, (u16_t)pcb-&snd_queuelen));
& && &rseg = pcb-&
& && &pcb-&unacked = rseg-&
& && &/* If there's nothing left to acknowledge, stop the retransmit
& && && &timer, otherwise reset it to start again */
& && &if(pcb-&unacked == NULL)
& && &&&pcb-&rtime = -1;
& && &else {
& && &&&pcb-&rtime = 0;
& && &&&pcb-&nrtx = 0;
& && &tcp_seg_free(rseg);
& && &/* Call the user specified function to call when sucessfully
& && & * connected. */
& && &TCP_EVENT_CONNECTED(pcb, ERR_OK, err);就是这里 接收到服务器的回应 具体是怎么到这里的 这个就得靠大家去看lwip函数讲解了 这里就不多说了 大致的流程已经和大家说了。
& && &tcp_ack_now(pcb);
#endif /* LWIP_CALLBACK_API */
&&TCP_RMV(&tcp_bound_pcbs, pcb);
&&TCP_REG(&tcp_active_pcbs, pcb);
&&snmp_inc_tcpactiveopens();
&&ret = tcp_enqueue(pcb, NULL, 0, TCP_SYN, 0, TF_SEG_OPTS_MSS
#if LWIP_TCP_TIMESTAMPS
& && && && && && &&&| TF_SEG_OPTS_TS
& && && && && && &&&);
&&if (ret == ERR_OK) {
& & tcp_output(pcb);
& & & & & & & &
& & & & & & & & & & & & & & & & & & & & & & & & }
OK 这样连接建立后就进入了回调函数tcp_Client_connected 进入函数后
err_t tcp_Client_connected(void *arg, struct tcp_pcb *pcb, err_t err)
& &tcp_write(pcb, GREETING, strlen(GREETING), 0); //输出hello
& &tcp_recv(pcb, HelloWorld_recv);//指定接收到数据后的回调函数
&&return ERR_OK;
我们看到这里和服务器又一样了。连接成功后发送数据给上位机
#define GREETING &Hello.连接已经建立!欢迎来到科星F107开发板网络学习!\r\n&
然后TCP_RECV指定了接受数据的回调函数 这里我们直接调用了服务器模式时候的函数。
这样客户端模式的通信 就完成了。
&&因为客户端的连接,每次都是有固定的流程和时间,也许上电开始服务器并没有准备好,或者是通信过程中由于某些原因连接断开了,那就需要我们能够保证这种情况下也能连接,那么我们就得在没有连上的时候,一直去尝试连接,才能做到从连,所以我们实际应用中把客户端连接的函数Client_init();放到了主循环中。
下载程序到开发板,打开上位机 电脑和上位机的配置按照上面的截图
点击“开始监听” 等待开发板客户端的连接 连上后如图
点击“发送” 开发板会返回相应的数据:如图
这样 客户端模式数据通信就实现了。
在测试一下断线从连,点击“停止监听”等一会在开始监听看看能不能连上?怎样做才能做到更好?这也是开发产品应该完善的。
功能跟进 TCP客户端模式控制开发板的LED灯和蜂鸣器
打开工程《科星F107开发板网络应用篇之TCP客户端-LED灯》
下载程序到开发板,打开上位机,参数配置如下图,
开始监听 等到灯变红色 就可以控制开发板的LED和蜂鸣器了 自己试试吧。
专业 诚信&&stm家园
主题帖子积分
助理工程师, 积分 1682, 距离下一级还需 318 积分
助理工程师, 积分 1682, 距离下一级还需 318 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
助理工程师, 积分 1682, 距离下一级还需 318 积分
助理工程师, 积分 1682, 距离下一级还需 318 积分
本帖子中包含更多资源
才可以下载或查看,没有帐号?
专业 诚信&&stm家园
主题帖子积分
助理工程师, 积分 1682, 距离下一级还需 318 积分
助理工程师, 积分 1682, 距离下一级还需 318 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
助理工程师, 积分 1682, 距离下一级还需 318 积分
助理工程师, 积分 1682, 距离下一级还需 318 积分
本帖子中包含更多资源
才可以下载或查看,没有帐号?
专业 诚信&&stm家园
主题帖子积分
中级技术员, 积分 199, 距离下一级还需 101 积分
中级技术员, 积分 199, 距离下一级还需 101 积分
主题帖子积分
专家等级:结帖率:10%
主题帖子积分
中级技术员, 积分 199, 距离下一级还需 101 积分
中级技术员, 积分 199, 距离下一级还需 101 积分
你好,我按照您的教程操作的,为什么能Ping通,但是TCP客户端却连接不上?
主题帖子积分
高级工程师, 积分 6854, 距离下一级还需 1146 积分
高级工程师, 积分 6854, 距离下一级还需 1146 积分
主题帖子积分
专家等级:结帖率:27%
主题帖子积分
高级工程师, 积分 6854, 距离下一级还需 1146 积分
高级工程师, 积分 6854, 距离下一级还需 1146 积分
呵呵,还算有价值的一个广告贴。借鉴代码学习一下。
社区建设奖章
等级类勋章
欢快之小溪
发帖类勋章
时间类勋章
技术新星奖章
人才类勋章
无冕之王奖章
等级类勋章
奔腾之江水
发帖类勋章
技术奇才奖章
人才类勋章
时间类勋章lwIP在Socket模式下接口:BSD Socket API_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
lwIP在Socket模式下接口:BSD Socket API
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢lwip:lwip-简介,lwip-模式_lwip-牛宝宝文章网
lwip:lwip-简介,lwip-模式 lwip
lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。lwip API把接收与处理放在一个线程里面。RAW API把协议栈和应用程序放到一个进程里边,该接口基于函数回调技术,使用该接口的应用程序可以不用进行连续操作。具体实现时,对队列本身的管理利用μC/OS自己的OSQ操作完成,然后使用μC/OS中的内存管理模块实现对消息的创建、使用、删除和回收,两部分综合起来形成了LwIP的消息队列功能。它提供了创建新任务的系统API调用OSTaskCreate,因此只要把OSTaskCreate封装一下,就可以实现sys_thread_new。lwip_lwip -简单介绍[wWw.nIuBb.nEt)lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的1个小型开源的TCP/IP协议栈。LwIP是Light Weight (轻型)IP协议,有无操作系统的支持都可以运行。LwIP实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用,一般它只需要几百字节的RAM和40K左右的ROM即可运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。lwIP协议栈主要关注的是怎么样减少内存的使用和代码的大小,这样即可让lwIP适用于资源有限的小型平台例如嵌入式系统。为了简化处理过程和内存要求,lwIP对API进行了裁减,可以不需要复制一些数据。lwip_lwip -模式lwip提供3种API:1)RAW API 2)lwip API 3)BSD API。RAW API把协议栈和应用程序放到1个进程里边,该接口基于函数回调技术,使用该接口的应用程序可以不用进行连续操作。不过,这会使应用程序编写难度加大且代 码不易被理解。为了接收数据,应用程序会向协议栈注册1个回调函数。该回调函数与特定的连接相关联,当该关联的连接到达1个信息包,该回调函数就会被协议 栈调用。这既有优点也有缺点。优点是既然应用程序和TCP/IP协议栈驻留在同1个进程中,那么发送和接收数据就不再产生进程切换。主要缺点是应用程序不 能使自己陷入长期的连续运算中,这样会导致通讯性能下降,原因是TCP/IP处理与连续运算是不能并行发生的。这个缺点可以通过把应用程序分为两部分来克 服,一部分处理通讯,一部分处理运算。lwip API把接收与处理放在1个线程里面。这样只要处理流程稍微被延迟,接收就会被阻塞,直接造成频繁丢包、响应不及时等严重问题。因此,接收与协议处理必须 分开。LwIP的作者显然已经考虑到了这一点,他为我们提供了 tcpip_input() 函数来处理这个问题, 虽然他并没有在 rawapi 一文中说明。 讲到这里,读者应该知道tcpip_input()函数投递的消息从哪里来的答案了吧,没错,它们来自于由底层网络驱动组成的接收线程。我们在编写网络驱动时, 其接收部分以任务的形式创建。 数据包到达后, 去掉以太网包头得到IP包, 然后直接调用tcpip_input()函数将其 投递到mbox邮箱。投递结束,接收任务继续下1个数据包的接收,而被投递得IP包将由TCPIP线程继续处理。这样,即使某个IP包的处理时间过长也不 会造成频繁丢包现象的发生。这就是lwip API。BSD API提供了基于open-read-write-close模型的UNIX标准API,它的最大特点是使应用程序移植到其它系统时比较容易,但用在嵌入式系统中效率比较低,占用资源多。这对于我们的嵌入式应用有时是不能容忍的。lwip_lwip -移植为了移植到μC/OS系统中,需要进行以下调整。(1) 信号量LwIP中需要使用信号量进行通信,所以在sys_arch中应实现相应的信号量结构体struct sys_semt和处理函数sys_sem_new() 、sys_sem_free() 、sys_sem_signal ( ) 和sys_arch_sem_wait ( ) 。由于μC/OS已经实现了信号量OSEVENT的各种操作,并且功能和LwIP上面几个函数的目的功能是完全一样的,所以只要把μC/OS的函数重新包装成上面的函数,就可直接使用。(2) 消息队列LwIP 使用消息队列来缓冲、传递数据报文,因此要实现消息队列结构sys_mbox_t ,以及相应的操作函数:sys_mbox_new() 、sys_mbox_free () 、sys_mbox _post () 和sys_arch_mbox_fetch() 。μC/OS实现了消息队列结构及其操作,但是μC/OS没有对消息队列中的消息进行管理,因此不能直接使用,必须在μC/OS的基础上重新实现。具体实现时,对队列本身的管理利用μC/OS自己的OSQ操作完成,然后使用μC/OS中的内存管理模块实现对消息的创建、使用、删除和回收,两部分综合起来形成了LwIP的消息队列功能。(3) 定时器函数LwIP中每个和TCP/IP相关的任务的一系列定时事件组成1个单向链表,每个链表的起始指针存在lwip_timeouts 的对应表项中,如图2所示。移植时需要实现struct sys_timeouts * sys_arch_timeouts (void) 函数,该函数返回正处于运行态的线程所对应的timeout 队列指针。(4) 创建新线程函数在μC/OS 中,没有线程(thread) 的概念,只有任务(Task) 。它提供了创建新任务的系统API调用OSTaskCreate,因此只要把OSTaskCreate封装一下,即可实现sys_thread_new。需要注意的是LwIP中的thread并没有μC/OS 中优先级的概念,实现时要由用户事先为LwIP中创建的线程分配好优先级。欢迎您转载分享:
更多精彩:,,后使用快捷导航没有帐号?
查看: 2374|回复: 4
lwip中断模式还是查询模式
在线时间10 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 50, 距离下一级还需 150 积分
一粒金砂(中级), 积分 50, 距离下一级还需 150 积分
怎么设置lwip rawapi 在中断模式下工作呢?
在线时间745 小时
威望7597分
芯币6506枚
E金币200枚
TA的帖子TA的资源
回复 楼主 xbz328 的帖子
能不能简单说一下你所理解的中断模式呢?
在线时间248 小时
芯币7679枚
TA的帖子TA的资源
纯净的硅(初级), 积分 590, 距离下一级还需 210 积分
纯净的硅(初级), 积分 590, 距离下一级还需 210 积分
回复 楼主 xbz328 的帖子
学习靠的就是努力,靠的就是坚持……
在线时间10 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 50, 距离下一级还需 150 积分
一粒金砂(中级), 积分 50, 距离下一级还需 150 积分
[ 本帖最后由 xbz328 于
13:10 编辑 ]
在线时间10 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 50, 距离下一级还需 150 积分
一粒金砂(中级), 积分 50, 距离下一级还需 150 积分
回复 沙发 Study_Stellaris 的帖子
是不是我问的不太恰当,就是比如说要接收数据,硬件触发进入中断。数据没有来,不会一直查询等待,而是执行整个程序下面的操作。刚接触这些不久,对中断真是没什么概念.....
Powered by
逛了这许久,何不进去瞧瞧?

我要回帖

更多关于 zscat 的文章

 

随机推荐