使用W5500配置UDP双向 收发 通信

嵌入式 同时被 2 个专栏收录
8 篇文章 0 订阅
2 篇文章 0 订阅

最近又使用W5500网络芯片开发了一个新产品。这次的产品主要还是TCP通信,但是在使用过程中遇到了一个问题。

如果上位机异常关闭,此时socket可能并不会认为已经断开了连接,因此再次尝试连接该端口的时候会被拒绝。

那么解决这个问题想到了两种方法,一是使用心跳,但是心跳是最无力的妥协,破坏程序的结构性,同时也增加不必要的程序开支。

第二种方法就是下位机增加一个UDP端口,因为UDP连接不要求保证连接的可靠性能,所以在联网异常的时候给UDP发送一个数据,让下位机复位W5500,就可以重新连接上TCP了。

在配置W5500的UDP通信时,使用常规方法,配置本地端口号,目的端口号,还有目的IP。但是通信实验时候发现下位机只能发送数据,但是不能接收到上位机发来的任何数据。这并不奇怪,因为我之前从来没有使用下位机的UDP接收过任何数据。

分析问题:

1. 首先能够发送数据证明连接是正常的,接收不到数据的原因只能是配置有问题。

2. W5500的UDP究竟能否接收数据?通过百度发现有相关的程序实现,那好,就是我配置的问题了。

3. 通过查询一些信息发现W5500官方并不推荐UDP使用中断的方式来接收数据,而是推荐轮询

这样问题的关键就找出来了,不应该通过W5500的中断判断UDP是否收到数据,而是通过直接轮询寄存器。代码如下

u8 j = 0;
j = Read_W5500_SOCK_1Byte(3,Sn_IR);        //读取UDP端口的Sn_IR寄存器
if(j & IR_RECV)                            //如果接收到数据
{ 
	Write_W5500_SOCK_1Byte(3,Sn_IR,j);     //
	Read_SOCK_Data_Buffer(3,Rx3_Buffer);   //读取数据
}

比较有趣的是收到的数据和平时TCP不一样,收到的数据包含了远程IP地址,远程的端口号,还有帧长。

  • 4
    点赞
  • 0
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 黑客帝国 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值