tag 标签: lwip

相关博文
  • 热度 2
    2017-5-5 08:14
    1114 次阅读|
    0 个评论
    嵌入式网络LwIP学习宝典-热门书籍分享 学习如逆水行舟,不进则退。无论你是即将毕业的职场小白,还是已经成为奋战在职场一线的攻城狮、程序猿,都是需要时刻给自己充电的。有句话说的好,如果当你的知识不足以支撑你的野心时,那么你就应该停留下来好好学习了。如果你还想继续在职场混得如鱼得水,那么你就必须时刻给自己充电。骚年,世界上最遥远的距离,不是生与死;而是我在好好学习,你却在LOL。好了,废话不多说了,让我们进入正题吧。 现在物联网、智能家居等等热门技术正在进入高速发展的阶段,未来的世界将会有越来越多的电子产品接入网络,因此掌握一种嵌入式网络协议,对于每个嵌入式工程师来说至关重要,这也是将来是否能够拿到更高的薪资的重要技能。下面例举了几个在嵌入式领域经常使用的 TCP/IP协议浅, 同时对各个协议栈特点及使用情况做简要的介绍。 1、uIP ulP是专门为8位和16位控制器设计的一个非常小的 TCP/IP协议栈。它去掉了完整 TCP/IP协议栈中不常用的功能,其代码完全用C编写,可移植到各种不同的结构和操作系统上, uIP代码容量小巧,实现功能精简,已经在嵌入式领域得到了广泛的应用,且有很多基于uIP的产品出现。但另一方面,uIP不完备的TCP/IP实现限制了其在一些较高要求场合下的应用,如对可靠性要求高或大数据量传输的场合。 2、uC/IP uC/IP是一套基于uC/OS操作系统的开放源码的TCP/IP协议栈,它是一套完全免费的、可供研究的TCP/IP协议栈。uC/IP大部分源码是从公开源码的BSD-Lite移植过来的,最初被设计在串行链路上使用以实现对PPP协议的支持,作者在将其成功的应用在了某个嵌入式产品上后,便将其相应代码共享出来,希望有利于其他嵌入式产品的开发。后来该协议栈不断完善,并实现了对以太网的支持,协议栈需要的代码容量空间在30~60kB之间。 uC/IP还有许多不足的地方,首先其对网络应用的支持不足,不能像LwIP那样提供多种上层应用;其次uC/IP在文档支持与软件升级管理上有很多不足,这是限制其广泛应用和发展的主要原因,至少目前很少人在讨论uC/IP的应用。 3、uC/TCP-IP uC/TCP-IP是Micrium公司针对嵌入式产品设计的一款TCP/IP协议栈,说起Micrium公司大家可能会觉得陌生,但说起大名鼎鼎的实时操作系统uC/OS-II你肯定就熟悉了,这就是Micrium公司的代表之作。uC/TCP-IP功能较齐全,但代码量较大,所以主要用在32位或64位的处理器上,此外它的运行需要uC/OS或其他实时操作系统的支持。uC/TCP-IP还是一款收费软件,使用者需要购买才能获得其使用权。 4、Linux 有人会说,嵌入式linux系统中也有完整的TCP/IP协议的实现,嵌入式系统为何不用linux?首先要明确linux编译后的可执行代码往往有数兆之大,它对嵌入式系统各项指标要求较高,既包括高效的处理器速度,也包括大量的外存、内存开销,这就不可避免的增加了嵌入式系统的成本;而另一方面,linux的实验环境搭建及开发、调试过程都相当繁琐,这无形之中增加了嵌入式初学者入门的难度。 5、LwIP LwIP的含义是Light Weight(轻型)IP协议。LwIP最大的优势在于可以移植到操作系统上,也可以在无操作系统的情况下独立运行,且代码量小。LwIP是目前在嵌入式网络领域被讨论和使用很广泛的一个协议栈,其开源的特性和快速的版本更新效率,使其得到了业界越来越多人的关注。LwIP是一款主要应用于嵌入式领域的开源TCP/IP协议栈,它的实现同BSD的实现有很大的相似性,可以作为TCP/IP协议的典型代表,其功能完备,除了实现TCP/IP的基本通信功能外,新版本还支持DNS、SNMP、DHCP、IGMP等高级应用功能。 以上简单介绍了目前最常见的几种嵌入式网络TCP/IP协议栈,但是综合各种协议栈的优缺点,可以发现,LwIP是目前应用广,学习人数多的最好的嵌入式网络协议栈。 好了,废话不多说了,下面直接贴出本文分享的基本最值得阅读的LwIP协议栈的数据吧。 如果大家有需要其他书籍的电子书版本,可以留言告诉我,有空的时候,我会帮大家制作,仅限电子技术类的书籍哦。 1、嵌入式网络那些事 LwIP协议深度剖析与实战演练 嵌入式网络那些事 LwIP协议深度剖析与实战演练-下载链接 2、嵌入式网络那些事 STM32物联实战 嵌入式网络那些事 STM32物联实战-下载链接 3、嵌入式Internet TCP IP基础、实现及应用 嵌入式Internet TCP IP基础实现及应用-下载链接
  • 热度 3
    2015-5-21 20:55
    3134 次阅读|
    1 个评论
    最近在做以太网数据传输,要把AD采到的数据通过网口发送给上位机(客户端),我采用的是LWIP协议栈,实现了功能。做项目时间紧,也要先看一下LWIP协议栈,TCP ,UDP传输协议。我采用的是TCP协议数据传输,好处是传输可靠。直接贴代码,从main开始, int main(void) { SystemInit(); System_Setup(); GpioLed_Init(); Init_Usart(); GPIO_Configuration(); GPIO_Configuration_SPI(); RCC_Configuration(); NVIC_Configuration(); Time_Configuration(); SPI_Configuration(); LwIP_Init(); HelloWorld_init(); while(1) { TI_ADC128S022_ADC_vout(); printf("Frequency1= %d HZ.\r\n",Frequency1); printf("Frequency2= %d HZ.\r\n",Frequency2); printf("V0=%fmv\r\n",V0); printf("V1=%fmv\r\n",V1); printf("V2=%fmv\r\n",V2); printf("V3=%fmv\r\n",V3); MCU_to_TCP(); /* Periodic tasks */ System_Periodic_Handle(); } } 说一下LwIP_Init();函数,主要是LWIP协议栈,IP和MAC初始化, void LwIP_Init(void) { struct ip_addr ipaddr; struct ip_addr netmask; struct ip_addr gw; uint8_t macaddress ={0,0,0,0,0,1}; /* Initializes the dynamic memory heap defined by MEM_SIZE.*/ mem_init(); /* Initializes the memory pools defined by MEMP_NUM_x.*/ memp_init(); IP4_ADDR(&ipaddr, 192, 168, 1, 198); IP4_ADDR(&netmask, 255, 255, 255, 0); IP4_ADDR(&gw, 192, 168, 1, 1); Set_MAC_Address(macaddress); netif_add(&netif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input); /* Registers the default network interface.*/ netif_set_default(&netif); netif_set_up(&netif); } HelloWorld_init();是建立TCP端口, void HelloWorld_init(void) { /* Create a new TCP control block */ pcb = tcp_new(); /* Assign to the new pcb a local IP address and a port number */ /* Using IP_ADDR_ANY allow the pcb to be used by any local interface */ tcp_bind(pcb, IP_ADDR_ANY, 3007); /* Set the connection to the LISTEN state */ pcb = tcp_listen(pcb); /* Specify the function to be called when a connection is established */ tcp_accept(pcb, HelloWorld_accept); } tcp_bind(pcb, IP_ADDR_ANY, 3007); 是绑定你的端口号和IP地址, pcb = tcp_listen(pcb);进入监听,检查连接,申请TCP_PCB内存,tcp_accept(pcb, HelloWorld_accept);客户端连接以后的回调函数,可以收发数据。 static err_t HelloWorld_accept(void *arg, struct tcp_pcb *pcb, err_t err) { tcp_arg(pcb, mem_calloc(sizeof(struct name), 1));//回传建立连接 tcp_err(pcb, HelloWorld_conn_err);//错误回调函数 tcp_recv(pcb, HelloWorld_recv);//指定收到数据的回调函数 return ERR_OK; } void MCU_to_TCP(void)函数是给单片机(服务器)传输数据函数,每次传输数据完之后要调用tcp_output(cpcb);函数,用于TCP输出。我之前调用tcp_write函数,每次只能收到一次数据,需要新创建一个新的pcb协议控制块,tcp_write之后要调用tcp_output函数,才能不断发送数据。 void MCU_to_TCP(void) { struct tcp_pcb *cpcb; next) { memset(GpcBufFileRead, 0x00, sizeof(GpcBufFileRead)); sprintf( (void *)readdata, "Frequency1 = %dHz\nFrequency2 = %dHz\nV0 = %fmv\nV1 = %fmv\nV2 = %fmv\nV3 = %fmv\n", Frequency1,Frequency2,V0,V1,V2,V3); //tcp_write(pcb, GpcBufFileRead, strlen((void *)readdata), 1); tcp_write(cpcb,GpcBufFileRead,strlen((void *)readdata),TCP_WRITE_FLAG_COPY); tcp_output(cpcb); } } 这样就可以简单实现LWIP TCP数据传输了,主要是这几个地方注意一下,很快可以实现网口数据的发送与接收。 Blog: 更多技术文章请关注: 百家号: https://author.baidu.com/home?context=%7B%22app_id%22%3A%221646108714303504%22%7D&wfr=bjh 头条号: https://www.toutiao.com/c/user/8115738721/#mid=1646025109246987 CSDN : https://blog.csdn.net/u012246376  
  • 热度 14
    2012-12-21 16:27
    9300 次阅读|
    10 个评论
    本人之前在STM32F107上做过UCOS+LWIP,参照网络上一些资源修改了sys_arch.c/sys_arch.h,对tcpip_thread 的优先级、以及与之对应的lwip_timeouts、static struct sys_timeouts lwip_timeouts 的LWIP_TIMEOUT_AMOUNT理解不到位,另外网上流传的sys_mbox_t sys_mbox_new(int size)实现方法好像也是不是很好,我修改如下: //*------------------------------------------------------------------------------------------------ //* 函数名称 : sys_mbox_new //* 功能描述 : 建立一个空的邮箱 //* 入口参数 : 无 //* 出口参数 : - != SYS_MBOX_NULL : 邮箱申请成功,返回一个指向被申请邮箱的指针 //*          : - = SYS_MBOX_NULL  : 邮箱没有申请成功 //*------------------------------------------------------------------------------------------------ sys_mbox_t sys_mbox_new(int size) {     u8_t       ucErr;     sys_mbox_t pQDesc;         pQDesc = OSMemGet( pQueueMem, ucErr );     if( ucErr == OS_NO_ERR ) {                 //移植说明中有“邮箱用于消息传递,用户即可以将其实现为一个队列,允许多条消息投递到这个邮箱,                 //也可以每次只允许投递一个消息,这两种方式lwip都可以正常运行。不过,前者更有效。”                 //TCPIP_MBOX_SIZE,                 //DEFAULT_RAW_RECVMBOX_SIZE,                 //DEFAULT_UDP_RECVMBOX_SIZE,                 //DEFAULT_TCP_RECVMBOX_SIZE                 //DEFAULT_ACCEPTMBOX_SIZE 在opt.h 定义为0                 //可以 lwipopts.h 可以对上述宏重新定义,而在opt.h中有                 //* The queue size value itself is platform-dependent, but is passed to         //* sys_mbox_new() when xxxxxxx is called.                 //因此把 size 固定 MAX_MSG_QUEUES         //pQDesc-pQ_Mbox = OSQCreate( (pQDesc-pvQ_msgQueue ), size );   //                 pQDesc-pQ_Mbox = OSQCreate( (pQDesc-pvQ_msgQueue ), MAX_MSG_QUEUES );        //            if( pQDesc-pQ_Mbox != ((OS_EVENT *)0 ) ) {             return pQDesc;         }     }     return SYS_MBOX_NULL; } 对struct sys_timeouts *sys_arch_timeouts(void)的实现,网上流传很多版本 我也请教过bernard,他这样回复: / //lwip的移植是这样的: //通常lwip那边的线程需要使用sys_thread_new来创建,然后和网络相关的定时器都统一的放在一个列表上(基本上原来netconn、socket的API都仅能够应用于sys_thread_new创建的线程上) // //为了解除这个限制,所以和定时器相关的都仅应用于lwip自己的线程,而其他则不采用这种方式。当使用sys_thread_new创建线程时,会把定时器链表放到thread-user_data域上面。所以这也就是这个返回NULL的来由: //仅有使用sys_thread_new创建的线程才能够获得这个定时器,在其他线程中调用sys_arch_timeouts()函数只能够返回NULL。 // 下列是我的修改的: struct sys_timeouts *sys_arch_timeouts(void) {         OS_TCB curr_task_pcb;         u8_t curr_prio;         s16_t offset;         //        null_timeouts.next = NULL;                 OSTaskQuery(OS_PRIO_SELF,curr_task_pcb);                 /* 获取当前线程的优先级 */         curr_prio = curr_task_pcb.OSTCBPrio;                 offset = curr_prio - LWIP_START_PRIO;                 if(offset 0 || offset = LWIP_TIMEOUT_AMOUNT)      /*如果不是LwIP的线程,那么返回timeouts-NULL*/         {                 //return null_timeouts;                 return NULL;         }                 return lwip_timeouts ; } 修改下来,测试效果还好,不过本人能力有限,对这些修改、理解,心里也是没有底。 刚好st官网上有STM32F2X7+FreeRTOS+Lwip的例程,所以就有参照STM32F2x7_ETH_LwIP_V1.1.0做修改的冲动,以适用STM32F107芯片。 附件是STM32F107+FreeRTOS+Lwip的源码以及一个socket client的例程源码。 对于socket编程,大多例程都是: 1、建立socket 2、连续socket 3、发送数据 4、关闭socket 这样做进行简单的测试是没有问题的。在一些数据采集设备,一般设备做为“客户”端,也是一直连接到主站服务器端,一是为定时上传数据,而是供主站服务器端随时召唤数据。这样的例程就不能满足了。 例程里“客户端”就是长连接,一直等到接收数据,本例程只是简单把接收的数据回送到服务器端。在实际使用中,可根据需要处理数据。 当然在建立另一个任务中,专门来处理发送数据。特别注意的是需要加互斥量做保护。 例程使用了lwip_select函数,网上找关于select说明感觉不错,摘录如下: Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用Select就可以完成非阻塞(所谓非阻塞方式non- block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高)方式工作的程序,它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。下面详细介绍一下! Select的函数格式(我所说的是Unix系统下的伯克利socket编程,和windows下的有区别,一会儿说明): int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct tim *timeout); 先说明两个结构体: 第一,struct fd_set可以理解为一个集合,这个集合中存放的是文件描述符(file descriptor),即文件句柄,这可以是我们所说的普通意义的文件,当然Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以毫无疑问一个socket就是一个文件,socket句柄就是一个文件描述符。fd_set集合可以通过一些宏由人为来操作,比如清空集合FD_ZERO (fd_set *),将一个给定的文件描述符加入集合之中FD_SET(int ,fd_set *),将一个给定的文件描述符从集合中删除FD_CLR(int ,fd_set*),检查集合中指定的文件描述符是否可以读写FD_ISSET(int ,fd_set* )。一会儿举例说明。 第二,struct tim是一个大家常用的结构,用来代表时间值,有两个成员,一个是秒数,另一个是毫秒数。 具体解释select的参数: int maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!在Windows中这个参数的值无所谓,可以设置不正确。 fd_set *readfds是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的读变化的,即我们关心是否可以从这些文件中读取数据了,如果这个集合中有一个文件可读,select就会返回一个大于0的值,表示有文件可读,如果没有可读的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的读变化。 fd_set *writefds是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的写变化的,即我们关心是否可以向这些文件中写入数据了,如果这个集合中有一个文件可写,select就会返回一个大于0的值,表示有文件可写,如果没有可写的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的写变化。 fd_set *errorfds同上面两个参数的意图,用来监视文件错误异常。 struct tim* timeout是select的超时时间,这个参数至关重要,它可以使select处于三种状态,第一,若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变化为止;第二,若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值;第三,timeout的值大于0,这就是等待的超时时间,即 select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。 返回值: 负值:select错误 正值:某些文件可读写或出错 0:等待超时,没有可读写或错误的文件 在有了select后可以写出像样的网络程序来!举个简单的例子,就是从网络上接受数据写入一个文件中。 例子: main() {     int sock;     FILE *fp;     struct fd_set fds;     struct tim timeout={3,0}; //select等待3秒,3秒轮询,要非阻塞就置0     char buffer ={0}; //256字节的接收缓冲区       while(1)    {         FD_ZERO(fds); //每次循环都要清空集合,否则不能检测描述符变化         FD_SET(sock,fds); //添加描述符         FD_SET(fp,fds); //同上         maxfdp=sockfp?sock+1:fp+1;    //描述符最大值加1            switch(select(maxfdp,fds,fds,NULL,timeout))   //select使用         {             case -1: exit(-1);break; //select错误,退出程序         case 0:break;  //再次轮询         default:                   if(FD_ISSET(sock,fds)) //测试sock是否可读,即是否网络上有数据             {                         recvfrom(sock,buffer,256,.....);//接受网络数据                         if(FD_ISSET(fp,fds)) //测试文件是否可写                             fwrite(fp,buffer...);//写入文件buffer清空;                    }// end if break;           }// end switch      }//end while }//end main  
  • 热度 5
    2012-12-5 16:35
    3105 次阅读|
    3 个评论
    有个项目要用以太网传大量数据,spartan6+ddr3+千兆以太网,内核采用microblaze软核,逻辑搭mac,phy芯片用的88E1111。 最开始采用xilinx官方的例子XAPP1026,ISE13.1,1500数据帧下跑TCP协议大概收120Mbit/s,发110Mbit/s。但是重新编译之后,就出问题了,发送时总提示dma错误。于是自己在13.4下建立新工程,按照SP605开发板的设置向导,搭建系统,最后将时钟改成单端时钟,并且Valid一下。然后按照自己的板子更改时钟等管脚约束,就可以生成bit流了。在编译方面,Xilinx的确很费劲,一般首次要花40分钟的时间才能完成,之后的小修改大概要花10-20分钟,和Altera的Nios相比费了很多时间(5k LE的系统Nios一般3分钟就差不多了)。 硬件生成后,export到软件EDK中,生成新的硬件支持包(bsp),然后import原来的XAPP1026下面的AXI系统(raw 模式)。系统就可以跑了。测试一下网速,发送60Mbit/s,接受120Mbit/s,发送通道的设置上肯定存在某方面的问题,现在还不太明白。后来尝试一下巨帧模式(9k数据包),发送速度120Mbit/s,接收速度可以达到330Mbit/s.
  • 热度 5
    2012-8-15 20:24
    3417 次阅读|
    2 个评论
    问题背景 : 最近项目使用到lwip,需要作为客户端的设备同时连接两个服务器,连接成功后与其交互数据。 问题提出 : 程序开始运行时,首先连接服务器1,连接成功后等待500ms后连接服务器2,到这里均连接成功,进入数据收发阶段; 此时两服务器均收发成功一次数据,第二轮开始发往服务器1正常,再发往服务器2时发送时,接收响应超时; 程序此时关闭与服务器2关联的socket,重现创建并连接,此时发现重连任务挂起,直到看门狗复位; 第二次重启后,一切数据收发均正常; 直到下次异常或者手动重启后,又重复了上述现象直到两次复位后才运行正常   问题分析 : 未知待总结   问题解决 : 拉长两个服务器重连时间。  
相关资源
  • 所需E币: 0
    时间: 2020-9-7 00:41
    大小: 860KB
    上传者: xiaosh728
    lwip例程专用库文件.zip
  • 所需E币: 3
    时间: 2019-12-25 15:22
    大小: 228.58KB
    上传者: quw431979_163.com
    为了在DSP上实现网络视频传输,提出了一种有效、经济的嵌入式TCP/IP协议栈实现方案.详细阐述了其协议接口的设计,包括操作系统API及底层驱动程序的设计,给出了网络初始化的控制流程.基于TMS320DM斛2硇嵌八式TCP/lP协议麓硇实坝方怀东,陈启美(南京大学电子科学与工程系,江苏南京210093)摘要:为了在DSP上实现网络视频传输,提出了一种有效、经济的嵌入式TCP,IP协议栈实现方案。详细阐述了其协议接口的设计,包括操作系统API及底层驱动程序的设计,给出了网络初始化的控制流程。关键词:DSPTMS320DM642TCP/IPLwIP嵌入式系统嵌入式视频通信系统由视频数据采集、处理和通信输,而UDP提供不可靠的数据传输。与UDP相比,TCP等部件组成,需要嵌入式网络协议栈的支持。中央处理的可靠性是通过非常复杂的措施以及由此增加的开销器采用DsP,占用了大量资源,而网络协议栈能够使用为代价获得的。监控终端传输的数据大部分是图像编码的运算资源、内存资源有限,并且缺乏操作系统给网数据,这些数据对实时性和传输率的要求高,而对……
  • 所需E币: 4
    时间: 2019-12-24 11:11
    大小: 3.75MB
    上传者: givh79_163.com
    这是uT/LwIP的第一个版本,基于开源网络协议栈LwIP(版本1.3.2)进行优化移植而发布。此预览版本基于通用的SPI接口网络芯片ENC28J60而发布,MCU选择ST公司的STM32F407VG。预览版提供了KEILMDK、IAREWARM、uT/Studio的工程文件,以及用于学习的实验教程,配置指南和例程源代码。详细描述如下:一、特性有:a.支持三个常用的开发环境,方便客户根据具体情况选择使用。b.采用SPI接口的ENC28J60网络芯片,增加了硬件支持的通用性。c.提供http协议测试例程,用于验证uT/LwIP协议栈的功能。d.使用uTenux操作系统中的消息缓冲区实现uT/LwIP协议栈的邮箱功能。e.http例程提供了不依赖操作系统的rawapi方式,便于验证底层硬件的网络收发。二、支持的芯片有:a.SPI接口的所有Cortex-M微控制器(本版本提供STM32f407F407VG为例的源代码)。b.Microchip公司的SPI接口网络芯片ENC28J60。三、支持的环境有:a.悠龙软件的uT/StudioV3.1(Eclipse/GCCEABI,支持CMSIS3.0)。b.IAREWARM6.50.6。c.KEILRealViewMDK4.71a。预定在9月会推出1.0.00(Stable版),包括调整目录结构方便用户增加代码和修改,以及增加LwIP的应用层协议样例等。……
  • 所需E币: 3
    时间: 2019-12-24 00:46
    大小: 8.81MB
    上传者: quw431979_163.com
    LwIP在ucOSII下的移植相关资料……
  • 所需E币: 3
    时间: 2019-6-15 23:45
    大小: 5.83MB
    上传者: royalark_912907664
    STM32F429LWIP开发手册
  • 所需E币: 3
    时间: 2019-6-11 22:46
    大小: 1.01MB
    上传者: royalark_912907664
    介绍一种基于高性能、低成本ARM处理器--STM32的嵌入式设备以太网通信技术的系统设计,系统充分利用μC/OS-II实时操作系统和LwIP轻量型网络协议栈的特点,通过以太网控制器DP83848和RJ45接口连接网络,实现上位机和客户端的双向数据传输。测试结果表明,基于μC/OS-II和LwIP的嵌入式设备联网系统设计是正确和可靠的。
广告