bbblack的网络socket通信实验
1. 本次用bbblack作网络的通信实验,对了,这个板子必须装SD卡才能启动吗?板载的4GB eMMC Flash 存储器,eMMC (Embedded Multi Media Card) 为MMC协会所订立的,eMMC 相当于 NandFlash+主控IC ,对外的接口协议与SD、TF卡一样,主要是针对手机或平板电脑等产品的内嵌式存储器标准规格。eMMC的一个明显优势是在封装中集成了一个控制器,它提供标准接口并管理闪存,使得手机厂商就能专注于产品开发的其它部分,看下原理图,果然是SD卡的接口,不过是8位数据线。
2. 看下数据手册里面的,有3个MMC接口,EMMC是MMC1的接口,板子上的SD卡接的是MMC0
3. 言归正传测试下socket的通信。先看下原理图,使用的是LAN8710
4. 搞个程序测试一下,一个问题,这些头文件的包含是怎么设置的?sys的文件夹是那个?恕我懵逼,去linux内核里面都不知道在哪里?如果是和内核相关的程序,比如驱动程序,那么所包含的头文件是在内核源码的安装目录下,即/usr/src/kernel/include,这时一般要在Makefile文件中指定内核源码目录,在编译时指定INCLUDE目录,那我这次编译这个文件,需要写一个makefile的吧,应用层的代码,按照以前驱动LED的方式。应该不可以在开发板上直接编译的吧,是在电脑上用交叉编译环境编译的才对,生成.o文件,传给开发板,为啥LED的文档,直接放板子上编译?不敢相信。
如果是应用程序,并且使用GCC进行普通编译,如果编译时没有使用-I选项指定包含目录的话,那么默认的头文件目录在/usr/include(电脑ubuntu的路径)下,刚才去ubuntu电脑看了一下,果然是有代码,我以前以为所有这些头文件都是开发板上的kernel内核里面的,也就是说编译的时候也会用到电脑ubuntu的头文件。
那么这个sys/socket.h头文件在什么地方?是电脑ubuntu里面的,还是开发板的内核源码里面的?位置在哪里?不会是在交叉编译器的路径里面吧。我只是不觉的交叉编译器会这么强大,连socket.h这种头文件都包含了?理论上这些不是应该用内核里面的吗?
如果是应用程序,采用交叉编译,编译时没有使用-I选项指定包含目录的话,那么默认的头文件搜索路径为/usr/local/arm/2.95.3/arm-linux/include,即交叉编译器的安装目录下的include目录。
纵上来看,有3个头文件的路径,一个是电脑Ubuntu的,一个是交叉编译器里面的,一个是makefile里面指定的。但是目前依然无法确认这个socket.h文件位置?
#include<stdio.h> #include<string.h> #include<strings.h> #include <ctype.h> #include <unistd.h> #include <stdlib.h> #include <time.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <sys/types.h> #include <sys/time.h> #include <fcntl.h> #include <sys/stat.h> #define SERVER_IP "192.168.1.106" #define SERVER_PORT 10010 #define MY_IP "192.168.1.106" #define MY_PORT 10010 #define FILE_NAME "/dev/ttyO0" #define MAX_LEN 128 int main(void) { int serial_buffer[MAX_LEN] = {0}; char data2send[4096] = {0}; int numbers2send = 0; int i = 0; int serial_fd = open(FILE_NAME, O_RDWR); if(serial_fd < 0) { printf("Serial port open error.\n"); return -1; } int socket_fd = socket(AF_INET, SOCK_STREAM, 0); if(socket_fd < 0) { perror("socket_fd"); return -1; } printf("Ready to connect the server...\n"); struct sockaddr_in server_addr = {0}; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVER_PORT); server_addr.sin_addr.s_addr = inet_addr(SERVER_IP); int ret = connect(socket_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)); if(ret < 0) { perror("connect"); return -1; } printf("connect success.\n"); while(1) { for(i=0; i<MAX_LEN; i++) { serial_buffer[i] = 0; } read(serial_fd, serial_buffer, MAX_LEN); printf("[%s].\n", serial_buffer); send(socket_fd, serial_buffer, MAX_LEN, 0); } close(serial_fd); close(socket_fd); return 0; }
5. 安装个交叉编译器看下里面有哪些头文件,但是一直不明白不同版本的编译器有什么区别?
6. 经过搜索,终于发现了socket.h头文件是在交叉编译器里面的
7。 设置交叉编译器的路径。
修改/etc/bash.bashrc文件(此文件只对当前用户适用)
输入命令:# gedit /etc/bash.bashrc
在最后一行加上 export PATH=$PATH:/home/qhq/am3359/arm-2009q3/bin
输入命令让设置生效:# source /etc/bash.bashrc
测试,输入arm-none,按tab键,看能不能出来一些命令。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App