自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 基于ARM树莓派实现智能家居:语音识别控制,Socket网络控制,火灾报警检测,实时监控

● 语音模块识别语音来控制各个灯的开关,基于串口通信来配置语音命令的内容。● 搭建TCP服务器,用socket网络通信的方式控制各个灯的开关,手机客户端发送指令到电脑服务器端来实现控制功能。● 火灾报警,火焰检测模块结合蜂鸣器开发。接收火焰状态,检测有火源靠近时,蜂鸣器输出低电平发出警报声响,并在终端显示火灾危险提示,检测没有火源时,蜂鸣器输出高电平,停止报警声。

2023-04-29 08:12:09 3298 42

原创 树莓派+摄像头:mjpg-streamer实现监控功能的配置及调试

配置前需要安装的工具包;下载安装mjpg-streamer源码到树莓; 进入下载目录的路径; 输入指令编译:make all; 安装指令:sudo make install; 在安装好的目录下打开脚本文件并修改; 配置树莓派摄像头; 运行摄像头程序; 通过ip和端口查看

2023-04-26 16:47:18 4269 8

原创 OpenSSL编译说明:Linux结合libcurl库编程实现人脸识别和车牌识别

① wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz //下载② tar xvf openssl-1.1.1a.tar.gz //解压③ cd openssl-1.1.1a //进入解压皓的openssl-1.1.1a目录下④ ./config //配置在系统的默认位置,省的我们调库的时候再去找库的位置⑤ make //编译⑥ sudo make install //最后一步安装完成

2023-04-05 21:31:11 699 11

原创 libcurl库的安装及使用说明

①下载网址,② libcurl库安装步骤,③ libcurl等第三方库的通用编译方法,③ libcurl等第三方库的通用编译方法,①代码说明②编译说明③执行说明。libcurl的使用说明。① curl函数简介● libcurl官网:http://curl.haxx.se/● libcurl库下载:https://github.com/curl/curl/releases/tag/curl-7_71_1

2023-04-04 20:57:08 3391 5

原创 OSI(七层)网络模型,三次握手四次挥手梳理,Socket.TCP/IP.HTTP三者说明

建立起一个TCP连接需要经过“三次握手”,断开需要经过“四次挥手”。为什么连接的时候是三次握手,关闭的时候却是四次握手?HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket。HTTP协议是建立在TCP协议之上的一种应用。OSI网络模型也称七层网络模型

2023-04-03 19:10:05 1540 3

原创 树莓派Linux源码配置,树莓派Linux内核编译,树莓派Linux内核更换

② 编译时报错及解决方案(亲测)● dmesg报错及解决方案(亲测)① 打包zImage文件。打包zImage成树莓派可用的xxx.img② 树莓派断电,拔出树莓派的SD卡,插到读卡器,读卡器插入电脑,映射到虚拟机③ 数据拷贝,挂载U盘④安装modules。含有设备驱动文件:比如HDMI,WIFI,USB,IO等⑤安装更新 kernel.img 文件,镜像名字是kernel7.img⑥ 把kernel_new.img文件,拷贝到data1分区,起名kernel7.img,覆盖原来的kernel7.img

2023-03-27 14:53:47 1031 13

原创 交叉编译说明:工具链安装和环境变量配置

工具链下载网址:https://github.com/raspberrypi/ (3) 解压文件:unzip tools-master.zip (4) 进入解压好的文件目录中,依次进入如下目录直到bin目录(64位计算机就如下选择)(5)ls进入bin目录里,找到arm-linux-gnueabihf-gcc(7)指令arm-linux-gnueabihf-gcc -v 检查交叉工具链(3)export PATH= :配置环境变量= 红线部分 + 当前路径​

2023-03-25 11:28:40 3998 6

原创 通过Linux串口实现树莓派与电脑通信

​我在基于全志H6实现Linux串口通信这篇文章中也有详解介绍:点击查看详细内容。② 实现串口多机通信的协议设置:串口号,数据格式和波特率。类似于人和人在交流沟通时,都必须使用同一种语言和语速,这样通信双方才能明白对方的内容。头文件:#include 。① cd /boot/ :进入系统根目录中的boot目录;② sudo vim cmdline.tx :用超级用户权限打开cmdline.tx文件,内容如图:​

2023-03-22 20:27:13 1267 5

原创 基于树莓派实现超声波测距

