精华内容
下载资源
问答
  • :网络通信技术的迅速发展,电子设备要求远程数据传输功能越来越普遍。现在对于智能仪表的通信,都是通过个工业总线、串口通信来完成的,以后...为了推动产品的网络化,本文在LwIP协议栈的基础上,提出PCP协议的应用。
  • 1.LWIP协议栈配合串口调试助手测试 调试助手发送数据为字符串格式,在LWIP协议中可使用strcmp()函数进行比对。 如:if(strcmp(recv_data,p->payload) == 0){} lwip发送数据tcp_write();在网络调试...

    1.LWIP协议栈配合串口调试助手测试

    调试助手发送数据为字符串格式,在LWIP协议中可使用strcmp()函数进行比对。

    如:if(strcmp(recv_data,p->payload) == 0){}

    lwip发送数据tcp_write();在网络调试助手显示的同样是字符串格式(自动转换成字符串)。

    tcp_write()中输入发送数据指针类型不限。

    2.LWIP协议栈中判断tcp服务器程序判断服务器是否被连接

    每次有客户端连接服务器,lwip都会调用accept_callback()回调函数,所以可以在该函数中设定一标志位来判断服务器连接状态。

    每次客户单断开连接时,lwip都会调用accept_callback()回调函数,会进入if (!p){}判断语句,可在其中设置标记位判断客户端断开连接。

    tpcb->state为状态检测为,也可以标记tcp连接状态,但要注意指针的使用方式。

    展开全文
  • 网络通讯采用4G转以太网和wifi,这两种通讯并不是采用的串口透传,而是采用驱动加上TCP/IP网络协议栈(lwip)。 文档主要讨论TCPIP技术,内容参考了TCPIP详解、老衲五木(朱升林)的微博,朱老师写的微博让我...

    最近做的项目涉及到网络协议及应用,准备写文档用于记录一下自己学习过程。我在公司的做产品是无人机编队及基站开发,在整个系统中,我主要负责设备端(无人机,基站)网络通讯这块的软件开发。网络通讯采用4G转以太网和wifi,这两种通讯并不是采用的串口透传,而是采用驱动加上TCP/IP网络协议栈(lwip)。
    文档主要讨论TCPIP技术,内容参考了TCPIP详解、老衲五木(朱升林)的微博,朱老师写的微博让我对网络这块有了进一步的了解。
    文档内容涉及到概念与协议分成结构如下图所示:
    在这里插入图片描述
    1.网络接口管理
    参考TCP/IP协议分层结构,逻辑上将LWIP分为4个层次:链路层、网络层、传输层、应用层,本文讨论的网络接口属于链路层的范畴。运行LWIP的嵌入式设备可以有很多网络接口,这些接口可以互不相同,比如以太网、wifi、环回接口等,为了实现对网络接口的管理,协议栈内部采用了一个netif的网络接口来描述各种网络设备。对网络接口的有效管理是协议栈与外部通讯的关键,网络接口目的是为具体的网络硬件、软件进行统一的封装,并未上层协议(IP层)提供统一的接口服务。为了实现对每个网络接口的管理,lwip会为每个接口分配一个netif的结构来描述每个接口的特性,如接口IP地址、MTU、接口状态等。同时为网络硬件接口注册对应的操作函数,如数据包输入、输出函数等。内核会将所有的netif结构挂接到一个全局变量netif_list的链表上。当有IP数据包要发送时,IP会根据目的IP选择合适的网络接口并调用发送函数发送数据。当有网卡数据接收时,其注册的数据包接收函数就会被调用,将接收的数据递交给IP层处理。netif这个接口结构比较大,其中很多字段和编译选项有关,下面是根据我项目情况去掉编译选项字段的netif结构,现在我们来分析分析这个结构:

     /** 定义的初始化,发送,接收函数指针类型  */
    typedef err_t (*netif_init_fn)(struct netif *netif);
    typedef err_t (*netif_input_fn)(struct pbuf *p, struct netif *inp);
    typedef err_t (*netif_output_fn)(struct netif *netif, struct pbuf *p,ip_addr_t *ipaddr);
    typedef err_t (*netif_linkoutput_fn)(struct netif *netif, struct pbuf *p);
    struct netif {
      /** 指向下一个netif结构的指针 */
      struct netif *next; 
      /** 当前网络接口的IP地址信息 */
      ip_addr_t ip_addr;//IP地址
      ip_addr_t netmask;//子网掩码
      ip_addr_t gw;//网关地址
    
      /** 注册的向IP层输入函数 */
      netif_input_fn input;
      /** 注册的IP层数据发送函数,一般会是etharp_output这个函数 */
      netif_output_fn output;
      /** 由arp调用,实现的最底层的硬件发包函数 */
      netif_linkoutput_fn linkoutput;
    
      /** 该字段可以由用户设置,用于指向一些底层设备信息  */
      void *state;
      
    #if LWIP_DHCP
      /** DHCP获取IP地址 */
      struct dhcp *dhcp;
    #endif /* LWIP_DHCP */
    
      /** 该网络接口允许的最大数据包长度 */
      u16_t mtu;
      /** 该网络接口硬件地址长度 */
      u8_t hwaddr_len;
      /** 网络接口硬件地址 */
      u8_t hwaddr[NETIF_MAX_HWADDR_LEN];
      /** 接口状态属性 */
      u8_t flags;
      /** 网络接口名字 */
      char name[2];
      /** 网络接口编号 */
      u8_t num;
    /** 环回网卡,进程间通讯就可使用,wpa_supplicant与wpa_cli使用的就是环回网卡通讯 */
      struct pbuf *loop_first;//指向环回网卡接收的第一个数据包
      struct pbuf *loop_last;//指向环回网卡接收的最后一个数据包
    };
    

    next字段是指向下一个netif结构的指针。我们的一个产品可能会有多个网卡芯片,LWIP会把所有网卡芯片的结构体链成一个链表进行管理,有一个netif_list的全局变量指向该链表的头部。next字段就是用于链表用,比如我就用到2个网卡(eth_netif,wifi_netif)。
    ip_addr、netmask、gw三个字段用于发送和处理数据包用,分别表示IP地址、子网掩码和网关地址。三个字段在数据包发送时有重要作用,当目的地址与当前网卡地址不在同一网段内,我们会将数据先发送到网关地址,由网关进行转发。IP地址和网卡设备必须一一对应。
    input字段指向一个函数,这个函数将网卡设备接收到的数据包提交给IP层,使用时将input指针指向该函数即可,后面将详细讨论这个问题。该函数的两个参数是pbuf类型和netif类型的,返回参数是err_t类型。其中pbuf代表接收到的数据包。
    output字段向一个函数,这个函数和具体网络接口设备驱动密切相关,它用于IP层将一个数据包发送到网络接口上。用户需要根据实际网卡编写该函数,并将output字段指向该函数。该函数的三个参数是pbuf类型、netif类型和ip_addr类型,返回参数是err_t类型。其中pbuf代表要发送的数据包。ipaddr代表网卡需要将该数据包发送到的地址,该地址应该是接收实际的链路层帧的主机的 IP 地址,而不一定为数据包最终需要到达的IP地址。例如,当要发送 IP信息包到一个并不在本地网络里的主机上时,链路层帧会被发送到网络里的一个路由器上。在这种情况下,给 output 函数的 IP地址将是这个路由器的地址。
    linkoutput字段和上面的output基本上是起相同的作用,但是这个函数是在ARP模块中被调用的,注意这个函数只有两个参数。实际上output字段函数的实现最终还是调用linkoutput字段函数将数据包发送出去的。
    state字段可以指向用户关心的关于设备的一些信息,用户可以自己设定。
    hwaddr_len和hwaddr[]表示MAC地址长度和MAC地址,一般MAC地址长度为6。
    mtu字段表示一次可以传送的最大字节数,对于以太网一般设为1500。
    flags字段是网卡状态信息标志位,是很重要的控制字段,它包括网卡功能使能、广播使能、ARP使能等等重要控制位。
    2.函数实现
    当我们想要添加一个网络接口时,应该怎么使用函数来添加新的网络设备,下面是列出与网路接口相关的函数。
    /** 网络接口初始化*/
    struct netif *netif_add(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask,
    ip_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input);
    /**动态设置网络接口的IP,netmask,gateway信息.
    *我们在接口初始化时可以使用IP4_ADDR()来设置网络接口的IP,netmask,gateway.
    *但如果在使用中想动态修改IP地址信息,必须使用netif_set_addr()函数.
    */
    void netif_set_addr(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t netmask,ip_addr_t gw);
    /
    删除网络接口 */
    void netif_remove(struct netif * netif);
    /**通过名字找到netif结构 */
    struct netif *netif_find(char *name);
    /**设置默认网络接口,当发送数据时,没有找到匹配的网络接口,会选择默认 */
    void netif_set_default(struct netif *netif);
    /**动态设置网络接口的IP,netmask,gateway信息
    *我们在接口初始化时可以使用IP4_ADDR()来设置网络接口的IP,netmask,gateway
    *但如果在使用中想动态修改IP地址信息,可以选用对应的函数。
    */
    void netif_set_ipaddr(struct netif *netif, ip_addr_t *ipaddr);
    void netif_set_netmask(struct netif *netif, ip_addr_t *netmask);
    void netif_set_gw(struct netif *netif, ip_addr_t *gw);
    /**使能网络接口 */
    void netif_set_up(struct netif *netif);
    /**关闭网络接口 */
    void netif_set_down(struct netif *netif);
    通过上面这些函数,向网络中添加网络接口,并将其设为默认网卡。(使用rtthread操作系统)。

    rt_uint8_t lwip_comm_init(void){
    	tcpip_init(NULL,NULL);		
    #if LWIP_DHCP	
    	ipaddr.addr = 0;
    	netmask.addr = 0;
    	gw.addr = 0;
    #else				
    	IP4_ADDR(&ipaddr,lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);
    	IP4_ADDR(&netmask,lwipdev.netmask[0],lwipdev.netmask[1] ,lwipdev.netmask[2],lwipdev.netmask[3]);
    	IP4_ADDR(&gw,lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);
    #endif
    	/**向网卡列表中添加一个网口*/
    	netifInitFlag=netif_add(&lwip_netif,&ipaddr,&netmask,&gw,NULL,&ethernetif_init,&tcpip_input);
    	if(netifInitFlag==NULL){
    		rt_kprintf("netif add fail!\n");
    		return 4;
    	}
    	else{  
    		netif_set_default(&lwip_netif); 
    		netif_set_up(&lwip_netif);
    		dhcp_start(&lwip_netif)	
    	} 
    	return 0;
    }
    

    我们来看看源码,是怎么添加网络接口,并注册发送接收函数。

    struct netif *
    
    netif_add(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask,struct ip_addr *gw,
    void *state,err_t (* init)(struct netif *netif),err_t (* input)(struct pbuf *p, struct netif *netif))
    {
    
      static u8_t netifnum = 0;
      netif->ip_addr.addr = 0;    //复位变量enc28j60中各字段的值
      netif->netmask.addr = 0;
      netif->gw.addr = 0;
      netif->flags = 0;         //该网卡不允许任何功能使能
      netif->state = state;      //指向用户关心的信息,这里为NULL
      netif->num = netifnum++; //设置num字段,
      netif->input = input;     //如前所诉,input函数被赋值
      netif_set_addr(netif, ipaddr, netmask, gw);  //设置变量ip信息三个地址
      if (init(netif) != ERR_OK) {    //用户自己的底层接口初始化函数
        return NULL;
      }
      netif->next = netif_list;     //将初始化后的节点插入链表netif_list
      netif_list = netif;          // netif_list指向链表头
      return netif;
    }
    

    上面的初始化函数调用了用户自己定义的底层接口初始化函数,这里为ethernetif_init,再来看看它的源代码:

    err_t  ethernetif_init(struct netif *netif)
    {
        netif->name[0] = IFNAME0;    //初始化变量的name字段
        netif->name[1] = IFNAME1;    // IFNAME在文件外定义的,这里不必关心它的具体值
        netif->output = etharp_output;   //IP层发送数据包函数
        netif->linkoutput = low_level_output;  // //ARP模块发送数据包函数
        low_level_init(netif);          //底层硬件初始化函数
    	return ERR_OK;
    }
    

    low_level_init函数就是与我们使用的硬件密切相关的函数了。
    网络接口内容比较多,但我在项目中用的到的大概就这么多。先暂时介绍到这里,后续再添加。
    3.动态修改设备IP
    当某个IP运行一段时间后,这个IP会留下许多足记,ARP会有此IP的很多缓存表,该IP地址会被很多TCP连接控制块会记录。这时如果需要重新设置IP,不能以新的IP地址来操作调用内核初始化,这种操作结果是不可预知的,内存溢出,系统跑飞都有可能发生,因为该IP的分配的资源并未释放。在重新动态设置IP地址前先禁用网卡,设置好之后重新是能网卡。禁用网卡中会删除该IP在ARP中缓存表数据,然后调用netif_set_addr重新设置网卡时会删除旧IP连接的控制块,这样就能保证不能在通过旧IP发送数据包。重新设置IP的代码示例如下:

    /* 正确做法*/
    netif_set_dowm(&wifi_netif);
    IP_ADDR(&netip,192,168,1,1);
    IP_ADDR(&netmask,255,255,255,0);
    IP_ADDR(&gw,192,168,1,0);
    netif_set_addr(&wifi_netif,&netip,&netmask,&gw);
    netif_set_up(&wifi_netif);
    /*错误做法,这样就没有删除与旧IP的连接控制块*/
    netif_set_dowm(&wifi_netif);
    IP_ADDR(&wifi_netif.ip_addr,192,168,1,1);
    IP_ADDR(&wifi_netif.netmask,255,255,255,0);
    IP_ADDR(&wifi_netif.gw,192,168,1,0);
    netif_set_up(&wifi_netif);
    

    4.项目实际应用
    项目中我们使用的4G移动网络连接的是远程服务器,wifi连接是本地服务器,两种接口同时运行与无人机设备上,无人机将状态通过这两种网络接口发送到对应的服务器,实现了4G远程与本地同时在线功。由于wifi未连接到公网中,无法将数据转发到远程服务器,4G也无法将数据发送到本地服务器,那么是怎么选择相应的网络接口。本地服务器所在IP处于与AC的网段(192.168.1.X),路由器通过网线连接AC,无人机连接路由器,无人机IP是192.168.X.X,网关是192.168.X.1,路由器IP是192.168.1.X。4G转以太网网络接口(相当设备通过以太网连接了一个4G网关,所以4G的IP是192.168.100.X,网关是192.168.100.1)。当我要发送数据的时候,IP路由需要根据服务器IP来选择对应的网络接口,需要对协议进行修改。根据目的IP选择对应的网口,如果目的IP是公网IP,选择4G接口,如果是本地,择选择wifi。
    修改如下:

    ip_addr_t desaddr;
    struct netif * ip_route(ip_addr_t *dest)
    {
    	struct netif *netif;
     	for (netif = netif_list; netif != NULL; netif = netif->next) {
       		if (netif_is_up(netif)) {
    			/*查找与目的IP在同一网段内的网卡*/
        	 	if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) {
           			return netif;
          		}
         	}
         }
        /*********************此处为添加修改代码*******************************/
      	//比较目的IP是不是在192.168.1.X的网段,如果在则选择wifi网卡
      	IP4_ADDR(&desaddr,192,168,1,2);
     	if(ip_addr_netcmp(dest, &desaddr, &(wifi_netif->netmask))){
    		return wifi_netif;
      	}
      	/*********************此处为添加修改代码*******************************/
      	//不在则选择默认网卡,将4G的设为默认网络网络接口
      	return netif_default;
    }
    
    展开全文
  • 本程序是TI的32位单品机LM3S9D96官方开发板上,基于IAR平台的,用C语言编写的,基于LWIP协议的UDP客户端的通信完整工程文件。从电脑传的数据经网口可在液晶屏幕及串口上同时显示。已经调通。改程序综合了,串口,...
  • 本程序是TI的32位单品机LM3S9D96官方开发板上,基于IAR平台的,用C语言编写的,基于LWIP协议的TCP客户端的通信完整工程文件。从电脑传的数据经网口可在液晶屏幕及串口上同时显示。已经调通。改程序综合了,串口,...
  • stm32f407移值rt_thread加lwip协议,DHCP获取IP地址成功后想在程序中使用获取到的IP地址 找了很久没有找到相关文档,串口调试输入ifconfig倒是可以看到IP地址,具体在程序中哪个函数获取到的IP地址却找不到。 ...

    stm32f407移值rt_thread加lwip协议,DHCP获取IP地址成功后想在程序中使用获取到的IP地址

    找了很久没有找到相关文档,串口调试输入ifconfig倒是可以看到IP地址,具体在程序中哪个函数获取到的IP地址却找不到。

    解决办法

    1.需要先在LWIP协议栈中打开调试信息,先在rtconcig.h文件里添加#define RT_LWIP_DEBUG宏定义

    2.在LWIP的lwpopts.h里面添加两个调试的宏定义

    3.编译下载,会发现输出了很多调试信息,如图最后一条是绑定了一个IP地址

    其中0x8201a8c0就是当前获取到的IP地址,只不过是倒序排列了

    c0 = 192     a8 = 168     01 = 1     82 = 130

    所以我的板子获取到的IP地址就是192.168.1.130,用ficonfig命令查询如图

    然后在整个工程中搜索dhcp_bind(): IP:这句找到在dhcp.c文件的第1113行,

    所以说ip4_addr_get_u32(&dhcp->offered_ip_addr)这个东西就是当前的IP地址了。

    找到之后再把rtconfig.h和lwipopts.h文件里加进去的宏定义删掉就OK了。

    记录一下,以备下次查询。

     

     

    展开全文
  • 2、在SDK中,创建一个lwIP Echo Server工程,什么都不改,直接编译,下载,需要注意,因为没有调用任何PL资源,因此可以不用下载FPGA 3、全速运行,打开串口CTR,观察串口打印信息,发现卡在网络..

    硬件环境:创龙TLZ7XH-EVM开发板

    软件环境:VIVADO 2017.4

     

    1、调用ZYNQ核

    查开发板原理图,MIO16-27为以太网接口52、53为MDIO接口,配置如下

    使能串口1,选择12-13,如下

    其他不用改,直接生成bit文件,导出到硬件,启动SDK

    2、在SDK中,创建一个 lwIP Echo Server工程,什么都不改,直接编译,下载,需要注意,因为没有调用任何PL资源,因此可以不用下载FPGA

    3、全速运行,打开串口CTR,观察串口打印信息,发现卡在网络自协商,怀疑是自协商不通过的问题,因此更改LWIP对应的.mss文件,选择不自动协商,强制1000Mbps

    4、全速运行,显示

    -----lwIP TCP echo server ------
    TCP packets sent to port 6001 will be echoed back
    link speed for phy address 0: 1000
    Board IP: 192.168.1.10
    Netmask : 255.255.255.0
    Gateway : 192.168.1.1
    TCP echo server started @ port 7

    以为通了,ping此地址,不通。

    5、怀疑是PHY芯片的原因,因为开发板没有拆屏幕,故不知道他的核心板用的什么PHY,查开发板自带的资料,发现在LWIP Demo中重写了xemacpsif_physpeed.c文件,怀疑就是PHY的问题,将此文件复制到工程对应的文件夹下并替换,重新编译,下载,全速运行,可以ping通,且telnet有回声。

    结束。

    展开全文
  • 由于本人属于菜鸟中的菜鸟,所以,学习 lwip协议栈及STM32花费不少时间。经过一段时间的学习对于 Stm32F407了解只局限于以太网控制器、中断 、串口、定时器、网口、GPIO、SYSTICK等初步了解。后来 一边学 vb.net 、 ...
  • LwIP串口当网卡

    2020-10-17 15:52:31
    《嵌入式网络那些事——STM32物联实战》第6.1节:“在LwIP运行的目标系统上可能存在多个网络接口,比如可能有多个网卡,也可能有串行网络接口(串口),还可能有环回接口。” 这就说明可以用串口作为网卡使用。 找到...
  • 文中介绍一种基于高性能处理器STM32的嵌入式串口设备联网技术的系统设计,该系统充分利用UCOS-II实时操作系统和LwIP轻量型网络协议栈的特点,采用DM9161快速以太网PHY和STM32微处理器等组成,通过以太网实现上位机...
  • 软件主要实现5个任务:时钟初始化/操作系统初始化任务,修改IP、子网掩码、网关的菜单任务,LwIP初始化任务,网口初始化任务,网口向串口串口向网口发送数据任务。给出了主函数和主程序流程图。实际应用效果良好。
  • 一、基本概念 1、网络协议 GPRS无线数据传输的最低层,即物理层是通过RS232串口及GPRS模块组成的,然后是数据链路层。...针对LWIP来看,硬件结构可以分为网卡或者串口两种物理层架构,如果用到网卡将使用
  • TI Cortex M3串口转以太网例程上层应用的...对于lwIP,陌生的同学可以到网上查查,它是是瑞士的Adam编写的一个开源TCP/IP协议。既然串口转以太网例程的基础是lwIP,那么还是看看lwIp是如何移植到TI的Cortex M3硬件中
  • 1、熟悉带串口工业以太网交换机lwiP协议栈及SNMP部分源码,为带串口工业以太网交换机增加SNMP功能、SStool搜索设备IP功能及组播侦听协议移植 2、熟悉98dx3135 sdk,熟悉linux开发及网络编程,为28口工业以太网...
  • 在做ppp驱动3G/4G模块时,用的LWIP协议栈,循环接收处理串口数据时,会调用这2个函数中的一个 pppos_input(); pppos_input_tcpip() 看下面这段话,我理解的意思是,pppos_input_tcpip()是线程安全的,可以...
  • 最近公司要使用移远的EC200S模组进行物联网开发,除了EC200S模组还要支持以太网,而以太网是使用了LWIP协议栈,为了减少4G模块的开发量,以及为了后续的数据处理的方便和别的功能的实现就没有使用EC200S内置的协议,...
  • 系统以STM32F207VGT6处理器为核心,选择轻量级的LwIP作为以太网协议栈,将LwIP TCP/IP协议栈移植到STM32F207VGT6上,在应用层实现了一个网络、串口数据双向传输的数据传输系统。经测试,其传输速率优于同条件下RS232...
  • VXI-11基于STM32 LWIP实现

    2021-03-24 09:52:20
    基于NI-VISA 接口开发相应 USBTMC,VIX11-CORE,GPIB,现已经全部实现, 手头上是基于STM32F107 配置USB口(USB_TMC),网口LWIP(VIX11-core),GPIB(IO模拟协议),串口
  • 通常串口服务器采用ARM9微处理器和带TCP/IP协议栈的付费操作系统,而文中提出的串口服务器是通过移植LWIP协议栈到代码开源的μC/OS-Ⅱ中实现,这样不但降低成本,而且代码的编写更加透明、灵活。
  • LwIP实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用,它只需十几KB的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。 关于以太网的相关信息这里不做详细介绍,我只介绍...
  • 1.打开STM32CubeMX,新建一个工程,我的板子是官方NUCLEO-F429ZI,自带网口,适合搞网络协议栈。打开外设ETH,注意引脚要与实际对应。 2.参数设置,注意PHY地址要设为0 3.打开调试串口USART1,参数按默认的即可 4....
  • ESP8266EX 串口WIFI无线模块

    千次阅读 2019-05-06 13:45:29
    内部跑LWIP协议,支持三种模式:AP\STA\AP\+STA共存模式、简洁高效的AT指令。 特点 支持无线802.11 b/g/n标准 支持STA/AP/STA+AP 三种工作模式 内置CTP/IP协议栈,支持多路TCP Client连接 支持丰富的Socket AT...
  • TI官网下载StellarisWare软件包,,按默认路径解压缩,在C:\StellarisWare内有多个文件夹,其中C:\StellarisWare\board\rdk-s2e文件夹内即为主角:串口转以太网的源码。它使用lwIP1.3.2为TCP/IP协议栈。
  • ESP-01S是体积超小的802.11b/g/n Wi-Fi SOC模块,采用低功率32位CPU,可兼作应用处理器,主频最高可达160MHz,内嵌Lwip协议栈,支持STA/AP/STA+AP工作模式,采用通用AT指令,可以方便进行开发。 引脚说明如下所示:...
  • STM32跑SLIP协议

    2021-03-31 09:39:13
    为了充分利用openwrt的网络功能,决定在stm32上lwip,底层跑基于串口的SLIP协议。 经过2周的调试,功能已完全调通。 在openwrt中ping stm32,效果如下: 64 bytes from 192.168.0.32: seq=53 ttl=2...
  • 2.移植LWIP-V1.3.1 TCP/IP协议栈,使用TCP通信模式,在上层另外加了一层用户协议封装。 3.设备采用串口通信来交互控制,波特率115200. 4.内部还加如HTTP,TFTP服务器模式可供选择使用。 该软件已经用在我们的产品中,...
  • ENC28J60学习笔记——第1部分

    万次阅读 多人点赞 2013-10-31 21:57:10
    嵌入式以太网开发,可以分为两个部分,一个是以太网收发芯片的使用,一个是嵌入式以太网协议栈的实现。以太网收发芯片的使用要...嵌入式以太网协议栈有著名的uIP协议栈,Lwip协议栈,还有其他嵌入式高手开发的协议栈。
  • 而目前嵌入式系统中大量应用低速处理器,受内存和速度限制,实现完整的TCP/IP协议较为困难,LwIP作为较为成熟的嵌入式TCP/IP协议栈受到了广泛的应用。  1 硬件平台  本通信系统的硬件平台由以下几个部分组成:...
  • stm32f407-my-bsp1.rar

    2020-04-11 16:11:46
    STM32F407芯片RT Thread系统下移值LWIP协议,采用DP83848的PHY芯片,工程源代码,串口1为shell端口。

空空如也

空空如也

1 2 3
收藏数 53
精华内容 21
关键字:

串口lwip协议