打印
[MM32软件]

(分享)基于MM32F3270 以太网 UDP使用

[复制链接]
3026|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
UDP(User Datagram Protocol用户数据报协议)是一种无连接、不可靠的协议。UDP协议没有流控制,没有应答确认机制,不能解决丢包、重发、错序问题。它只是简单地实现从一端主机到另一端主机的数据传输功能,数据通过IP层发送,在网络中传输,到达目标主机的顺序是无法预知的,因此需要应用程序对这些数据进行排序处理。在发送端,UDP只是把上层应用的数据封装到UDP报文中;在差错检测方面,仅仅是对数据进行了简单的校验,然后将其封装到IP数据报中发送出去。在接收端,无论是否收到数据,都不会产生一个应答返回送给源主机。如果接收到数据校验错误,接收端丢弃该UDP报文,也不会告诉源主机,这样数据是无法保障其准确性的。但是在如今的网络环境下,UDP协议传输出现错误的概率很小,并且它的实时性是非常好,常用于实时视频的传输,比如直播、网络电话等,即使是出现了数据丢失的情况,导致视频卡帧,也不会产生大的影响。UDP被广泛应用于与对传输速度有要求,并且可以容忍出现差错的数据传输中。

使用特权

评论回复
沙发
两只袜子|  楼主 | 2021-10-20 09:25 | 只看该作者
对于UDP通信来说,可以没有服务器,服务器只是一种规定。主动发送的一方为客户端,被动接受的一方为服务器(下图为通信过程,程序也是按照这个步骤进行设计)。

使用特权

评论回复
板凳
两只袜子|  楼主 | 2021-10-20 09:25 | 只看该作者
实验使用MB-039开发板,在工程中使用LwIP+FreeRTOS,实验展示如何实现UDP数据收发,实验使用到的硬件如下:

如图是MB-039(完整原理图可以通过MM32官网下载)的ETH部分接口电路

使用特权

评论回复
地板
两只袜子|  楼主 | 2021-10-20 09:26 | 只看该作者
各个信号引脚对应如下:



使用特权

评论回复
5
两只袜子|  楼主 | 2021-10-20 09:26 | 只看该作者
实验用到的API前面几节已经进行了讲解,我们直接创建UDP工程:static void udpecho_thread(void* arg)
{
    struct netconn* conn;
    struct netbuf* buf;
    char buffer[4096];
    err_t err;
    LWIP_UNUSED_ARG(arg);

    conn = netconn_new(NETCONN_UDP);        // (1)
    netconn_bind(conn, IP_ADDR_ANY, LOCAL_PORT);   // (2)

    while (1) {
        err = netconn_recv(conn, &buf);          // (3)
        IF (err == ERR_OK) {
            if(netbuf_copy(buf, buffer, sizeof(buffer)) != buf->p->tot_len) {   // (4)
                LWIP_debugF(LWIP_DBG_ON, ("copy faiLED\n"));
            }
            else {
                buffer[buf->p->tot_len] = '\0';
                err = netconn_send(conn, buf);                 // (5)
                if(err != ERR_OK) {
                   LWIP_DEBUGF(LWIP_DBG_ON, ("netconn_send failed: %d\n", (int)err));
                }
                else {
                    LWIP_DEBUGF(LWIP_DBG_ON, ("got %s\n", buffer));
                }
            }
            netbuf_delete(buf);
        }
    }
}

使用特权

评论回复
6
两只袜子|  楼主 | 2021-10-20 09:26 | 只看该作者
1)创建一个UDP类型的连接结构
2)绑定IP地址与端口
3)接收客户端发送的数据(值得指出的是UDP可以一对一,也可以一对多以广播的形式发送)
4)拷贝出接收的数据
5)将数据发送给目标主机到这里已经完成了工程的创建,看一下PC的IP地址,设备需要处于同一网段,以方便测试。打开命令行窗口输入:ipconfig

使用特权

评论回复
7
两只袜子|  楼主 | 2021-10-20 09:27 | 只看该作者
PC的地址为:192.168.105.34,在sys_arch.h文件中对DEST_IP_ADDR0 、DEST_IP_ADDR1、DEST_IP_Addr2、DEST_IP_Addr3进行修改,DEST_PORT 随意修改。#define LOCAL_PORT                 2021

#define IP_ADDR0                    192
#define IP_ADDR1                    168
#define IP_ADDR2                    105
#define IP_ADDR3                    35

将程序下载入开发板中,使用netassist进行如下设置:
1)协议设置,选择UDP
2)本机主机地址(即PC地址)
3)端口号
4)设置远程主机地址(即设备地址)

使用特权

评论回复
8
两只袜子|  楼主 | 2021-10-20 09:27 | 只看该作者



点击打开,在进行这一步前可以则Ping一下开发板地址,可以正常Ping通则检查端口号;如果无法Ping通则需要对工程进行检查。任意输入字符进行发送。


使用特权

评论回复
9
两只袜子|  楼主 | 2021-10-20 09:28 | 只看该作者
可以发现对接收到的数据进行了正确的转发,我们也可以使用Wireshark进行监视抓取整个过程,选择IP过滤:ip.addr==192.168.105.35。

使用特权

评论回复
10
两只袜子|  楼主 | 2021-10-20 09:28 | 只看该作者
通过上图表明实验成功。

实验程序请登录我们的官网(https://www.mindmotion.com.cn/download.aspx?cid=2542&page=2)下载MM32F3270 SDK,工程路径如下:
~\MM32F3270_Lib_Samples_V0.90\Demo_app\Ethernet_Demo\ETH_RTOS\Freertos_UDP

我们下节的题目为《基于MM32F3270以太网Client的使用》。

使用特权

评论回复
11
jflahdink09| | 2021-10-29 08:52 | 只看该作者
这个太棒了,感谢楼主的分享。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2055

主题

7455

帖子

10

粉丝