怎么算距离:距离=速度(340m/s)*时间/2 (注意速度单位和时间单位的换)● 1秒(s) = 1000毫秒(ms) = 1000000微秒(us)① 代码编写一定要结合时序图分析过程;② 计算波在空气中的时间,要统一把时间单位换算成微妙,不能统一换算成秒来计算(亲测出错)。超声波测距模块是用来测量距离的一种产品,通过发送和接收超声波,利用时间差和声音传播速度, 计算出模块到前方障碍物的距离。

2023-03-22 10:14:03 944 4

原创 树莓派编程控制继电器及继电器组

通俗点讲,可以把继电器理解成是一些功能设备的控制开关。● LOW:给到低电平时,电路接通;● HIGH:给到高电平时,电路断开;● 继电器vcc——树莓3.3v或5v;● 继电器Gnd——树莓0v或Gnd;● 继电器In——树莓GPIO.7(自己设置);控制继电器组其实和控制单个继电器操作一样,只是继电器组要多设置一些控制的io口而已!

2023-03-21 16:57:55 2172 4

原创 树莓派(3B):启动流程,系统初始化配置,引脚图图示说明

树莓派刷机及串口方式登陆;配置树莓派接入网络;固定树莓派的ip地址;打开树莓派SSH功能;用国内的源更新vim;树莓派图形xrdp界面登陆;树莓派和windows的FileZille文件共享;引脚图示说明;①准备工具;②操作步骤

2023-03-20 18:29:18 2603 12

原创 Linux分文件编程:静态库与动态库的生成和使用

一般写代码demo时,习惯用一个代码文件进行代码编辑和编译。如果代码工程量大,使用一个代码文件编写代码,就会显得代码冗长,繁杂,也不便后期维护。于是,便出现了分文件编程的方式。通俗点说明:你可以使用我的代码,但是你不能看我的代码;编译时,会链接到我们生成的库文件,程序可以正常编译运行,但如果常规使用vi打开库文件,就是一页乱码。静态库文件的命名方式:“libxxx.a”,库名前加“lib”,后缀用“.a”,“xxx”为静态库名;动态库的命名方式:“libxxx.so”, 库名前加“lib”,后缀用“.so”

2023-03-18 15:06:23 1863 12

原创 C语言数据结构:链表的增删改查及动态创建

把它想象成自行车链条,由n个节点组成,可以对这些节点进行“增,删,改,查”等操作,即对数据的操作。 ● 可以进行动态存储分配; ● 可以在节点中定义多种数据类型; ● 链表都有一个头指针,一般以head来表示,存放的是一个地址;● 链表中包含头结点和其它节点两种,头结点是没有数据域的; ● 链表中每个节点都分为两个区域,一个数据域,一个是指针域;

2023-03-10 19:27:31 2210 22

原创 C语言设计模式:实现简单工厂模式和工程创建

● 设计模式是建筑设计领域引入到计算机科学中来的;● 设计模式是对面向对象设计中反复出现的问题的解决方案;● 算法不是设计模式,因为算法致力于解决问题而非设计问题;● 设计模式通常描述了一组相互紧密作用的类与对象;● 设计模式使代码更稳定,更安全,拓展性更强,同时也方便代码重构。● 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象;● 共同的接口:我们自己创建共同接口API,从工厂里面获得需要的对象放入main函数中去运行。

2023-03-07 15:46:13 1353 17

原创 嵌入式和Python(二):python初识及其基本使用规则

● Python是强类型语言,变量创建后会对应一种数据类型,出现在统一表达式中的不同类型的变量需要做类型转换;● Python使用C语言开发,但是Python不再有C语言中的指针等复杂的数据类型;Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单;● 将Python嵌入到C/C++程序,让你的程序的用户获得"脚本化"的能力;● Python是强类型语言,变量创建后会对应一种数据类型,出现在统一表达式中的不同类型的变量需要做类型转换;没有分号

2023-03-05 20:36:26 1560 10

原创 嵌入式和Python(一):python环境搭建的详细步骤

安装Python ① 更新软件列表 ②安装编译python需要用到的环境 ③下载python源码 ④解压源码包 ⑤配置 ⑥ 编译 ⑦ 安装建立软连接 ① 删除原来的软连接 ②在/usr/bin/目录创建软连接python,定向/usr/local/bin/python3.9 ③检查python版本是否是3.9更新pip ① 更新源 ② 建立面向pip的源文件 ③ 源文件pip.conf里需要输入的内容

2023-03-04 20:42:33 1772 6

原创 基于Linux串口实现语音控制刷抖音

