|
本帖最后由 zyf1111 于 2023-11-12 00:07 编辑
除了对外设的基础操作外,对外的通信也是需要掌握的,比如使用的命令窗口就是使用串口来进行传输的。网络的使用比较重要,这次就来做Linux 下socket的网络编程。
基于socket的网络编程,互联网上可谓数不胜数,多的是代码段和测试程序,来看下这段程序。
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <errno.h>
- #include <netdb.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <unistd.h>
- #define SERVER_PORT 6666
-
- /*
- 连接到服务器后,会不停循环,等待输入,
- 输入quit后,断开与服务器的连接
- */
-
- int main()
- {
-
- //客户端只需要一个套接字文件描述符,用于和服务器通信
-
- int clientSocket;
-
- //描述服务器的socket
-
- struct sockaddr_in serverAddr;
- char sendbuf[200];
- char recvbuf[200];
-
- int iDataNum;
-
- if((clientSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
-
- {
-
- perror("socket");
-
- return 1;
-
- }
-
- serverAddr.sin_family = AF_INET;
-
- serverAddr.sin_port = htons(SERVER_PORT);
-
- //指定服务器端的ip,本地测试:127.0.0.1
-
- //inet_addr()函数,将点分十进制IP转换成网络字节序IP
-
- serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
-
- if(connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)
-
- {
-
- perror("connect");
-
- return 1;
-
- }
-
- printf("连接到主机...\n");
-
- while(1)
-
- {
-
- printf("发送消息:");
-
- scanf("%s", sendbuf);
-
- printf("\n");
-
- send(clientSocket, sendbuf, strlen(sendbuf), 0);
-
-
-
- if(strcmp(sendbuf, "quit") == 0)
-
- break;
-
- printf("读取消息:");
-
- recvbuf[0] = '\0';
-
- iDataNum = recv(clientSocket, recvbuf, 200, 0);
-
- recvbuf[iDataNum] = '\0';
-
- printf("%s\n", recvbuf);
-
- }
-
- close(clientSocket);
-
- return 0;
-
- }
-
复制代码 这是一段比较一般的程序,不过能够实现功能,在主程序里存在键盘输入的等待,阻塞了后面的运行,也就是不能及时搜到服务端的数据,对于测试来说,这也不算大问题,测试下看看效果 板子运行的
服务端程序呈现的
多少是有点别扭的。所以实际应用不能这么干。那么就结合之前的测试做个相对实际的小应用。读取ADC的数值,发送的TCP服务端,也就是电脑端的程序来显示。
修改后的代码是这样子的
在我的CodeBlocks中编译后,运行的效果如下
每秒钟收到一次ADC的数值,因为板卡的ADC引脚没有接到电压源所以数值没有变化。主要是验证了网络通信的一个实际应用。能够达到预期。
|
|