stm32f767+udp通信

本文档记录了一位开发者在使用STM32F767芯片进行以太网UDP通信的过程中遇到的问题及解决方案。作者强调了选择UDP的原因在于其速度优势,并解释了如何配置本地网络以适应设备连接。在理解接收和发送数据的过程中,作者通过实验确定了数据发送的实现方式。遇到的问题包括如何正确设置Win10的网络连接属性以及如何避免连续发送导致的UDP连接无法断开。最终,作者通过定时器解决了这个问题。
摘要由CSDN通过智能技术生成

写在前面

我也很菜,很多原理都没搞明白,纯粹是代码调通至上原则,写博客也只是为了记录。

项目背景

udp将测量的距离值和角度值传给电脑并通过网络调试助手显示

基础知识

STM32f767芯片自带以太网模块,该模块包括带专用DMA控制器的MAC控制器—一句话,stm32f767内部有MAC模块。外接PHY芯片(LAN8720A)通过RMII与内部MAC芯片连接,实现数据交换,通过SMI接口配置PHY芯片。

为什么使用UDP

无它,唯快而已。

对接收和发送的理解

我一开始一直不明白,单片机和振镜连(二者SPI通信),单片机和电脑用网线连,那我的数据处理部分是放在接收回调函数中呢还是调用udp的发送函数呢?因为以太网不像我从前使用串口,串口的RX和TX跟雷达的RX和TX连,这样在串口接收中断函数中我就可以根据雷达那边的数据格式进行校验存储。
最后用正点原子的例程测试了一下,我按下key0,网络调试助手会显示收到的数据;点击网络调试助手界面上的发送,在lcd上能看到发送的数据。所以我认为,sendata函数是单片机发给电脑。

遇到的问题

win10设置本地电脑连接属性


右键网络图标-打开网络和Internet设置,进入下面这个界面
在这里插入图片描述
点击更改适配器选项进入下面这个界面
在这里插入图片描述
右键以太网(这里注意,我插上网线的时候,除了图中显示的以太网,还有一个以太网3,仔细看下面的英文,有usb的那个才是跟单片机连接的)-属性
在这里插入图片描述
然后按照正点原子的操作就行(上图摘自正点原子,如侵权,联系我删除)

发送数组的填充

在正点原子的例程里面

const u8 *tcp_demo_sendbuf="Apollo STM32F4/F7 UDP demo send data\r\n";

是定义了一个常量,这里其实我不是很明白,定义u8 *,后面赋值的是字符串?
我要发送的是数组,有浮点型,有整型。

char my_udp_demo_sendbuf[UDP_DEMO_RX_BUFSIZE];//存放要发送的数据
char *udp_demo_sendbuf;//这个可以理解为udp的发送缓冲区

udp服务器发送函数的入口参数是一个结构体,我进去也没弄明白究竟由什么组成,但是实验证明,把上面的udp_demo_sendbuf作为入口参数塞进去就能发送

//UDP服务器发送数据
void udp_demo_senddata(struct udp_pcb *upcb)
{
	struct pbuf *ptr;
	ptr=pbuf_alloc(PBUF_TRANSPORT,strlen((char*)udp_demo_sendbuf),PBUF_POOL); //申请内存
	if(ptr)
	{
		ptr->payload=(void*)udp_demo_sendbuf; 
		udp_send(upcb,ptr);	//udp发送数据 
		pbuf_free(ptr);//释放内存
	} 
	
} 
		udp_demo_sendbuf=DATA_Mask(Size);//数据打包函数返回值为char*型的
	    udp_demo_senddata(udppcb);

在哪里调用发送函数

正点原子的例程是在while中不断的扫描按键,按下后进行对应的操作。我只需要udp功能,所以删掉了按键扫描的部分,一直在while循环中执行发送函数,导致我的网络调试助手一开启就没法断开udp连接,只能强制关闭。
我的解决方法是用定时器,在定时器中调用发送函数。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值