微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 嵌入式网络编程实现与测试

嵌入式网络编程实现与测试

时间:10-02 整理:3721RD 点击:

前面发布的试用体验,已经介绍过如何编译一个完整的应用程序以及测试。
今天在此基础上编译一个网络通讯应用程序,采用用户数据报协议UDP来实现。

实现的功能:
完成一个UDP服务器端程序,实现接收客户端的报文,在串口终端打印出来,同时将报文返回给客户端。

1 硬件介绍

Rico Board 只引出了一路以太网,使用 RMII 协议的信号。Rico Board 带有一个千兆以太网口,即 J5,RJ45座集成网络隔离变压器,  PHY芯片为KSZ9031,连接到 AM437x的RGMII1端口,25MHz时钟,PHY地址 PHYAD[0:2]设为0x00。


2 TCP和UDP介绍

TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
       这里将介绍常用的UDP网络编程。

3 UDP编程介绍
UDP编程的服务器端一般步骤是:
  1、创建一个socket,用函数socket();
  2、设置socket属性,用函数setsockopt();* 可选
  3、绑定IP地址、端口等信息到socket上,用函数bind();
  4、循环接收数据,用函数recvfrom();
  5、关闭网络连接;
UDP编程的客户端一般步骤是:
  1、创建一个socket,用函数socket();
  2、设置socket属性,用函数setsockopt();* 可选
  3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
  4、设置对方的IP地址和端口等属性;
  5、发送数据,用函数sendto();
  6、关闭网络连接;
4 程序代码简单分析
嵌入式UDP网络编程,按照上面写的步骤,一步一步往下写就能实现。这个不是很难,网上也有很多例程。方便排版,这里只介绍部分代码 :
1 定义通讯端口号 6666
    #define SERVER_PORT 6666
2 设置socket属性,绑定IP地址、端口等信息到socket上
        tSocketServerAddr.sin_family      = AF_INET;
        tSocketServerAddr.sin_port        = htons(SERVER_PORT);
        tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;
        memset(tSocketServerAddr.sin_zero, 0, 8);
        
        iRet = bind(iSocketServer, (const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr));
        if (-1 == iRet)
        {
                printf("bind error!\n");
                return -1;
        }
      
3 接收数据,用函数recvfrom()
                iRecvLen = recvfrom(iSocketServer, ucRecvBuf, 999, 0, (struct sockaddr *)&tSocketClientAddr, &iAddrLen);
                if (iRecvLen > 0)
                {
                        ucRecvBuf[iRecvLen] = '\0';
}
4 串口打印数据,将接收到的数据打印
                      printf("Get Msg From %s : %s\n", inet_ntoa(tSocketClientAddr.sin_addr), ucRecvBuf);

5    接收发送,将接收到的数据发送出去      
                sendto(iSocketServer, ucRecvBuf, strlen(ucRecvBuf), 0, (struct sockaddr *)&tSocketClientAddr, sizeof(struct sockaddr_in));
        }
   
6、关闭网络连接    
        close(iSocketServer);
5 嵌入式应用程序编译与测试
编译:
arm-linux-gnueabihf-gcc -o server server.c   ,如下截图,生成server可执行文件。将
其拷贝到Rico Board主板中去。



测试:
在终端运行可执行程序,在没有收到数据前,程序是处于阻塞状态。
截图:


收到数据后,将会打印收到的数据,如图:


上位机截图:
上位机发送的报文 。同时接受到 Rico Board开发板 发送回来的报文。显示出来 。



到此,一个嵌入式网络UDP程序已经完成,并且应用程序测试成功,
能收能发,达到预期的目的。

学习中

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top