全部例程

上位机搜索和配置

W5500 其他标签

2025/02/12 更新

本篇文章我们将详细介绍如何在W5500芯片上面实现上位机搜索和配置功能,并通过实战例程,为大家讲解如何通过上位机搜索局域网中的W5500,并进行网络地址配置。例程中提供了一个开源的上位机配置工具SmartConfigTool,支持搜索设备,设置网络地址参数以及固件升级等功能。

该例程用到的其他网络协议,例如DHCP,请参考相关章节。有关初始化过程,请参考Network Install章节,这里将不再赘述。

上位机简介

嵌入式上位机(Embedded Host)是指在嵌入式系统中,作为与嵌入式设备进行通信、控制和数据交换的上位设备。 它通常拥有更强的计算能力和存储资源,用于控制和监控下位嵌入式设备(如传感器、执行器、嵌入式控制器等)的运行。

特点

  • 高效性:上位机配置下位机可以大大提高控制系统的效率。上位机发出控制命令, 下位机接收并解释成相应的时序信号来直接控制设备,响应速度快,可靠性高。
  • 实时性: 下位机可以实时地响应上位机的控制指令,并对设备进行实时控制,确保系统的稳定性和安全性。 同时,下位机也可以实时地向上位机反馈设备状态数据,使得上位机可以及时了解系统状态并进行相应的控制调整。
  • 灵活性: 上位机和下位机可以灵活地组合和扩展,以满足不同系统的需求。上位机可以同时连接多个下位机, 对它们进行监控、控制和数据处理。同时,下位机也可以根据需要连接多个设备,实现设备的分布式控制。
  • 交互友好:上位机通常具有人机交互界面,为用户提供友好的图形界面或者文本界面,方便用户进行操作、配置和监控。

应用场景

  • 工业自动化:上位机发出控制指令,下位机接收并解释成相应的时序信号来直接控制设备,响应速度快,可靠性高。上位机可以监控生产过程、发出控制指令、 进行数据分析和优化等。下位机可以实时控制设备、采集设备状态数据、接收和执行控制指令等。
  • 物联网: 上位机可以远程监控和管理设备、进行数据分析和处理等。下位机可以接收和执行控制指令、采集和传输设备状态数据等。
  • 智能家居: 上位机可以发出控制指令、监控家庭网络等。下位机可以接收和执行控制指令、控制智能设备的运行和状态采集等。
  • 医疗设备: 上位机可以发出控制指令、远程监控和管理医疗设备等。下位机可以接收和执行控制指令、控制医疗设备的运行和状态采集等。

搜索和配置的基本工作流程

搜索:上位机通过 UDP 广播发送 FIND 命令,设备作为下位机在收到后将自身配置信息发送给上位机,上位机收到后呈现获取到的设备信息;

配置:在已经搜索到设备的基础上,上位机向该设备发送 SETT 命令后,设备收到后根据上位机显示的网络信息对本地进行重新配置,并在串口显示。

实现过程

接下来,我们在W5500上实现上位机搜索回复以及上位机配置功能。

步骤1:在主循环内调用do_udp_config()函数。


while (1)
{
  do_udp_config(SOCKET_ID); // Run and precess UpperComputer command.
}

步骤2:搜索和配置实现

do_udp_config()函数如下:


