不带系统的UDP发送数据为何还要接收函数?

凹特慢 2017-12-25 10:21:02
大家好,最近在做单片机UDP通信的例子,需求是:将数据通过UDP发送到上位机的网络助手。在参考例子时,发现在发送的时候必须要一个接收的函数,这个有点不理解,如果我只是想单独发送数据到上位机的网络串口助手,为何还需要接收函数?我的mcu不需要接收数据包啊,只管发送啊,上位机也没有往下发数据。
以下是我参考的例子,例子的功能是将接收到的数据再发出去,我将其再发出去的注释,并在主函数中加入自己发送数据的函数。发送hello到上位机。
main函数如下:
int main(void)
{
struct netif fsl_netif0;
ip4_addr_t fsl_netif0_ipaddr, fsl_netif0_netmask, fsl_netif0_gw;

CLOCK_EnableClock(kCLOCK_InputMux);
BOARD_InitPins();
BOARD_BootClockFROHF48M();
time_init();

IP4_ADDR(&fsl_netif0_ipaddr, configIP_ADDR0, configIP_ADDR1, configIP_ADDR2, configIP_ADDR3);
IP4_ADDR(&fsl_netif0_netmask, configNET_MASK0, configNET_MASK1, configNET_MASK2, configNET_MASK3);
IP4_ADDR(&fsl_netif0_gw, configGW_ADDR0, configGW_ADDR1, configGW_ADDR2, configGW_ADDR3);

lwip_init();

netif_add(&fsl_netif0, &fsl_netif0_ipaddr, &fsl_netif0_netmask, &fsl_netif0_gw, NULL, ethernetif_init,ethernet_input);
netif_set_default(&fsl_netif0);
netif_set_up(&fsl_netif0);

udpecho_raw_init();


struct pbuf *q = NULL;
const char* senddata = "Hello\n";
struct udp_pcb *upcb;
err_t stus;
upcb = udp_new();
udp_bind(upcb, IP_ADDR_ANY, 7);
q = pbuf_alloc(PBUF_TRANSPORT, strlen(senddata)+1, PBUF_ROM);
if(!q)
{
PRINTF("out of PBUF_RAM\n");
}
q->payload = (void *)senddata;
while (1)
{
udp_sendto(upcb, q, &fsl_netif0_gw, 7);
ethernetif_input(&fsl_netif0);

sys_check_timeouts(); /* Handle all system timeouts for all core protocols */
}
}

然后将原来接收后原封不动发送出去的部分给注释掉:
2.将udpecho_raw.c中的udpecho_raw_recv函数修改如下:红色部分为修改
static void udpecho_raw_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p,
const ip_addr_t *addr, u16_t port)
{
// LWIP_UNUSED_ARG(arg);
// if (p != NULL) {
// /* send received packet back to sender */
// udp_sendto(upcb, p, addr, port);
// /* free the pbuf */
// pbuf_free(p);
// }
}


上述代码可以实现我需要的功能,就是发送hello到上位机,但是我不理解为何需要 ethernetif_input(&fsl_netif0);这个接收函数???因为目前我的MCU不需要接收啊,根据定义也是读数据的时候用到。
以下是关于该函数的说明和定义
/**
* This function should be called when a packet is ready to be read
* from the interface. It uses the function low_level_input() that
* should handle the actual reception of bytes from the network
* interface. Then the type of the received packet is determined and
* the appropriate input function is called.
*
* @param netif the lwip network interface structure for this ethernetif
*/
void ethernetif_input(struct netif *netif)
{
struct pbuf *p;

LWIP_ASSERT("netif != NULL", (netif != NULL));

/* move received packet into a new pbuf */
while ((p = low_level_input(netif)) != NULL)
{
/* pass all packets to ethernet_input, which decides what packets it supports */
if (netif->input(p, netif) != ERR_OK)
{
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
pbuf_free(p);
p = NULL;
}
}
}
...全文
478 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
凹特慢 2017-12-28
  • 打赏
  • 举报