​进入语音模块官网 http://www.smartpi.cn/#/,配置词条和识别后的串口输出指令。① 输入指令:dmesg 查看连接USB的设备信息(此处查看手机信息)。② 输入指令:sudo apt-get install adb 安装adb工具。③ 命令查看设备:adb devices可以看到adb检查到的串行设备数字。④ 打开手机开发者选项,允许usb进行调试。⑤ adb shell进入手机,出现以下页面,表示进入手机成功。⑥ 退出命令:exit​

2023-03-02 21:35:54 2636 6

原创 嵌入式数据库:SQLite3的安装和使用说明

​SQLite函数列表:https://www.sqlite.org/c3ref/funclist.html ●创建一个数据库 ●创建一张表格 ●插入一条记录 ●查看数据库的记录 ●删除一条记录 ●更改一条记录●删除一张表 ●增加一列SQLite3安装网址:https://www.sqlite.org/download.html​

2023-03-01 20:29:33 5194 8

原创 全志H616: Linux串口开发

Orange Pi Zero 2可用的串口协议为ttyS5,用作信息交互串口,其中ttyS0为调试串口,也可自行配置。● 是设备间接线通信的一种方式。● 数据一位一位地顺序传送。● 双向通信,全双工。● 传送速度相对较慢。● RXD:数据输入引脚,数据接收;● TXD:数据发送引脚,数据发送;桌面新建.c文件uartTool.c——> 对应wiringPI库自己封装函数 ——> 生成头文件uartTool.h——> 结合uartTool.c和uartTool.h实现代码uartTest.c

2023-02-22 12:52:49 690 4

原创 全志H616:OLED屏应用 — IIC协议

Linux一切皆文件,每个硬件设备“对应”一个文件,由驱动程序提供映射;安装 i2c-tools 命令:sudo apt-get install i2c-tools; 输入命令:sudo i2cdetect -y 3。查看oled官方源码路径:——> wiringOP ——> examples ——> oled_demo.c。● 启动 linux 系统后, 在命令行中输入:ls /dev查看H616是否存在 i2c-3 的设备节点; ● 从命令运行结果能观察到系统支持I2C-3和I2C-5的驱动

2023-02-19 21:31:10 778 1

原创 全志H616:Linux定时器控制SG90舵机的转动角度

● 实现定时器,通过itimerval结构体以及函数setitimer产生的信号,系统随之使用signal信号处理函数来处理产生的定时信号。从而实现定时器。● 这种方法需要注意的是:一个进程只能创建一个定时器。● 向黄色信号线“灌入”PWM信号。黄色为PWM信号控制。红色为VCC,灰色为GND● 不同的PWM波形对应不同的旋转角度,以20ms为周期,50hz为频率的PWM波● 定时器需要定时20ms,关心的单位0.5ms, 20ms = 0.5ms * 40

2023-02-19 09:56:36 413 2

原创 基于全志H616的超声波测距实验

①怎么让它发波:Trig,给Trig端口至少10us的高电平 ;②怎么知道开始发了:Echo信号,由低电平跳转到高电平,表示开始发送波;③怎么知道接收了返回波:Echo,由高电平跳转回低电平,表示波回来了;④怎么算时间:Echo引脚维持高电平的时间! 波发出去的那一下,开始启动定时器,波回来的那一下,我们开始停止定时器,计算出中间经过多少时间。⑤怎么算距离:距离=速度(340m/s)*时间/2 (注意速度单位和时间单位的换)★实现过程可以结合时序图分析波的运动过程

2023-02-17 15:07:32 232

原创 Orangepi Zero2 全志H616:蜂鸣器,链接库,shell脚本

①原因:代码中调用官方库函数后,直接gcc编译会出现如下报错,因此在编译的时候需要链接库,②查找库指令:Makefile。在要查找库的路径后加上命令Makefile。③在gcc编译后面加上链接库,编译通过。④shell脚本传参数说明:美元符号就是参数。参数1:$0,参数2:$1,依此类推.....

2023-02-15 16:24:50 237 5

原创 Orangepi Zero2 全志H616(三):引脚图及说明

▶ 1 到 26 号引脚与开发板上的 26 Pin 引脚相对应。▶ 27 号引脚对应开发板上 13pin 的 10 号引脚;▶ 29 号引脚对应开发板上 13pin 的 11 号引脚;▶ 31 号引脚对应开发板上 13pin 的 12 号引脚;▶ 33 号引脚对应开发板上 13pin 的 13 号引脚;▶ 28、30、32、34 号引脚为空,暂先忽略 。

2023-02-14 12:37:50 1014 1

