查看: 2287|回复: 0
打印 上一主题 下一主题

【EVB-T335试用体验】网络UDP通讯程序

[复制链接] qrcode

29

主题

31

帖子

95

积分

注册会员

Rank: 2

积分
95
楼主
跳转到指定楼层
发表于 2016-7-23 09:38 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 泽泽 于 2016-7-23 21:40 编辑

前段时间已经把串口通讯部分调试通过。
今天来完成工业中常用的另一种通讯,网络通信。常用TCP 或者UDP, 由于UDP不需要握手,在工业控制中比较常见,今天进行UDP的测试。

实现功能:
将收到的网络UDP报文,通过串口终端打印出来。网络报文的发送通过网络调试助手发送。


1 UDP介绍
UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。
UDP 与 TCP 的主要区别在于 UDP 不一定提供可靠的数据传输。事实上,该协议不能保证数据准确无误地到达目的地。UDP 在许多方面非常有效。当某个程序的目标是尽快地传输尽可能多的信息时(其中任意给定数据的重要性相对较低),可使用 UDP。
许多程序将使用单独的TCP连接和单独的UDP连接。重要的状态信息随可靠的TCP连接发送,而主数据流通过UDP发送。

2 硬件连接
如图 :


3 IP地址分配
开发板IP:    192.168.0.100
XP主机IP:    192.168.0.5
Linux主机IP: 192.168.0.200
网络通信,必须上面3个地址互相能ping 通 。否则无法进行网络编程。

4 程序分析:
核心代码:
    if( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1 )  
    {   
        printf ("ERROR: Failed to obtain Socket Despcritor.\n");
        return (0);
    }
    else
    {
        printf ("OK: Obtain Socket Despcritor sucessfully.\n");
    }
   
    addr_local.sin_family = AF_INET;           // Protocol Family
    addr_local.sin_port = htons(PORT);         // Port number
    addr_local.sin_addr.s_addr  = INADDR_ANY;  // AutoFill local address

    if( bind(sockfd, (struct sockaddr*)&addr_local, sizeof(struct sockaddr)) == -1 )
    {    printf ("ERROR: Failed to bind Port %d.\n",PORT);
        return (0);
    }
    else
    {
        printf("OK: Bind the Port %d sucessfully.\n",PORT);
    }
   
    sin_size = sizeof(struct sockaddr);
   
    if(num = recvfrom(sockfd, revbuf, LENGTH, 0, (struct sockaddr *)&addr_remote, &sin_size) == -1)
    {
        printf("ERROR!\n");
    }  
   else
    {
        printf("OK: %s.\n",revbuf);            //打印收到的数据
    }

5 程序测试:
程序编译 : arm-linux-gnueabihf-gcc -o udp udp001.c
如图 :


将程序拷贝到开发板/mnt 中,执行UDP程序:./udp  。
同时,用上位机 网络调试助手 发送报文“hello BBS.ickey.cn !

上位机发送报文如图:

终端显示如图:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表