下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

最新资讯
简化任何设备的身份验证云连接。
利用 CoAP 设计节能型云连接 IoT 解决方案。
11.0.0 版 FreeRTOS 内核简介:
FreeRTOS 路线图和代码贡献流程。
使用 FreeRTOS 实现 OPC-UA over TSN。

接收 UDP 数据(标准接口)
FreeRTOS-Plus-TCP 网络教程节选

用于查询时间的 FreeRTOS_recvfrom() TCP/IP 堆栈 API 函数用于从 UDP 套接字接收数据。 只有在 套接字创建、配置并 绑定本地端口号后,才能接收数据。

正如 FreeRTOS_recvfrom()() API 引用页面所述,FreeRTOS_recvfrom() 可以与标准调用语义或零拷贝调用语义一起使用。 本页演示的是标准调用语义。

下面的源代码片段显示了一个 RTOS 任务, 在进入使用标准调用语义(与零拷贝调用语义相反) 接收数据的循环之前,该任务会创建一个套接字。显示的是 IPv4 和 IPv6 用例。

IPv4

static void vUDPReceivingUsingStandardInterface( void *pvParameters )
{
long lBytes;
uint8_t cReceivedString[ 60 ];
struct freertos_sockaddr xClient, xBindAddress;
uint32_t xClientLength = sizeof( xClient );
Socket_t xListeningSocket;

/* Attempt to open the socket. */
xListeningSocket = FreeRTOS_socket( FREERTOS_AF_INET,
FREERTOS_SOCK_DGRAM, /*FREERTOS_SOCK_DGRAM for UDP.*/
FREERTOS_IPPROTO_UDP );

/* Check the socket was created. */
configASSERT( xListeningSocket != FREERTOS_INVALID_SOCKET );

/* Bind to port 10000. */
xBindAddress.sin_port = FreeRTOS_htons( 10000 );
FreeRTOS_bind( xListeningSocket, &xBindAddress, sizeof( xBindAddress ) );

for( ;; )
{
/* Receive data from the socket. ulFlags is zero, so the standard
interface is used. By default the block time is portMAX_DELAY, but it
can be changed using FreeRTOS_setsockopt(). */

lBytes = FreeRTOS_recvfrom( xListeningSocket,
cReceivedString,
sizeof( cReceivedString ),
0,
&xClient,
&xClientLength );

if( lBytes > 0 )
{
/* Data was received and can be process here. */
}
}
}
使用 FreeRTOS_recvfrom() 与零拷贝(和标准相反)调用语义的示例

IPv6 -

static void vUDPReceivingUsingStandardInterface( void *pvParameters )
{
long lBytes;
uint8_t cReceivedString[ 60 ];
struct freertos_sockaddr xClient, xBindAddress;
uint32_t xClientLength = sizeof( xClient );
Socket_t xListeningSocket;

/* Attempt to open the socket. */
xListeningSocket = FreeRTOS_socket( FREERTOS_AF_INET6, /* FREERTOS_AF_INET6 for IPv6 socket */
FREERTOS_SOCK_DGRAM, /*FREERTOS_SOCK_DGRAM for UDP.*/
FREERTOS_IPPROTO_UDP );

/* Check the socket was created. */
configASSERT( xListeningSocket != FREERTOS_INVALID_SOCKET );

/* Bind to port 10000. */
xBindAddress.sin_port = FreeRTOS_htons( 10000 );
FreeRTOS_bind( xListeningSocket, &xBindAddress, sizeof( xBindAddress ) );

for( ;; )
{
/* Receive data from the socket. ulFlags is zero, so the standard

interface is used. By default the block time is portMAX_DELAY, but it

can be changed using FreeRTOS_setsockopt(). */

lBytes = FreeRTOS_recvfrom( xListeningSocket,
cReceivedString,
sizeof( cReceivedString ),
0,
&xClient,
&xClientLength );

if( lBytes > 0 )
{
/* Data was received and can be process here. */
}
}
}
使用 FreeRTOS_recvfrom() 与零拷贝(和标准相反)调用语义的示例


<< 返回 RTOS TCP 网络教程索引


Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.