原创 Orangepi Zero2 全志H616(二):wiringPi外设SDK安装

① git clone https://github.com/orangepi-xunlong/wiringOP //下载源码;② cd wiringOP //进入文件夹;③ sudo ./build clean //清除编译信息;④ sudo ./build //编译验证指令: gpio readall

2023-02-14 10:39:28 325

原创 Orangepi Zero2 全志H616(一):配置初始化和启动流程

学习和使用全志可以掌握Linux-ARM的软硬件架构开发,可以对Linux系统进行深度学习。● 扫描周围的WIFI热点的命令: nmcli dev wifi ●接入网络命令 nmcli dev wifi connectTP-LINK_3E30 password186****1783 ●查看IP地址:ip addr show wlan0或者ifconfig

2023-02-13 21:57:57 3497 2

原创 Linux网络编程:Socket服务器和客户端实现双方通信

网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。linux结构体查询步骤:①cd /usr/include/ ②grep "struct sockaddr_in {" * -nir ③vi linux/in.h +显示的数字sockaddr结构的两种原型:一般使用新版本struct sockaddr_in的结构体类型

2023-02-10 18:59:25 2515 2

原创 Linux线程:条件控制实现线程同步(cond)

​多线程开发的最基本概念主要包含三点:线程,互斥锁,条件。其中,线程操作又分线程的创建,退出,等待 3 种(http://t.csdn.cn/02KL5)。互斥锁则包括 4 种操作,分别是创建,销毁,加锁和解锁(http://t.csdn.cn/aVEhx)。条件操作有 5 种操作:创建,销毁,触发,广播和等待(此篇)。​

2023-02-03 21:22:59 262 2

原创 Linux线程:互斥量加锁和解锁(mutex)

多线程开发的最基本概念主要包含三点:线程,互斥锁,条件。其中,线程操作又分线程的创建,退出,等待 3 种(上一篇文章已详细阐述)。互斥锁则包括 4 种操作,分别是创建,销毁,加锁和解锁(此篇文章)。条件操作有 5 种操作:创建,销毁,触发,广播和等待。其他的一些线程扩展概念,如信号灯等(下一篇文章会详细阐述),都可以通过上面的三个基本元素的基本操作封装出来

2023-02-02 21:14:51 1554 1

原创 Linux线程:创建(pthread_create),等待(pthread_join),退出(pthread_exit)

pthread_t *thread:线程ID,由函数pthread_self()获取,类似获取进程pid使用getpid()函数;const pthread_attr_t *attr:用于定制各种不同的线程属性,暂可以把它设置为NULL,以创建默认属性的线程;void *(*start_routine) (void *):线程中执行函数。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个无类型指针参数argvoid *arg:执行函数中中参数。

2023-01-31 19:31:04 6433 2

原创 Linux进程间通信:信号量(sem)

举例:如果一个公共厕所有3个坑位,p1进来后就剩下2个坑位,当p2和p3进来后,此时剩下0个坑位。当p4在进来,坑位就为-1个,p5在进来,坑位就为-2个。那么坑位(信号量)就会执行P操作,把p4和p5放在等待队列中。当p1完事离开后,坑位(信号量)就执行V操作,将p4放入原p1的坑位,此时的坑位数就位-1,只有p5还在等待队列。以次内推,当p1p2p3p4p5全部完事后,坑位数量又重新为3。(新增一个进程,信号量+1;释放一个进程,信号量-1),这样就可以通过信号量有效的管理和分配资源。

2023-01-27 21:12:57 1119 1

原创 Linux进程间通信:信号(signal)

在Linux中,①信号可以简单理解为软中断,许多重要的程序都需要处理信号。信号,为 Linux 提供了一种处理异步事件的方法。比如,终端用户输入了 ctrl+c 来中断程序,会通过信号机制停止一个程序。②信号也是进程间通信的一种方式,也是如此,进程才能收到信号指令,完成操作。:查询系统中的信号。

2023-01-27 11:12:26 1618

原创 Linux进程间通信:消息队列(msg)

是Linux的一种通信机制,这种通信机制传递的数据具有某种结构,而不是简单的字节流;消息队列的本质其实是一个内核提供的链表,内核基于这个链表,实现了一个数据结构;向消息队列中写数据,实际上是向这个数据结构中插入一个新结点;从消息队列汇总读数据,实际上是从这个数据结构中删除一个结点;消息队列提供从一个进程向另外一个进程发送一块数据的方法;消息队列也有管道一样的不足,就是每个数据块的最大长度是有上限的,系统上全体队列的最大总长度也有一个上限。

2023-01-25 10:49:56 1754

原创 Linux进程间通信:共享内存(shm)

比如:在一家餐厅中,有编号为a b c d e五张桌子,张三约了小美在c号桌一起吃饭,那么小美赴约直接到c号桌与张三共同用餐。如果张三和小美没有协议好在c桌用餐,那么他们就可能不会在同一张做桌子上吃饭,就完成不了这次约会。

2023-01-23 20:58:59 2175

原创 Linux进程间通信:无名管道(pipe),有名管道(fifo)

进程与进程在应用层里面不能直接进行信息交互,必须通过内核来进行通信。创建一个管道作为进程间信息交互的媒介,所以进程A就可以在管道中写入数据,进程B在从管道中读取数据,这样就可以实现进程A与进程B之间的通信①只适用于带有亲缘关系的进程,比如父子进程;如果进程间没有任何关系,就不能使用无名管道。②只能实现一个进程写另一个进程读,而如果需要两者同时进行时,就得重新打开一个管道。①可以实现没有任何亲缘关系的进程间的通信,因为有名管道在使用前必须创建一个特殊文件名(mkfifo)来承接进程间的读和写;

2023-01-19 19:07:00 577 1

原创 Linux进程控制:初识篇

父进程获取pid=3593后停止运行,子进程继续运行,同时获取子进程的父进程pid,会发现pid并不是原父进程的pid,而是生成了新的pid=1587,输入指令ps -aux|grep 1587查询可知,1587是一个名为system的系统进程,也就有是说,之前的孤儿进程被系统进程所领养,生成了新的父子进程关系。但是系统不允许进程中有太多孤儿进程,就会安排pid=1的初始进程init来领养孤儿进程(系统版本差异,也可能是其它进程来收养),此时的初始进程为此进程的父进程,孤儿进程重新开始为子进程。

2023-01-17 20:33:04 1186

原创 标准C库函数:fopen(),fwrite(),fread(),fseek(),fclose()的基本用法。

① const char *pathname:文件名/路径,这是char型指针,须在”文件名/路径“上加上双引号;② const char *mode:文件的操作权限,这里也是字符型指针,须在“操作权限”上加双引号;实际写入长度为size_t nmemb,返回值为块成功写入块的nmemb数量。② size_t size: size是的块长度;② size_t size: size是块长度。③ size_t nmemb: nmemb是块的数量;

2023-01-13 13:50:36 1351 1

原创 Linux文件编程:写一个整型和结构体数组到文件

缓冲区buf为无类型指针,在初学时经常会定义buf为char型的指针类型,然后对文件的读写操作就会使用字符串作为文件内容。在写入文件后,光标会移动至文件内容尾,须使用lseek函数移动光标到文件内容头,在使用read函数读取文件内容。:在初学open,write,read函数时,我们经常会把对字符串的读写操作作为模拟练习的对象,于是对初学者来说就容易形成一个误区:以为写入和读取的文件内容只能是字符串。首先要会使用结构体,先定义结构体变量,赋值,在计算结构体的大小,其他的和写入整型到文件的方法一样;

2023-01-12 18:01:33 314

原创 Linux文件操作:一张图详解cp指令实现文件内容拷贝

④:cat 查看目标文件"des.c"内容,“hello world!②:编译“csdn.c”,直接执行“./a.out”这个程序,会有格式提示的错误;②:在读取文件内容之前一定要将光标移至文件内容开头。⑤:写入读取到的原文件内容到目标文件;⑥:close关闭原文件和目标文件。:🔺①:在使用lseek计算文件大小时,光标会发生移动,移至文件内容末尾;③:读取原文件内容;:①:在原文件"src.c"中写入内容“hello world!将原文件内容复制/拷贝至目标文件。:①:判断命令行中参数的总个数;

2023-01-11 19:57:29 383

原创 O_CREAT O_EXCL O_APPEND O_TRUNC

🔺举例:在O_CREAT后跟上O_EXCL,如果已经有file1文件,就提示文件存在;如果没有file1文件,什么也不显示,并创建新的文件。:打开文件时,如果文件中本来是有内容的,而且为只读或只写打开成功,则将其长度截短为0(如果有新写入的内容,就将原内容覆盖掉)。🔺举例:在打开文件file1时,若文件不存在,就需要使用O_CREAT创建文件file1,在跟上文件访问权限mode。:若文件不存在则创建文件,🔺使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限。

2023-01-10 14:45:54 2363

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除