自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C语言指针部分补充

*只在声明指针变量的时候是标识符,其他时候都是运算符,表示取出一个值。!!!指针就是地址指针变量(存放地址的变量)也有自己的地址,指针有自己的类型要注意。指针内容是别人的地址,通过指针就可以访问别人地址数组用指针的话,指针偏移p+1并不是地址加1,而是偏移一个类型的长度,如一个整数偏移4个字节,一个字符偏移一个字节。数组名=数组首元素的地址二维数组a,a[0]代表a[0][0]的地址,也就是&a[0][0]a[0]是,第一个子数组的名字,a+1偏移一个子数组,a[0]+1偏移一个整数(

2021-12-20 15:42:27 588

原创 树莓派连接语音模块

回顾之前我们进行了语音模块的验货,并且进行了二次开发,我们知道了在哪里可以进行程序的再次烧写,在这基础上,我们也学习了树莓派的串口通信,那么我们就可以学习怎么把语音模块和树莓派进行通信思路之前我们语音模块知道,语音模块在收到了我们的一级指令后会向串口上发送收到,接着我们再说一句二级指令,例如开灯,就会向串口上发送提示语句,我们利用中这一点,语音模块和树莓派连接起来之后,语音模块就会向树莓派的串口上发东西,这时候我们就可以来在树莓派上读写到串口的东西。连线:(上下对应)树莓派:T,R,GND,5V

2021-10-06 17:05:23 3988 1

原创 树莓派串口通信(和PC)

树莓派串口通信简单来说,就是我们想要试试通过树莓派的串口能不能往上面发送消息,在电脑上显示。配置工作,参考这篇文章链接: [https://www.cnblogs.com/lulipro/p/5992172.html]我们的思路是:1.首先初始化wiringPI2.我们打开树莓派的串口3.简单书写尝试向串口发送数据,我们简单发一个’C’代码:注意要连接好USB转TTL连上电脑,之前学过的T-R,R-T,GND-0V结果:(师上官可编程)...

2021-10-06 16:23:16 2176

原创 为树莓派交叉编译做准备

交叉编译首先,什么是交叉编译呢?简单来说就是在一个平台上生成另一个平台上的代码。比如我们之后在Ubuntu上写将来在树莓派上运行的代码。为什么要这么做呢?可能原因有1.有些平台上不允许或者空间不够安置编译器2.目的平台资源匮乏,无法运行编译器3.有时候平台都没有操作系统,跟谈不上什么操作需要的工具:交叉编译链。步骤1.首先我们需要交叉编译链,我们可以去github上找(zip包)2.打开虚拟机(开启共享文件夹的虚拟机)工作目录下新建一个mkdir lessonPI文件夹,把下载好的zip

2021-09-14 18:54:13 125

原创 修改语音模块,重新烧写程序

我们来定制语音模块,需要识别我们预定好的语音,所以我们需要阅读模块代码,然后读懂要在哪里修改,阅读模块代码后得知要在两个地方改,在1.添加我们的关键词,在2处main函数里修改识别后的结果(1)把这里最后的广州命令修改为我们想要的,下面对应的宏也要修改,并且在.h文件中也要修改对应的宏(2)然后重新编译,发现没有错误重新烧写程序第三阶段/修改代码/口令模式/obj/重新接语音模块接地线,看是不是烧写成功。(师上官可编程)...

2021-09-07 18:27:25 564

原创 语音模块(验货)

拿到了我们语音模块,怎么进行验货呢?语音模块:型号:YS-LDV7 名称:一体化语音识别模块 规格:43*29.7MM 供电电压:5V (内部工作电压 3.3V) 待机电流:30MA 识别时电流:45MA IO 口输出:高电平为 3.3V 通信方式:串口通信(5V TTL 电平,不可直接接 RS232、RS485) 单片机参数:型号–>STC11L08XE 、flash–>8k、SRAM–>1280、eeprom–>32k 识别词条个数:50 句 工作温度:-20 至 60℃首

2021-06-13 16:17:44 465

原创 串口通信协议概述

串口通信协议概述:串口通信经常用在多机通信中,软件/硬件经常有模块化的思想。数据在T,R上走(全双工,半双工…),双方通信条件:1.语言互通。2.语速正常对于串口就是:1.数据格式互通。2.波特率正常(数据格式:数据位,停止位,奇偶校验位)(师上官可编程)...

2021-06-09 08:12:33 133

转载 树莓派超声波模块

参考代码文章:链接: https://www.cnblogs.com/yuemo/p/8888342.html

2021-06-01 21:42:28 202

原创 树莓派继电器开发

继电器开发首先我们来看一下树莓派的IO口相关信息,敲一下gpio readall 指令这样我们就能查看树莓派的IO口标注0的是负极,继电器供电是3.3V,我们选择对应3.3V的针脚。VCC-3.3V,GND-0V可以看到继电器亮了,继电器IO接有标号GPIO的都可以,我们选择靠得近的7脚,(因为这是可编程的,怎么编程是通过我们控制输出高电平低电平来控制的,所以选择有标号GPIO的)我们来实战:来看看这段代码,首先我们判断初始化是否正常,将7引脚设置为输出引脚,再输出一个高电平给7引脚,接着接受

2021-06-01 21:07:18 200

原创 动态库的制作

制作格式上次我们学习制作静态库的概念和实战,这次我们来制作动态库:1.gcc -shared -fpic 源.c -o lib生成文件的名字.so.a是静态库的意思,.so是动态库的意思2.编译,gcc 主函数.c -l动态库 -L./ (-o 名字)3…/名字后面的过程和静态库很类似。但是这样执行之后会可能会提示错误,显示不能打开share…是因为程序执行的时候会去找动态库,找不到会报错.初学者可以修改环境变量:敲一下export查看系统的环境变量,有点像是当初安装java的jdk时

2021-05-12 10:57:03 207 1

原创 Linux下静态库的制作

静态库静态函数库,是函数执行前(编译)就加到目标程序中去了。优点:(1)运行快。(2)发布程序无需提供静态库,因为已经在APP中,移植方便。缺点:(1) 程序大。(2)链接时完整地拷贝至可执行文件中,别多次使用就有多份冗余拷贝。(3)更新,部署,发布较为麻烦我们很多时候不希望别人看到我们的源码,只想让别人就用一下我的功能就行,我们就要用到库格式: libxxx.a库名为xxx,后缀是 .a步骤:原材料:源代码.c(a)用.c文件生成 .o文件——例:gcc cal.c -c(b

2021-05-11 09:39:14 144

原创 分文件 编程(C语言)的基本实现

分文件编程参考:链接: https://blog.csdn.net/coolwriter/article/details/80431850?.模块化编程,就是多文件编程。把不同功能的函数封装到不同的文件中。一个.c文件和一个.h文件被称为一个模块。开发C程序时,稍微大型的项目就需要使用多文件开发(模块化编程)。当代码量较大功能较复杂时,单一文件程序会使得文件非常巨大,代码量非常大,成千上万行的代码在一个文件中不便于修改和维护,因此需要将不同的功能模块放在不同的文件中。以往我们都是在一个文件中进行编程

2021-05-11 09:03:53 3865 2

原创 树莓派和Windows通信

和以前的一样我们用到FileZilla这个软件通过拖拽我们可以实现树莓派和windows的文件传输。(这个软件好厉害,。。。。。。。。)

2021-04-17 11:19:12 232

转载 vim自动缩进,括号匹配小补充

我不知道为什么,原来Ubuntu,现在树莓派也是,我的vim一直都很笨重,没有自动缩进,括号匹配什么的,每次都要自己设置,是都这样吗,老师没有讲过,我们需要自己设置一下请看这篇文章讲解,简单明了。链接: https://blog.csdn.net/yangss123/article/details/77606421?utm_source=app&app_version=4.5.5....

2021-04-17 10:29:37 109

原创 VIM更新到好用的版本

上面是总过程。我们来操作:(用网络登录的方式)把这里默认的源注释掉,换成我们国内的源。deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi更新完源后,我们sudo apt-get updatesudo apt-get install vim更新好了之后我们写一个小程序,打印一句话:可以看到,又变成我们熟悉的Linux环境了,我们可以正常进行开发。...

2021-04-17 10:22:14 264

原创 网络方式登录树莓派

# SSH服务我们已经学会了串口的方式登录树莓派,可是这样很麻烦,我们可以用别的方式,比如网络接入吗,是可以的,我们可以开启SSH服务。启动成功了返回。我们来试试看:记住自己的ip地址(上次固定好了的ip)我们输入用户名,密码成功了,我们不用串口,直接通过网络访问到了树莓派。(师上官可编程)...

2021-04-17 10:02:32 121

原创 树莓派的网络配置

网络配置好,我们进入了树莓派后怎么把它接入网络呢?我们就要对树莓派进行一些网络配置:参考:链接: https://blog.csdn.net/qq_36760780/article/details/82016711.这篇文章讲解的很详细,我就稍微再补充一下过程。首先进入树莓派后,敲入以下指令sudo nano /etc/wpa_supplicant/wpa_supplicant.conf为什么不是以前的vi呢,这里树莓派的vi是很老的版本了,包括我自己也不会用,这里用sudo,nano是给予权

2021-04-17 09:41:47 930

原创 树莓派刷机,串口登录

树莓派的刷机首先树莓派的刷机需要几个东西,一个是树莓派的镜像,这个从官网下载:树莓派镜像。下载好后为这个格式的文件:先对树莓派的SD卡进行格式化,格式化后用烧录工具将树莓派镜像烧录进去。工具我们要用到刷机过程其实很简单:打开上面这个软件,在Image File 中选择刚刚下载好的Img文件路径,插入sd卡后,Device会自动检测出设备,这里我没有插入所以没有显示,然后点击一下write,文件就会慢慢烧录进去,整个过程大概需要五分钟左右。然后就完成了刷机。这里有个小过程,树莓派默认登录是绑

2021-04-17 08:47:51 169

原创 FTP云盘项目

学习参考文章:链接: https://blog.csdn.net/qq_46518045/article/details/113482400.ls:查看当前文件lls:查看服务器文件cd+空格+文件名(…),服务器进入文件夹或返回上一级lcd+空格+文件名(…),本地进入文件夹或返回上一级get+空格+文件名:得到服务器文件put+空格+文件名: 发送给服务器服务端:#include<stdio.h>#include<sys/types.h> /

2021-04-05 10:02:54 288

原创 Linux网络编程客户服务端交流

我们需要两个程序,server.c和client.c一个服务端,一个客户端。服务端我们之前已经搭建好了,可以直接用:server.c:所以我们还需要一个客户端,来看看怎么写的。客户端的话用到的connect函数,查看手册,和listen,accept函数的参数都很类似,我们来直接使用,配合网络编程第一节的整体流程图来看:client.c:同样的,我们连接同一个ip地址端口,并且连接到它,写入我们要写的话,看看交互结果会怎么样?‘’结果服务端:客户端:可以看到,我们实现了客户端

2021-04-04 19:25:13 85

原创 Linux网络编程服务端附加

上一节,我们搭建了简单的服务端,这一节,我们向原来的代码中加入一些东西,并且连接一下这个服务器,看看结果会怎么样可以看到,我们又创建了一个sockaddr_in对象作为客户端 ,并且把客户端的内容读到服务端来,再把msg写入到客户端去,实现了服务和客户的简单交互。来看看效果:(多阅读阅读上面的代码)客户端:服务端:(师上官可编程)...

2021-04-04 19:02:07 68

原创 Linux网络编程服务端初步

socket网络编程来看一下下面这张图:图左是搭建服务的基本过程,右边是一些要用到的api,和他们之间的关系。步骤主要如下:1.创建套接字,这个套接字就有点像之前的fd一样。用来准备创建一个socket服务2.给这个socket服务添加相关信息,比如ip地址,端口号,一次性能服务的最大数量3.listen(),启动服务之后监听看有谁连接了进来4.accept(),如果有客户端尝试连接,接受请求5.进行数据交互6.关闭服务好,来看下面这段代码:如图11行,步骤1图16-21行,步骤2

2021-04-04 17:09:08 82

原创 Linux线程的信号

线程信号:上一节中我们学了可以用锁来帮助控制线程的执行与否,那么我们经常想要先让一个线程先执行,等他执行之后另一个线程紧接着执行,这个时候就可以搭配cond这个信号来使用锁。首先还是要看手册,声明一个cond量并在主函数里初始化,来看代码:线程1中,第一句话就是等待cond信号,否则它就堵塞在这里不执行任何东西。线程2中不断打印data的值,打一次data加一次,当data==3时,传信号cond告诉别的线程我执行完了,收到信号的可以往下执行你的任务了。线程1收到了cond信号,打印出自己的东

2021-04-04 11:19:28 156

原创 Linux线程出现“死锁”现象

“死锁”所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 因此我们举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。下图:线程1先拿到了锁1,沉睡一秒,这时线程2拿到了锁2,线程1 醒了后又想去拿锁2,可是锁2已经被拿走了,拿不到这把锁就要堵塞在这里,线程2 同样的原因也拿不到锁1,也堵塞,造成了线程无法执行。所以在运用锁的时候一定要注意其中

2021-04-04 10:54:04 198

原创 Linux线程间互斥锁

互斥锁在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源。这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),别人刚好也在此刻使用打印机打印东西,如果不做任何处理的话,打印出来的东西肯定是错乱的。  在线程里也有这么一把锁——互斥锁(mutex),互斥锁是一种简单的加锁的方法来控制对共享资源的访问,互斥锁只有两种状态,即上锁( lock )和解锁( unlock )。简单来说,就是一个线程在执行他的代码段前给自己上一把锁,在打开这把锁之前,其他线程都不要想要执行

2021-04-04 01:30:57 143

原创 Linux线程之间内存共享

内存共享:一个进程的不同线程间内存是共享的,来看这样一段代码:可以看到,我创建两个线程,分别执行func1,func2,它们都不断地打印data的值,并不断的加1,如果内存不共享,他们的data值应该是独立的,而我们来看看结果结果可以看见,两个线程的data值是连续的,也就是说data是两个线程间共同的值,它们共享data这个变量。(师上官可编程)...

2021-04-04 00:09:36 931 2

原创 Linux线程的相关概念

学习这篇文章中有关线程的相关知识。链接: https://www.cnblogs.com/xiehongfeng100/p/4620852.html.进程是程序执行时的一个实例,是担当分配系统资源(CPU时间、内存等)的基本单位。在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控

2021-04-03 23:30:08 64

原创 Linux进程通信之信号

模板样式,照着这样写,这一节原谅我不能像之前一样讲了,它要用的东西有点多,应用为王,那么多实在是记不住,只能写学着写了暂时:w.cr.c运行效果:(师上官可编程)

2021-04-03 17:52:41 51

原创 Linux进程通信之共享内存

共享内存共享内存:顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。简单的用一张图来理解:两个进程A,B,他们都有自己的内存空间,相互不影响,但共享内存就像是一个公共的内存区域,通过声明,访问,映射,就可以让

2021-04-03 15:30:03 189

原创 Linux进程通信之消息队列

消息队列这一节,我们讲进程通信的又一种方式,消息队列。什么是消息队列?消息队列是消息的链表,存放在内核中并由消息队列标识符表示。  消息队列提供了一个从一个进程向另一个进程发送数据块的方法,每个数据块都可以被认为是有一个类型,接受者接受的数据块可以有不同的类型。  简单用一张图理解:  可以看到,在两个进程之间,可以用之前讲过的两种管道方式通信:一种亲缘关系进程,一种不是亲缘关系进程。而消息队列由内核管理,就像一个一的链表一样,有自己的id号,通过key键值索引找到,进程A插入一个新的节点,

2021-04-02 23:45:44 134

原创 Linux进程通信之命名管道

命名管道上一节,我们讲了管道的用法,pipe函数。它属于无名管道,可以看到上一节的例子,它只能在父子具有亲缘关系的进程间进行通信,而命名管道呢?FIFO,也称为命名管道,它是一种文件类型。1、特点FIFO可以在无关的进程之间交换数据,与无名管道不同。FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。mkfifo函数第一个参数为这个管道本身的路径名,第二参数又是模式,没必要记住,用的时候查一下就好了。这里哟们用0600(之前文件操作也用到过的可读可写权限)这里我们简单的

2021-04-02 21:26:52 241

原创 Linux进程通信之管道

一、管道参考文章:链接: https://blog.csdn.net/skyroben/article/details/71513385.管道是基于文件描述符的通信方式。当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1]。其中fd[0]固定用于读管道,而fd[1]固定用于写管道。①半双工通信模式。②只用于具有亲缘关系的进程之间的通信。③可看成是一种特殊的文件。2.2管道如何实现进程间的通信pipe函数()(1)父进程创建管道,得到两个⽂件描述符指向管道的两端(2)父进程f

2021-04-01 23:39:01 118

原创 Linux下system和popen函数

system函数参考这篇博文的概念:链接: https://blog.csdn.net/sk983671939/article/details/79726854.可以看到,system比execl更简单粗暴,它直接让系统本身去执行你想要执行的命令,来看看它的源码:int system(const char * cmdstring){pid_t pid;int status;if(cmdstring == NULL){return (1); //如果cmdstring为空,返回非零值,一般

2021-04-01 21:30:43 187

原创 Linux下exec族函数

EXEC族函数的一些函数使用原文链接: https://blog.csdn.net/u014530704/article/details/73848573.这篇文章讲解的exec相关函数讲解的很好,如果在实际使用过程中的话,具体细节可以来看这篇文章,膜拜大佬(我就做做示例讲解,讲讲怎么使用了。)exec族函数函数的作用:我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进

2021-04-01 17:22:27 131 2

原创 Linux进程收集和孤儿进程

父进程收集子进程的状态首先,我们来思考一下为什么要创建进程呢,很大的原因是我们希望通过子进程来来帮我们干活,比如在fork之后,我们创建了一个子进程,它会执行一段我们想让它执行的代码,而不会影响父进程(当然这里忽略结束信息忽略被父进程收集的“影响”等了)简单来说,就是让子进程来帮我们干活。介绍一个概念,僵尸进程:如果子进程先于父进程退出, 同时父进程又没有调用wait/waitpid,则该子进程将成为僵尸进程。通过ps命令,我们可以看到该进程的状态为Z(表示僵死)。总之,当子进程结束后,要返回一个

2021-03-31 22:03:08 99

原创 Linux下进程退出

进程退出方式细节的同学注意到上一节子进程中ret 到了3之后我想让程序退出,我没有用break,而是用的exit(0),这就要谈进程的退出问题了。一个进程要想退出有哪些方式呢?首先来看正常退出正常退出1.main函数调用return 退出程序了自然退出了对吧2.调用exit(),该函数在C的标准库中3.调用_exit(),或者_Exit(),这属于系统调用。补充,1.最后一个线程返回(线程在后面章节讲解)2.最后一个进程调用pthreadt_exit异常退出1.调用abort2.进程

2021-03-31 20:33:57 127

原创 Linux进程创建之vfork

vfork函数和fork函数的区别我们已经讲过了fork函数创建进程,那vfork有什么意义呢?vfork函数的不同在于:1.它直接使用父进程的存储空间,和fork函数复制拷贝父进程的存储空间不同。2它保证子进程先运行,调用exit后父进程才执行。我们来编程看看区别。可以看出,父进程和子进程谁先运行是不一定的。那换vfork呢?看到,vfork保证子进程先运行。(师上官可编程)...

2021-03-31 17:00:19 124

原创 Linux创建进程

fork函数初用了解了进程的相关概念后,我们来最简单的试用以下进程。查看手册,fork函数可以看到,调用fork后,会立刻创建一个子进程,我们简单看看效果,打印一下自己的进程号。可以看到父进程和子进程的标识符。(师上官可编程)...

2021-03-31 11:14:18 107

原创 Linux进程相关概念

1.什么是程序,什么是进程程序是静态的概念,如gcc xxx.c -o xxxx在磁盘中生成的文件。进程是程序的一次运行活动,一个程序跑起来了,可以说系统中多了一个进程。2.如何查看系统中有哪些进程?使用ps指令来查看,实际工作中,配合grep查看是否存在某一个进程。Ubuntu下面ps -aux。top指令,类似Windows的任务管理器。3.什么是进程标识符?每个进程都有一个非负整数的标识符pid,类似于进程的“身份证”。pid=0 交换进程(调度进程)pid=1 inti进程

2021-03-31 10:41:16 81 2

原创 Linux下向文件写入一个整数,写入一个结构体

文件操作之写入整数和结构体我们上一节修改了配置文件的内容,包括之前我们都是向文件写入一句话,或者读一句话,好像都是字符串的形式,那么文件是只能进行字符形式信息的输入输出吗?不是的,我们来仔细看一下write函数的原型。!我们可以看到write函数的第二个参数是一个无类型的指针类型,也就是说我们可以传很多种类型给它,只要它是一个指针类型,指针也就是地址嘛,那我们试一试把一个整数地址给它,看会发生什么。我们来编程:实战编程运行结果查看file3,可以看到这样的结果,那么说我们错了吗,不是的,

2021-03-31 09:59:22 716

空空如也

空空如也

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

TA关注的人

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