pl-ps-云
既然我们已经通过 AXI DMA 成功把 1024 字节的数据从 PL 端高速搬回了内存rx_buffer接下来的核心任务就是把这批数据通过 Linux 的 Socket 编程用 TCP 协议发送出去。在 Zynq 开发板的 Linux 系统中使用 TCP 协议向你的电脑端网络调试助手发送数据分为应用层 Socket 编程和开发板网络配置两步。第一步确保开发板和电脑网络畅通在写代码之前先让板子和你的电脑连通可以通过网线直连或者都连在同一个路由器/交换机下查看电脑 IP假设你电脑的 IP 是192.168.1.100。在开发板上配置 IP确保开发板和电脑在同一个网段比如给板子配个192.168.1.50ifconfig eth0 192.168.1.50 netmask 255.255.255.0ping 测试在开发板终端ping 192.168.1.100确保能 ping 通。第二步电脑端NetAssist配置在电脑上打开网络调试助手 (NetAssist)。协议类型选择TCP ServerTCP 服务器。本机 IP 地址选择你电脑的实际 IP或者选0.0.0.0端口号自己定例如8080。点击“打开”。此时你的电脑就在静静等待来自开发板的连接了。第三步编写应用层 TCP 发送程序 (dma_tcp_app.c)我们需要把之前读取 DMA 数据的逻辑和Socket 客户端网络编程结合起来。 它的核心逻辑是“开 DMA 设备读数据 - 创建 Socket - 连接电脑的 NetAssist - 把 DMA 的数据 send 出去”。在 Ubuntu 中新建dma_tcp_app.c#include stdio.h #include stdlib.h #include string.h #include unistd.h #include fcntl.h #include sys/types.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h #define DMA_TEST_SIZE 1024 #define SERVER_IP 192.168.1.100 /* 替换为你电脑 NetAssist 所在的 IP */ #define SERVER_PORT 8080 /* 替换为你 NetAssist 监听的端口号 */ int main(void) { int dma_fd; int sock_fd; char rx_data[DMA_TEST_SIZE] {0}; int ret; struct sockaddr_in server_addr; printf(1. Opening /dev/axi_dma_test...\n); dma_fd open(/dev/axi_dma_test, O_RDWR); if (dma_fd 0) { perror(Failed to open /dev/axi_dma_test); return -1; } /* 从 DMA 驱动中通过 read() 触发搬运并读出 1024 字节真实数据 */ ret read(dma_fd, rx_data, DMA_TEST_SIZE); if (ret 0) { perror(Read from DMA failed); close(dma_fd); return -1; } printf(Successfully read %d bytes from PL-side AXI DMA!\n, ret); close(dma_fd); // 数据已经到内存了可以关闭 DMA 设备 /* 2. 创建 TCP Socket 客户端 */ printf(2. Creating TCP socket...\n); sock_fd socket(AF_INET, SOCK_STREAM, 0); if (sock_fd 0) { perror(Socket creation failed); return -1; } /* 3. 配置服务器电脑 NetAssist地址信息 */ memset(server_addr, 0, sizeof(server_addr)); server_addr.sin_family AF_INET; server_addr.sin_port htons(SERVER_PORT); inet_pton(AF_INET, SERVER_IP, server_addr.sin_addr); /* 4. 连接电脑端 */ printf(3. Connecting to PC NetAssist (%s:%d)...\n, SERVER_IP, SERVER_PORT); if (connect(sock_fd, (struct sockaddr *)server_addr, sizeof(server_addr)) 0) { perror(Connect to NetAssist failed); close(sock_fd); return -1; } printf(Connected to PC successfully!\n); /* 5. 通过 TCP 将 DMA 采集到的 1024 字节数据发送上云/上电脑 */ printf(4. Sending DMA data via TCP...\n); ret send(sock_fd, rx_data, DMA_TEST_SIZE, 0); if (ret 0) { perror(Send failed); } else { printf(Successfully sent %d bytes to NetAssist!\n, ret); } /* 关闭套接字 */ close(sock_fd); return 0; }第四步交叉编译并推送到板子运行在 Ubuntu 中交叉编译$CC dma_tcp_app.c -o dma_tcp_app把生成的dma_tcp_app传到开发板上可以通过 U盘、SD卡或者scp。在开发板上确保 DMA 驱动已经加载modprobe dma_test然后执行chmod x dma_tcp_app ./dma_tcp_app 预期效果当你敲下回车运行./dma_tcp_app的瞬间开发板会通过 AXI DMA 瞬间抓取 1024 字节数据。电脑上的NetAssist 软件界面会立刻刷新哗啦一下收到整整 1024 个字节的十六进制数据开头同样是00 01 02 03 ... 1F。本地局域网调试成功后以后想要“传上云端”只需把代码里的SERVER_IP和SERVER_PORT改成你云服务器的公网 IP 和开放端口即可代码逻辑完全不需要变