记录STM32使用udp通信的一个大坑

@TOCfreeRTOS+lwip实现udp通信

问题说明

在使用MCU和其他终端udp通信时遇见这样的一个大坑,整个通信过程如下图所示
在这里插入图片描述
问题出在mcu与其他设备通过udp交互,但在调试的过程中发现MCU给其他设备发消息的时候,虽然看起来成功了,但实际上其他设备并没有收到udp消息,经过苦思冥想以及实验,发现代码应该像下面这样写才可以成功的发送udp消息。

代码

//udp channel init
void udp_channel_init() {IP_ADDR4(&remoteip,192,168,28,180);global_udp_conn_pcb = udp_new();local_port = 7070;remote_port = 8999;if (udp_bind(global_udp_conn_pcb, IP_ADDR_ANY, local_port) == ERR_OK) {udp_recv(global_udp_conn_pcb, udp_recv_callback, NULL);} else {printf("bind local port fail\n");}#if 1if (udp_connect(global_udp_conn_pcb, &remoteip, remote_port) == ERR_OK) {} else {printf("connect remote fail\n");}#endif}

出了上面的代码之外,在发送消息的前面需要再“”连接“”一次远程(即下面的err = udp_connect(global_udp_conn_pcb, &remoteip, remote_port);),代码如下

/** when recv set dsp msg from platform then call it* @json_str: Package cjson msg* udp send msg to dsp */
err_t create_udp_client_send_task(char *json_str)
{struct pbuf* msg;int buflen;int timeout;err_t err;buflen = strlen(json_str)+1;//memcpy(msg->payload, json_str, buflen);#if 1	msg=pbuf_alloc(PBUF_TRANSPORT,buflen,PBUF_RAM); if(msg) {pbuf_take(msg,json_str,buflen); //udp_send(global_udp_conn_pcb,msg);err = udp_connect(global_udp_conn_pcb, &remoteip, remote_port);err = udp_sendto(global_udp_conn_pcb, msg, &remoteip, remote_port);if (err != ERR_OK) {printf("udp_sendto failed\n");}} 
#endif pbuf_free(msg);return ERR_OK;								
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/1421.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

支持刷机(OpenWrt)的路由器大全

2023年上半年最热门的刷机路由器当然是360T7、小米WR30U这两款,主要是性价比高,闲鱼100多搞定,支持刷OpenWrt、支持WiFi6,采用MTK798X系列处理器,性能强,轻松跑满千兆,如果你想追新,…

学习c++第01天

学习c的第01天 前言1、变量是声明&#xff1f;2.建议定义数据都对其进行初始化3.有符号数和无符号数4.进制间的相互转换5.原反补码6.const 、register 、volatile和typedef关键字7.数据类型的自动转换8.左移<< &右移操作>>9.将data的指定位数进行0、1转化的应用…

Unity | HDRP高清渲染管线学习笔记:HDRP Custom Pass

目录 一、Custom Pass Volume组件介绍 1.Mode&#xff08;模式&#xff09; 2.Injection Point&#xff08;注入点&#xff09; 3.Priority 4.Fade Radius 5.custom passes 二、查看Custom Pass的渲染阶段 Custom Pass允许你执行以下操作&#xff08;官方文档&#xff0…

基于改进ISODATA算法的负荷场景曲线聚类MATLAB程序

参考文献&#xff1a; 基于机器学习的短期电力负荷预测和负荷曲线聚类研究_张辰睿&#xff08;硕士论文&#xff09; 参考其第三章 主要内容&#xff1a; 主要包含四种聚类算法&#xff0c;K-means聚类、ISODATA聚类、L-ISODATA聚类及K-L-ISODATA聚类&#xff0c;并且包含了…

【玩转Linux操作】Linux服务管理

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 文章目录 &#x1f354;服务(service)管理⭐service管理指令 &…

(0017) H5-vue创建项目vue init webpack

1、初始化项目 1、vue 命令讲解 vue list &#xff1a;查看可以基于那些模板创建vue应用vue init <template-name> <project-name>init&#xff1a;表示要用vue-cli来初始化项目 <template-name>&#xff1a;表示模板名称&#xff0c;vue-cli官方提供的5种…

输入框设置placeholder的文字居中

<input classlogin-form-pwd placeholder请输入商家登录密码 placeholder-class"center"></input> .center{ text-align: center; }

ChatGLM-6B微调p tuning v2和lora对比

官方项目地址&#xff1a;https://github.com/THUDM/ChatGLM-6B 参考本人之前的博客下载ChatGLM-6B模型&#xff1a; https://blog.csdn.net/Acecai01/article/details/131221676 设备 一张3090Ti&#xff0c; 24G显卡 实验目的 通过微调的方法&#xff0c;训练ChatGLM-6B模…

oracle 重复启动监听程序故障

又是一起 oracle 无法连接问题&#xff0c;检查配置都是正常的。 原来是碰到一个oralce的bugl了。 还真就是这个问题&#xff0c;子进程一kill掉&#xff0c;就恢复了。

《算法设计与分析》学习笔记

目录 算法基本概念 算法的定义 算法复杂度分析 渐近记号 ①渐近上界记号O ②渐近下界记号Ω ③渐近紧确界记号 Θ ④非渐近紧确上界记号o ⑤非渐近紧确下界记号ω 渐进记号极限定义 分治 分治步骤 递归树 ​编辑代入法 主方法 改变变量 二叉树 堆 建堆 堆排…

Nvidia官方视频编解码性能

NVIDIA VIDEO CODEC SDK | NVIDIA Developer 1080P解码性能&#xff1a; 720P解码性能&#xff1a; 详细的参见官方的链接地址&#xff0c;对于GPU的解码fps能力&#xff0c;可以作为评估参照&#xff01;

Apikit 自学日记:发起文档测试-RPC

以DUBBO接口为例&#xff0c;进入某个DUBBO协议的API文档详情页&#xff0c;点击文档上方 测试 标签&#xff0c;即可进入 API 测试页&#xff0c;系统会根据API文档的定义的请求报文自动生成测试界面并且填充测试数据。 对RPC/DUBBO接口发起测试 填写请求报文参数值 此测试D…