本帖最后由 泽泽 于 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 !”
上位机发送报文如图:
终端显示如图:
|