硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1057|回复: 1
收起左侧

[ThreadX全家桶] ThreadX NetXDUO的UDP测试代码详细注释版(2021-12-31)

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117568
QQ
发表于 2021-12-31 15:18:40 | 显示全部楼层 |阅读模式


发送和接收分别定义了一个数据包,方便单独处理。

  1. /*
  2. *********************************************************************************************************
  3. *
  4. *        模块名称 : 网络协议栈测试
  5. *        文件名称 : demo_dm9162_netx.c
  6. *        版    本 : V1.0
  7. *        说    明 : 测试的功能说明
  8. *              1. 默认IP地址192.168.28.245,在本文件配置,用户可根据需要修改。
  9. *              2. 可以在电脑端用网络调试软件创建UDP连接此服务器端,端口号1000。
  10. *              3. 实现了一个简单的回环通信,用户使用上位机发送的数据通过板子返回到上位机。
  11. *
  12. *        修改记录 :
  13. *                版本号   日期         作者        说明
  14. *                V1.0    2021-12-30   Eric2013     首发
  15. *
  16. *        Copyright (C), 2018-2030, 安富莱电子 www.armfly.com
  17. *
  18. *********************************************************************************************************
  19. */       
  20. #include "includes.h"       



  21. /*
  22. *********************************************************************************************************
  23. *                                            IP相关
  24. *********************************************************************************************************
  25. */

  26. /* 本地IP地址 */
  27. #define IP_ADDR0                        192
  28. #define IP_ADDR1                        168
  29. #define IP_ADDR2                        28
  30. #define IP_ADDR3                        245

  31. /* 本地端口号 */
  32. #define DEFAULT_PORT                    1000

  33. /*
  34. *********************************************************************************************************
  35. *                                            NetX任务和通信组件
  36. *********************************************************************************************************
  37. */
  38. /* 上电先将其设置到低优先级,待网线插入后提升优先级到3 */
  39. #define  APP_CFG_TASK_NETX_PRIO                           28u   
  40. #define  APP_CFG_TASK_NETX_STK_SIZE                     4096u
  41. static   uint64_t  AppTaskNetXStk[APP_CFG_TASK_NETX_STK_SIZE/8];

  42. /* 提升NetX处理任务优先级到3 */
  43. #define  APP_CFG_TASK_NETX_PRIO1                           3u

  44. /* 提升NetX应用任务优先级到6 */
  45. #define  APP_CFG_TASK_NetXPro_PRIO1                        6u

  46. NX_TCP_SOCKET TCPSocket;
  47. NX_UDP_SOCKET UDPSocket;
  48. TX_SEMAPHORE  Semaphore;


  49. /*
  50. *********************************************************************************************************
  51. *                                            NetX任务和通信组件
  52. *********************************************************************************************************
  53. */
  54. UCHAR data_buffer[4096];

  55. NX_PACKET_POOL    pool_0;
  56. NX_IP             ip_0;  

  57. /* 数据包内存池 */
  58. #define PACKET_SIZE          1536
  59. #define NX_PACKET_POOL_SIZE  ((PACKET_SIZE + sizeof(NX_PACKET)) * 20)
  60.        
  61. ULONG  packet_pool_area[NX_PACKET_POOL_SIZE/4 + 4];

  62. /* ARP缓存 */
  63. ULONG    arp_space_area[512 / sizeof(ULONG)];                                                      
  64. ULONG    error_counter;

  65. #define PRINT_DATA(addr, port, data)        do {                                            \
  66.                                                   printf("[%lu.%lu.%lu.%lu:%u] -> '%s' \r\n", \
  67.                                                   (addr >> 24) & 0xff,                      \
  68.                                                   (addr >> 16) & 0xff,                      \
  69.                                                   (addr >> 8) & 0xff,                       \
  70.                                                   (addr & 0xff), port, data);               \
  71.                                                } while(0)

  72. extern TX_THREAD   AppTaskNetXProTCB;
  73. extern TX_THREAD   *netx_thread_ptr;                                               
  74. extern VOID  nx_driver_stm32h7xx(NX_IP_DRIVER *driver_req_ptr);
  75.                                              
  76.                                                
  77. /*
  78. *********************************************************************************************************
  79. *        函 数 名: NetXTest
  80. *        功能说明: NetXDUO应用
  81. *        形    参: 无
  82. *        返 回 值: 无
  83. *********************************************************************************************************
  84. */   
  85. void NetXTest(void)
  86. {
  87.     UINT status;
  88.     UINT ret;
  89.     UINT old_priority;

  90.     NX_PACKET *RecPacket;
  91.     NX_PACKET *TraPacket;

  92.     ULONG bytes_read;
  93.        
  94.     uint8_t sendbuf[20];
  95.     uint32_t count = 0;
  96.        
  97.         UINT source_port;
  98.     ULONG source_ip_address;
  99.    

  100.     /* 初始化NetX */
  101.     nx_system_initialize();

  102.     /* 创建内存池 */
  103.     status =  nx_packet_pool_create(&pool_0,                                       /* 内存池控制块 */
  104.                                      "NetX Main Packet Pool",                      /* 内存池名 */
  105.                                      1536,                                         /* 内存池每个数据包大小,单位字节
  106.                                                                                       此值必须至少为 40 个字节,并且还必须可以被 4 整除 */
  107.                                                                          (ULONG*)(((int)packet_pool_area + 15) & ~15) ,/* 内存池地址,此地址必须ULONG对齐 */
  108.                                      NX_PACKET_POOL_SIZE);                         /* 内存池大小 */                  
  109.          
  110.     /* 检测创建是否失败 */
  111.     if (status) error_counter++;

  112.     /* 例化IP */
  113.     status = nx_ip_create(&ip_0,                                                   /* IP实例控制块 */                                    
  114.                             "NetX IP Instance 0",                                  /* IP实例名 */     
  115.                             IP_ADDRESS(IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3),    /* IP地址 */
  116.                             0xFFFFFF00UL,                                          /* 子网掩码 */
  117.                             &pool_0,                                               /* 内存池 */
  118.                                                         nx_driver_stm32h7xx,                                   /* 网卡驱动 */
  119.                             (UCHAR*)AppTaskNetXStk,                                /* IP任务栈地址 */
  120.                             sizeof(AppTaskNetXStk),                                /* IP任务栈大小,单位字节 */
  121.                             APP_CFG_TASK_NETX_PRIO);                               /* IP任务优先级 */
  122.                            
  123.             
  124.     /* 检测创建是否失败 */
  125.     if (status) error_counter++;

  126.     /* 使能ARP,并提供ARP缓存 */
  127.     status =  nx_arp_enable(&ip_0,                     /* IP实例控制块 */
  128.                                                         (void *)arp_space_area,    /* ARP缓存地址 */
  129.                                                         sizeof(arp_space_area));   /* 每个 ARP 条目均为 52 个字节,因此,ARP 条目总数是52字节整数倍 */

  130.     /* 使能fragment */   
  131.     status = nx_ip_fragment_enable(&ip_0);

  132.     /* 检测使能成功 */
  133.     if (status) error_counter++;

  134.     /* 使能TCP */
  135.     status =  nx_tcp_enable(&ip_0);

  136.     /* 检测使能成功 */
  137.     if (status) error_counter++;

  138.     /* 使能UDP  */
  139.     status =  nx_udp_enable(&ip_0);

  140.     /* 检测使能成功 */
  141.     if (status) error_counter++;

  142.     /* 使能ICMP */
  143.     status =  nx_icmp_enable(&ip_0);

  144.     /* 检测使能成功 */
  145.     if (status) error_counter++;   
  146.    
  147.     /* NETX初始化完毕后,重新设置优先级 */
  148.     tx_thread_priority_change(netx_thread_ptr, APP_CFG_TASK_NETX_PRIO1, &old_priority);
  149.     tx_thread_priority_change(&AppTaskNetXProTCB, APP_CFG_TASK_NetXPro_PRIO1, &old_priority);
  150.    
  151.     ////////////////////////////////////////////////////////////////////////////////////////////////                                                  
  152.     /* 创建UDP socket */
  153.     ret = nx_udp_socket_create(&ip_0,                 /* IP实例控制块 */   
  154.                                 &UDPSocket,           /* UDP控制块 */
  155.                                 "UDP Server Socket",  /* UDP名 */
  156.                                 NX_IP_NORMAL,         /* IP服务类型 */
  157.                                 NX_FRAGMENT_OKAY,     /* 使能IP分段 */
  158.                                 NX_IP_TIME_TO_LIVE,   /* 指定一个 8 位的值,用于定义此数据包在被丢弃之前可通过的路由器数目 */
  159.                                 512);                 /* 支持的报文数 */

  160.     if (ret != NX_SUCCESS)
  161.     {
  162.         Error_Handler(__FILE__, __LINE__);   
  163.     }
  164.    
  165.     /* UDP Socket绑定端口 */
  166.     ret = nx_udp_socket_bind(&UDPSocket, DEFAULT_PORT, TX_WAIT_FOREVER);

  167.     if (ret != NX_SUCCESS)
  168.     {
  169.         Error_Handler(__FILE__, __LINE__);   
  170.     }

  171.    
  172.         while(1)
  173.         {
  174.         /* 接收数据 */
  175.         ret = nx_udp_socket_receive(&UDPSocket, &RecPacket, TX_WAIT_FOREVER);

  176.         if (ret == NX_SUCCESS)
  177.         {
  178.             /* 将UDP数据包中的数据复制到缓冲data_buffer */
  179.             nx_packet_data_extract_offset(RecPacket,            /* 数据包 */
  180.                                           0,                    /* 数据包地址偏移 */
  181.                                           data_buffer,          /* 目标缓冲 */
  182.                                           sizeof(data_buffer),  /* 目标缓冲大小 */
  183.                                           &bytes_read);         /* 数据复制的字节数 */

  184.             /* 获取远程端口和IP  */
  185.             nx_udp_source_extract(RecPacket, &source_ip_address, &source_port);

  186.             /* 打印接收到数据 */
  187.             PRINT_DATA(source_ip_address, source_port, data_buffer);

  188.             /* 释放数据包 */
  189.             nx_packet_release(RecPacket);

  190.             /* 申请发送数据包 */
  191.             ret = nx_packet_allocate(&pool_0, &TraPacket, NX_UDP_PACKET, TX_WAIT_FOREVER);

  192.             if (ret)
  193.             {
  194.                 Error_Handler(__FILE__, __LINE__);  
  195.             }

  196.             sprintf((char *)sendbuf, "sendbuf = %d\r\n", count++);

  197.             /*将要发送的数据附加到TraPacket */
  198.             ret = nx_packet_data_append(TraPacket, (VOID *)sendbuf, strlen((char *)sendbuf), &pool_0, TX_WAIT_FOREVER);

  199.             if (ret)
  200.             {
  201.                 Error_Handler(__FILE__, __LINE__);
  202.             }

  203.             /* 发送数据包到UDP发送端 */
  204.             ret =  nx_udp_socket_send(&UDPSocket, TraPacket, source_ip_address, source_port);

  205.         }
  206.         }         
  207. }

  208. /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
复制代码



回复

使用道具 举报

4

主题

1459

回帖

1471

积分

至尊会员

积分
1471
发表于 2021-12-31 16:35:08 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-15 19:20 , Processed in 0.036363 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表