void do_udp_config(uint8_t sn)
{
  uint16_t i;
  uint16_t len = 0;
  uint8_t  rip[4];
  uint16_t rport;
  uint16_t local_port    = 1460;
  uint8_t  sw_version[2] = {1, 0};

  memset(RecvMsg.op, 0, sizeof(RecvMsg)); // clear RecvMsg

  switch (getSn_SR(sn))
  {
  case SOCK_UDP:
      if ((len = getSn_RX_RSR(sn)) > 0)
      {
          len = recvfrom(sn, (uint8_t *)&RecvMsg, len, rip, &rport);
          if (len > sizeof(ConfigMsg))
              break;
          {
              // FIND: searching, SETT: setting,
              if ((RecvMsg.op[0] == 'F') && (RecvMsg.op[1] == 'I') && (RecvMsg.op[2] == 'N') && (RecvMsg.op[3] == 'D'))
              {
                  wizchip_getnetinfo(&netinfo); // get config network infomation.

                  memcpy(ConfigMsg.mac, netinfo.mac, 6);
                  memcpy(ConfigMsg.lip, netinfo.ip, 4);
                  memcpy(ConfigMsg.gw, netinfo.gw, 4);
                  memcpy(ConfigMsg.dns, netinfo.dns, 4);
                  memcpy(ConfigMsg.sub, netinfo.sn, 4);
                  memcpy(ConfigMsg.sw_ver, sw_version, 2);

                  RecvMsg = ConfigMsg;
                  memcpy(RecvMsg.op, "FIND", 4);
                  sendto(sn, (uint8_t *)&RecvMsg, sizeof(RecvMsg), rip, rport); // return network info to uppercomputer.
                  printf("Find\r\n");
              }
              else if ((RecvMsg.op[0] == 'S') && (RecvMsg.op[1] == 'E') && (RecvMsg.op[2] == 'T') && (RecvMsg.op[3] == 'T'))
              {
                  printf("Sett\r\n");
                  if ((RecvMsg.mac[0] == ConfigMsg.mac[0]) && (RecvMsg.mac[1] == ConfigMsg.mac[1]) && (RecvMsg.mac[2] == ConfigMsg.mac[2]) && (RecvMsg.mac[3] == ConfigMsg.mac[3]) && (RecvMsg.mac[4] == ConfigMsg.mac[4]) && (RecvMsg.mac[5] == ConfigMsg.mac[5]))
                  {
                      for (i = 0; i < 4; i++) // recv uppercomputer config network info
                      {
                          memcpy(netinfo.ip, RecvMsg.lip, 4);
                          memcpy(netinfo.sn, RecvMsg.sub, 4);
                          memcpy(netinfo.gw, RecvMsg.gw, 4);
                          memcpy(netinfo.dns, RecvMsg.dns, 4);
                          netinfo.dhcp = NETINFO_STATIC;
                      }
                      wizchip_setnetinfo(&netinfo); // write chip
                      printf("From the UpperComputer Config network information :\r\n");
                      print_network_information();  // readback and print
                  }
              }
          }
      }

      break;
  case SOCK_CLOSED:
      socket(sn, Sn_MR_UDP, local_port, 0x00);
      break;
  }
}

首先会运行一个UDP的状态机,当接收到消息时,会判断指令,如果为“FIND”指令, 则读取设备的网络地址信息进行回传,如果为“SETT”指令,则判断MAC地址是否与自身一致,一致则将上位机下发的配置更新到W5500中。

运行结果

请注意:

测试实例需要PC端和W5500处于同一网段。

烧录例程运行后,首先进行了PHY链路检测,然后是通过DHCP获取网络地址并打印网络地址信息,观察串口打印的信息以获取设备运行状态;等待设备打印相关网络信息后,打开ConfigTool上位机工具, 点击Search可以看到上位机成功获取并呈现设备信息,然后修改IP地址,点击Setting可以看到串口这边打印了上位机配置后的网络信息,如下图所示:

上位机查找设备:

上位机修改网络配置信息:

总结

本文讲解了如何在 W5500 芯片上实现上位机搜索和配置功能,通过实战例程展示了使用开源上位机配置工具 SmartConfigTool 搜索局域网中的 W5500 并进行网络地址配置的过程。文章详细介绍了上位机的概念、特点、应用场景以及搜索和配置的基本工作流程,帮助读者理解其在嵌入式设备管理中的实际应用价值。

下一篇文章将聚焦在 W5500 芯片上面使用 W5500 中断功能, 解析 W5500 中断功能的核心原理及应用,同时通过实战例程讲解如何利用中断进行回环数据测试,敬请期待!

下载本章例程

我们提供完整的工程文件以及配套开发板,方便你随时测试,快速完成产品开发:

开发环境: Keil MDK5 配套开发板