高级会员
- 积分
- 961
- 金钱
- 961
- 注册时间
- 2012-5-8
- 在线时间
- 343 小时
|
10金钱
本帖最后由 mmlyy2012 于 2024-6-20 15:56 编辑
在LWIP教程的第二十章 SOCKET UDP 实验中,有这么一句话:
主函数的循环中不断通过 recv 接收数据并使用消息队列发送,其中 recv 可设为非阻塞模式
请问一下 程序如何更改才能设置UDP的发送及接收 为非阻塞模式。芯片为STM32H743 OS为freeRTOS
使用的程序为例程 lwIP例程10 lwIP_SOCKET_UDP实验
void lwip_data_send(void)
{
sys_thread_new("lwip_send_thread", lwip_send_thread, NULL, 512, LWIP_SEND_THREAD_PRIO );
}
/**
* @brief lwip_demo实验入口
* @param 无
* @retval 无
*/
void lwip_demo(void)
{
BaseType_t lwip_err;
char *tbuf; int nonblock = 1;
lwip_data_send(); /* 创建发送数据线程 */
memset(&local_info, 0, sizeof(struct sockaddr_in)); /* 将服务器地址清空 */
local_info.sin_len = sizeof(local_info); /* 计算Socket地址信息结构体长度 */
local_info.sin_family = AF_INET; /* IPv4地址 */
local_info.sin_port = htons(LWIP_DEMO_PORT); /* 设置端口号 */
local_info.sin_addr.s_addr = htons(INADDR_ANY); /* 设置本地IP地址 */
sock_fd = socket(AF_INET, SOCK_DGRAM, 0); /* 建立一个新的socket连接 协议族 指定socket类型 指定使用的协议 */
tbuf = mymalloc(SRAMIN, 200); /* 申请内存 */
sprintf((char *)tbuf, "Port:%d", LWIP_DEMO_PORT); /* 客户端端口号 */
lcd_show_string(5, 150, 200, 16, 16, tbuf, BLUE);
/* 建立绑定 */
bind(sock_fd, (struct sockaddr *)&local_info, sizeof(struct sockaddr_in));
while (1)
{
memset(g_lwip_demo_recvbuf, 0, sizeof(g_lwip_demo_recvbuf));
recv(sock_fd, (void *)g_lwip_demo_recvbuf, sizeof(g_lwip_demo_recvbuf), 0);
lwip_err = xQueueSend(g_display_queue,&g_lwip_demo_recvbuf,0);
if (lwip_err == errQUEUE_FULL)
{
printf("队列Key_Queue已满,数据发送失败!\r\n");
}
}
}
/**
* @brief 发送数据线程函数
* @param pvParameters : 传入参数(未用到)
* @retval 无
*/
void lwip_send_thread(void *pvParameters)
{
pvParameters = pvParameters;
BaseType_t lwip_err;
local_info.sin_addr.s_addr = inet_addr(IP_ADDR); /* 需要发送的远程IP地址 */
while (1)
{
if((g_lwip_send_flag & LWIP_SEND_DATA) == LWIP_SEND_DATA) /* 有数据要发送 */
{
sendto(sock_fd, /* scoket */
(char *)g_lwip_demo_sendbuf, /* 发送的数据 */
sizeof(g_lwip_demo_sendbuf), 0, /* 发送的数据大小 */
(struct sockaddr *)&local_info, /* 接收端地址信息 */
sizeof(local_info)); /* 接收端地址信息大小 */
g_lwip_send_flag &= ~LWIP_SEND_DATA;
}
vTaskDelay(100);
|
|