回复
引用 6 楼 tianxj001 的回复:
[quote=引用 5 楼 zengzx0107 的回复:] [quote=引用 1 楼 tianxj001 的回复:] udp发送,数据报文经过一定处理后,传入IP层,这里就牵涉IP地址解析和网段匹配、查找等子功能。 类似的各种协议,通俗点,你也可以理解为握手通信,只不过,这里的握手,不一定是点对点,而是点对面。这里的面是指网络各相关网关啊,路由啊等设备。所以,肯定必须有接收函数,以获取相关设备的应答数据。
谢谢!按照你的这个意思,我在初始化的时候执行一次那个函数就应该OK了吧,但是我调试的结果是必须每次发送的时候都要执行。[/quote] 是这样啊,这是协议2个层的关系,不是开始执行后面不需要的问题,每发送一个包都含上面我说的动作啊(预处理--IP层--链路解析--接受端)。[/qu 但是我的接收并没有做任何操作,只是相当于在这里注册了,并没有接收数据解析这些操作
tianxj001 2017-12-28
  • 打赏
  • 举报
回复
引用 5 楼 zengzx0107 的回复:
[quote=引用 1 楼 tianxj001 的回复:] udp发送,数据报文经过一定处理后,传入IP层,这里就牵涉IP地址解析和网段匹配、查找等子功能。 类似的各种协议,通俗点,你也可以理解为握手通信,只不过,这里的握手,不一定是点对点,而是点对面。这里的面是指网络各相关网关啊,路由啊等设备。所以,肯定必须有接收函数,以获取相关设备的应答数据。
谢谢!按照你的这个意思,我在初始化的时候执行一次那个函数就应该OK了吧,但是我调试的结果是必须每次发送的时候都要执行。[/quote] 是这样啊,这是协议2个层的关系,不是开始执行后面不需要的问题,每发送一个包都含上面我说的动作啊(预处理--IP层--链路解析--接受端)。
凹特慢 2017-12-28
  • 打赏
  • 举报
回复
引用 1 楼 tianxj001 的回复:
udp发送,数据报文经过一定处理后,传入IP层,这里就牵涉IP地址解析和网段匹配、查找等子功能。 类似的各种协议,通俗点,你也可以理解为握手通信,只不过,这里的握手,不一定是点对点,而是点对面。这里的面是指网络各相关网关啊,路由啊等设备。所以,肯定必须有接收函数,以获取相关设备的应答数据。
谢谢!按照你的这个意思,我在初始化的时候执行一次那个函数就应该OK了吧,但是我调试的结果是必须每次发送的时候都要执行。
凹特慢 2017-12-28
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
你把ethernetif_input(&fsl_netif0);注释掉,看看行不行咯,应该不是非要不可
我已经说了啊 ,必须要这个函数啊 不然不行啊
tianxj001 2017-12-28
  • 打赏
  • 举报
回复
作为发送方是不做这些解析的,是由外部网络设备完成,你需要做的就是正确的时序和应答,而这个应答就是你执行一次接受函数,这就是你发送时候必须执行应答函数的原因。
worldy 2017-12-26
  • 打赏
  • 举报
回复
你把ethernetif_input(&fsl_netif0);注释掉,看看行不行咯,应该不是非要不可
tianxj001 2017-12-26
  • 打赏
  • 举报
回复
当然,作为非标准模式,你只是简单的点对点UDP,甚至不需要IP地址就可以实现通信,但前提是你得自己做非标准的UDP底层函数。
tianxj001 2017-12-26
  • 打赏
  • 举报
回复
udp发送,数据报文经过一定处理后,传入IP层,这里就牵涉IP地址解析和网段匹配、查找等子功能。 类似的各种协议,通俗点,你也可以理解为握手通信,只不过,这里的握手,不一定是点对点,而是点对面。这里的面是指网络各相关网关啊,路由啊等设备。所以,肯定必须有接收函数,以获取相关设备的应答数据。

27,370

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