前言
代码
/*
* Copyright (c) 2024-2024,shchl
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2024-4-9 shchl udp接收数据处理
*/
#include "includes.h"
#define UDP_STACK_SIZE 4096 /*任务栈大小*/
#define UDP_PRIORITY 3 /*优先级*/
#define PACKET_SIZE 1536 /*数据包大小*/
#define POOL_SIZE ((sizeof(NX_PACKET) + PACKET_SIZE) * 16) /*数据包池大小(16个缓冲区)*/
#define LOCAL_IP IP_ADDRESS(192, 168, 8, 9) /*本地ip*/
#define LOCAL_PORT 8080
#define LOCAL_SUB_MASK IP_ADDRESS(255,255,255,0) /*本地ip*/
/*
*******************************************************************************************************
* 外部引入变量
*******************************************************************************************************
*/
/*
*******************************************************************************************************
* 变量
*******************************************************************************************************
*/
/*
*********************************************************************************************************
* 静态全局变量
*********************************************************************************************************
*/
static TX_THREAD udp_thread;
static NX_IP local_ip; /*本地ip*/
static NX_PACKET_POOL packet_pool; /*数据包池*/
static NX_UDP_SOCKET udp_rec_socket;
static ULONG error_counter = 0; /*错误计数器(可用来排查问题出现位置)*/
/*
*********************************************************************************************************
* 函数声明
*********************************************************************************************************
*/
static void udp_thread_entry(ULONG input);
static inline void status_check(UINT stat);
/*
*********************************************************************************************************
* 外部函数
*********************************************************************************************************
*/
int app_task_udp_thread_rec_create(void) {
UINT status;
/* Create the main thread. */
tx_thread_create(&udp_thread,
"udp rec thread",
udp_thread_entry,
0,
app_malloc(UDP_STACK_SIZE),
UDP_STACK_SIZE,
UDP_PRIORITY,
UDP_PRIORITY,
TX_NO_TIME_SLICE,
TX_AUTO_START);
/* Create a packet pool. */
status = nx_packet_pool_create(&packet_pool,
"NetX Main Packet Pool 2",
PACKET_SIZE,
app_malloc(POOL_SIZE),
POOL_SIZE);
/* Check for pool creation error. */
status_check(status);
/* Create an IP instance. */
status = nx_ip_create(&local_ip,
"NetX IP Instance 2",
LOCAL_IP,
LOCAL_SUB_MASK,
&packet_pool,
nx_stm32_eth_driver,
app_malloc(2048), 2048, 1);
/* Check for IP create errors. */
status_check(status);
/* Enable ARP and supply ARP cache memory for IP Instance 0. */
status = nx_arp_enable(&local_ip, app_malloc(1024), 1024);
/* Check for ARP enable errors. */
status_check(status);
/* Enable ICMP */
status = nxd_icmp_enable(&local_ip);
status_check(status);
/* Enable UDP traffic. */
status = nx_udp_enable(&local_ip);
/* Check for UDP enable errors. */
status_check(status);
return NX_SUCCESS;
}
NET_X_APP_EXPORT(app_task_udp_thread_rec_create);
/*
*********************************************************************************************************
* 内部函数
*********************************************************************************************************
*/
static inline void status_check(UINT stat) {
if (stat) {
error_counter++;
// todo
}
}
static void udp_thread_entry(ULONG input) {
UINT status;
NX_PACKET *my_packet;
ULONG actual_status;
do {
/* 等待 1 秒钟,让 内部 IP 线程完成其初始化。. */
status = nx_ip_status_check(&local_ip,
NX_IP_INITIALIZE_DONE,
&actual_status,
NX_IP_PERIODIC_RATE);
} while (status != NX_SUCCESS);
/* Create a UDP socket. */
status = nx_udp_socket_create(&local_ip, &udp_rec_socket,
"udp_rec_socket",
NX_IP_NORMAL,
NX_FRAGMENT_OKAY,
0x80,
5);
/* Check status. */
if (status) {
error_counter++;
return;
}
/* Bind the UDP socket to the IP port. */
status = nx_udp_socket_bind(&udp_rec_socket, LOCAL_PORT, TX_WAIT_FOREVER);
/* Check status. */
if (status) {
error_counter++;
return;
}
while (1) {
/* Receive a UDP packet. */
status = nx_udp_socket_receive(&udp_rec_socket, &my_packet, TX_WAIT_FOREVER);
/* Check status. */
if (status != NX_SUCCESS) {
break;
}
*my_packet->nx_packet_append_ptr = '\0'; /*在结尾处添加结束标志位,这里可以这样处理,前提是确保指向的位置可以被修改*/
tx_log("%s rec data:%s\r\n",tx_thread_identify()->tx_thread_name,my_packet->nx_packet_prepend_ptr);
/* Release the packet. */
status = nx_packet_release(my_packet);
/* Check status. */
if (status != NX_SUCCESS) {
break;
}
}
}
结果