你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F4使用lwip无法发送udp包

[复制链接]
sdsffghgfdfg 提问时间:2018-8-24 08:38 /
lwip debug日志如下:
  1. udp_send
  2. pbuf_header: old 20006da8 new 20006da0 (8)
  3. udp_send: added header in given pbuf 20003058
  4. udp_send: sending datagram of length 19
  5. udp_send: UDP packet length 19
  6. udp_send: UDP checksum 0x0000
  7. udp_send: ip_output_if (,,,,0x11,)
  8. pbuf_header: old 20006da0 new 20006d8c (20)
  9. ip4_output_if: st0
  10. IP header:
  11. +-------------------------------+
  12. | 4 | 5 |  0x00 |        39     | (v, hl, tos, len)
  13. +-------------------------------+
  14. |        1      |000|       0   | (id, flags, offset)
  15. +-------------------------------+
  16. |  255  |   17  |    0x0000     | (ttl, proto, chksum)
  17. +-------------------------------+
  18. |  192  |  168  |  137  |    1  | (src)
  19. +-------------------------------+
  20. |  192  |  168  |  137  |    2  | (dest)
  21. +-------------------------------+
  22. ip4_output_if: call netif->output()
  23. pbuf_header: old 20006d8c new 20006d7e (14)
  24. ethernet_output: sending packet 20003058
复制代码
把ethernet_output执行完后,返回程序,一直返回到发送函数,然后直接hardfault。所以无法定位到错误的程序在哪里。

我的project配置是:
1. STM32F407ZG
2. lwip是用stm32cubemx自动生成的
3. 这个项目可以接收tcp,可以发送tcp,可以收到udp包,就是不能发送。
4. 核心函数如下:
  1.   while (1)
  2.   {
  3.                 MX_LWIP_Process();
  4.                 if(isStart==1)udp_send(udp_pcb,udp_p);
  5.   /* USER CODE END WHILE */

  6.   /* USER CODE BEGIN 3 */
  7.   }
复制代码
这里是先建立tcp连接,另外一个pc发送start命令,板子收到start,令isStart=1,然后就发送udp包。
5. udp client初始化如下:
  1. void UDP_client_init()
  2. {
  3.         udp_p = pbuf_alloc(PBUF_RAW,sizeof(UDPData),PBUF_RAM);
  4.         udp_p -> payload = (void*)UDPData;
  5.         Set_IP4_ADDR(&ipaddr2,UDP_REMOTE_IP);
  6.         udp_pcb = udp_new();
  7.         udp_bind(udp_pcb,IP_ADDR_ANY,UDP_Client_PORT);
  8.         udp_connect(udp_pcb,&ipaddr2,UDP_REMOTE_PORT);
  9. }
复制代码


NOTE:
为什么加TCP连接?
1. 因为直接发udp也是不行的。
2. 我的这个是程序查询接收以太网包的,没有用中断。所以怀疑是arp没有解析到的原因。结果并不是。

收藏 评论4 发布时间:2018-8-24 08:38

举报

4个回答
sdsffghgfdfg 最优答案 回答时间:2018-8-25 09:01:09
已经解决,是pbuf为的type为PBUF_RAM,改成PBUF_ROM。或者,将udp_p -> payload = (void*)UDPData;改成memcpy或者pbuf_take。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 结帖奖励

查看全部评分

shenxiaolin_mai 回答时间:2018-8-24 09:04:53
不是在config文件里面要开启UDP的功能么?
sdsffghgfdfg 回答时间:2018-8-24 09:09:08
xiaoshen-372360 发表于 2018-8-24 09:04
不是在config文件里面要开启UDP的功能么?

不是这个原因
feixiang20 回答时间:2018-8-24 23:39:44
配置和自己移植Lwip,发送udp数据,或者是帧的时间不对。如果采用中断方式接收会不会就行了呢,实在不行,在网上找找类似的例子参考下。。。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版