LWIP接收例程

以太网是TI公司9b96这款芯片特色外设,或者说之所以选择9b96这款芯片,就是要用它的以太网。但是开发板给的光盘中有关以太网的例子,如enet_lwip,初学者搞不清楚这个目录中的这些文件是干什么的,这些文件都需要吗?


大家可以看出enet_lwip例子文件结构比较混乱,不知道哪些是我们要用到的源文件,不知道哪些是该工程必须用到的库文件,有些学生可能自己新建一个工程,但是编译时会出现错误,提示找不到包含的头文件,但又不知道这些头文件到哪去找?

下面是以太网最简单的例子,用网络助手发送数据,可以进入到以太网中断处理函数中。

/******* 这是一个回调函数,当有UDP数据收到时会被调用********/
// addr:笔记本的IP地址(存放向开发板发送数据的PC的IP地址)
// port:笔记本的端口号(远端端口号)
void UDP_Receive(void *arg, struct udp_pcb *upcb, struct pbuf *p_rx,
                 struct ip_addr *addr, u16_t port)
{
  memset(UDPData, 0, 1020);
  
  if (p_rx != NULL)                              // 如果收到的数据不为空             
  {
    memcpy(UDPData, (char *)p_rx->payload, p_rx->len);
    
    p_tx->len = p_tx->tot_len = p_rx->len;
    IP_Addr_Tmp = UdpPcb->remote_ip;
    UdpPcb->remote_ip = *addr;                  // 获取笔记本的IP地址(远端IP地址)
    udp_send(UdpPcb, p_tx);
  }
  UdpPcb->remote_ip = IP_Addr_Tmp;
  
  pbuf_free(p_rx);                              // 释放缓冲区数据
}


// 如果在回调函数中发送数据,不用connect; 在回调函数外发送数据必须要connect,否则接收不到数据
void UDP_Test_Init(void)
{
  p_tx = pbuf_alloc(PBUF_RAW, sizeof(UDPData), PBUF_RAM);  // 按照指定类型分配一个pbuf结构体  // struct pbuf *p_tx;
  p_tx->payload = (void *)UDPData;              // DI16实际发送数据内存区
  
  local_addr.addr = 0x0A01A8C0;                 // 本地IP地址:192.168.1.10
   
  UdpPcb = udp_new();                       // 创建udp协议控制块
  udp_bind(UdpPcb, &local_addr, 1025);      // 在协议控制块中绑定本地ip地址和本地端口号,本地:开发板(程序下到开发板中)
  udp_connect(UdpPcb, IP_ADDR_ANY, 1025);   // 与远端udp主机建立连接,远端:笔记本
  udp_recv(UdpPcb, UDP_Receive, NULL);      // 设置数据接收时的回调函数
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
lwIP是一个轻量级的开源TCP/IP协议栈,适用于嵌入式系统。它提供了TCP、UDP、IP、ICMP和ARP等网络协议的实现,可以用于构建网络应用程序。下面是一个lwIP的TCP例程示例: ```c #include "lwip/tcp.h" // TCP连接回调函数 err_t tcp_connected_callback(void *arg, struct tcp_pcb *tpcb, err_t err) { if (err == ERR_OK) { // 连接成功 // 在这里可以发送数据或者进行其他操作 } else { // 连接失败 // 可以进行错误处理 } return err; } // TCP接收数据回调函数 err_t tcp_receive_callback(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) { if (p != NULL) { // 接收到数据 // 在这里可以处理接收到的数据 // 处理完数据后,需要调用tcp_recved()函数通知lwIP已经处理完数据 tcp_recved(tpcb, p->tot_len); // 释放pbuf pbuf_free(p); } else { // 连接已关闭 // 可以进行清理操作 tcp_close(tpcb); } return ERR_OK; } // TCP连接关闭回调函数 void tcp_closed_callback(void *arg, err_t err) { // 连接已关闭 // 可以进行清理操作 } // 创建TCP连接 void tcp_connect() { struct tcp_pcb *pcb; ip_addr_t remote_ip; err_t err; // 设置远程IP地址和端口号 IP4_ADDR(&remote_ip, 192, 168, 2, 194); u16_t remote_port = 53538; // 创建一个新的TCP PCB pcb = tcp_new(); if (pcb != NULL) { // 设置连接成功回调函数 tcp_arg(pcb, NULL); tcp_err(pcb, tcp_closed_callback); tcp_recv(pcb, tcp_receive_callback); // 发起连接 err = tcp_connect(pcb, &remote_ip, remote_port, tcp_connected_callback); if (err != ERR_OK) { // 连接失败 // 可以进行错误处理 tcp_close(pcb); } } } ``` 这个例程演示了如何使用lwIP库创建一个TCP连接,并实现连接成功、接收数据和连接关闭的回调函数。你可以根据自己的需求在回调函数中添加相应的处理逻辑。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值