自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 问答 (8)
  • 收藏
  • 关注

原创 Linux网络开始收发包之前需要做的事情——创建ksoftirqd内核进程

linux内核收发数据报之前的准备工作

2023-02-06 14:29:33 824 1

原创 PCI总线、内核、PCI设备、驱动

当我们一台机器上有PCI设备时。分析这个PCI设备时如何被一步步用到的。首先,机器上电,系统启动并加载到内核初始化阶段,这时候内核就会对所有的PCI设备进行枚举和配置!枚举:所有的PCI设备都在PCI总线上,内核会从第一条总线(根总线)开始扫描,逐个枚举所有连接在PCI总线上的pci设备并记录,每个PCI设备都会有其配置空间,里面保存着设备的厂商ID,设备ID,IRQ,设备存储区信息等,枚举的最终目的就是将所有的PCI设备的这些信息都读出来并且保存在pci_dev(每个设备对应一个)结构体中。具体怎么

2022-01-11 18:52:28 707

原创 Centos8.3使用SSH登录 报错--拒绝连接所遇问题以及解决方法(serivice sshd start 启动失败)

1、确保自己已经安装好openssd-service,并且其配置文件是修改好的,这个百度一大堆;2、然后再试着开启SSH服务:service sshd start,我这边这里就报错按照提示systemctl status sshd.service 发现也看不出什么东西,3、然后sshd -t 查看具体报错原因,最后发现是配置文件149行那里的cipher 不对,然后使用ssh -Q cipher查看ssh的对称秘钥按着修改就行,改完之后再次再次启动SSH,发现还是报错,然后ssh -t查看发现配

2021-12-03 09:18:11 3794

原创 树莓派(python)与arduino串口通信

树莓派与arduino串口通信第一步:先设置硬件串口分配给GPIO串口输入sudo raspi-config命令进入树莓派系统配置界面,选择第三个Interfacing Options进去选择Serial Port然后选择关闭串口登录功能,打开硬件串口调试功能修改配置文件打开/boot/config.txt文件,输入 sudo vim /boot/config.txt,在最后添加俩行:1、dtoverlay=pi3-miniuart-bt 2、force_turbo=1然后重启树

2021-11-10 21:11:46 2036

原创 Linux系统中设置开机自动运行脚本程序

想要在Linux系统中设置开机运行脚本程序,只需要修改/etc/rc.local这个文件,因为其是初始化程序,Linux在启动时,会自动执行该初始化程序。首先第一步:sudo vim /etc/rc.local,进入到此文件中第二部:在exit 0 之前编写好我们想要执行的之类,比如说想要在pi用户下执行python.py程序则是cd /home/pisu pi -c "python /home/pi/test.py"我在树莓派中验证可以。如果在centos或者其他的,则不确定了,不过百度一查应

2021-11-08 20:56:18 1186

原创 树莓派系统安装opencv-python库(不用编译源码,超快)

树莓派3B,python有俩个版本,一个是2.7.,一个是3.7.第一步:我们烧录好系统之后,第一步是更换源:# 编辑 `/etc/apt/sources.list` 文件,删除原文件所有内容,用以下内容取代:deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpideb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/ras

2021-11-07 05:26:40 895

原创 详细的讲出在Linux系统中是如何读取文件的? 比如 /etc/passwd

此截图出自UNIX环境高级编程这本书;我自己也查找了一些资料,但感觉对文件系统结构的描述都不怎么全面、详细,所以我自己对文件系统的理解也没有到位。这里先提一个问题,目录项跟目录块是同一个东西?抛开上面那张图不讲,在Linux系统下,每个文件都会占用一个inode。在Linux系统下的ext2文件系统下新建一个新的目录的时候,会分配一个inode与至少一个block给该目录,。其中,inode会记录该目录的相关权限与属性并也记录分配到的block号码;而block则是记录在这个目录下的文件与该文件名占用.

2021-10-08 19:29:53 466

原创 Linux中测试其标准输入能否被设置位移量

/********************************************************************************* * Copyright: (C) 2021 li liangshi<[email protected]> * All rights reserved. * * Filename: lseek.c * Description: This file *

2021-10-06 08:17:45 68

原创 带头结点和不带头结点的尾插法单链表——包括插入以及遍历

为了准备笔试面试,重新复习了单链表系列的数据结构/********************************************************************************* * Copyright: (C) 2021 li liangshi<[email protected]> * All rights reserved. * * Filename: have_head.c *

2021-09-07 10:25:20 792

原创 使用mqtt.fx连接腾讯云IoT Cloud——超详细

目录1、安装客户端以及创建新的配置文件2、填写 Connection Profile 相关信息和 General 信息3、连接4、发布5、订阅MQTT.fx 是目前主流的 MQTT 桌面客户端,它支持 Windows、 Mac、Linux 操作系统,可以快速验证是否可与 IoT Cloud 进行连接,并发布或订阅消息1、安装客户端以及创建新的配置文件官方下载网站:http://mqttfx.jensd.de/index.php/download下载好之后打开客户端程序点击设置,进入设置画面,然后单击

2021-08-17 16:44:32 3633 2

原创 函数指针和指针函数

指针函数首先我们先来看一个普通的整型函数,声明为:int func(void);前面的int 是返回值类型,func是函数名,小括号里是参数,当然这里没传参数。理解了这里之后再看到我们的指针函数。指针函数从字面上来理解其本质是一个返回值是指针的函数,其声明的格式为:int *func(void);前面的int *是返回值类型,返回一个int *类型的指针,func是函数名,指针函数都是这样理解的。记得前面要加上星号才是它的返回值类型,比如上面的int *,而不是int ,要切记int *是

2021-08-16 22:42:44 91

原创 在Linux系统下使用zlog日志函数库——C语言

zlog是一个高可靠性、高性能、线程安全、灵活、概念清晰的纯C日志函数库。我们很多项目都会用到日志文件,一般用来记录代码运行情况。zlog日志函数库有中文使用手册:下载链接:https://pan.baidu.com/s/1s3Ox7MDOnWEYMQhx2xY2Eg提取码:et8t在手册里面有此库的下载链接下载库编译好之后在库目录下找到libzlog.so,和zlog.h文件,这俩个是我们编程的时候要用到的头文件和动态库文件[formats]simple1 = "%d %V [%p:%F:

2021-08-09 22:09:37 527

原创 Linux-配置文件ini解析实例——C语言

目录iniparser库作用及使用配置文件格式:ini配置文件实例ini文件解析实例 (aliyun_ini.c)iniparser库中的函数iniparser库作用及使用我们在Linux中做项目的时候一般都要用到配置文件,这样在源码中修改一些比如参数的时候我们就不用打开代码修改然后再重新编译,我们可以之间修改配置文件就行,我们项目发布出去之后用户也可以在看不到源码的情况下自己修改一些参数。我写的配置文件主要是保存连接上阿里云所需要的认证信息,然后解析的话用的是iniparser库,这个库是C语言in

2021-08-08 15:47:14 1885

原创 利用mosquitto库上报温度到阿里云——有完整项目源码

目录mosquitto库简介:使用到的mosquitto库提供的API使用到的cJSON库提供的API源码:mosquitto库简介:使用到的mosquitto库提供的API这里我只列出了我使用到的函数这里面的参数和返回值以及具体的用法我想大家百度就可以很容易知道了要了解更多可以参考:https://mosquitto.org/api/files/mosquitto-h.htmlmosquitto_lib_init() //Must be called before

2021-08-07 13:55:30 496

原创 Linux下C程序编程——sqlite3数据库

**SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎sqlite数据库提供了很多API供人们使用C程序编程来操作它。我觉得这里面要特别注意的一点是我们保存数据到数据库的时候,很多时候我们的数据发送过来是用一个变量保存着,并不是常量,而向sqlite数据库保存数据的时候是这样的:insert into table_name values(‘data1’,‘data2’,‘data3’…);可以看出每一

2021-08-03 10:23:56 247

原创 Linux socket编程--epoll --实例

epoll 是Linux 2.6内核提出的 ,可以理解其为select和poll的增强版优点:支持一个进程打开大数目的socket描述符(FD)IO效率不随FD数目增加而线性下降epoll还维护了一个双链表,用户存储发生的事件一颗红黑树,一张准备就绪句柄链表,少量的内核cache,就帮我们解决了大并发下的socket处理问题实例#include <stdio.h>#include <unistd.h>#include <string.h>#includ

2021-07-28 16:19:37 1192

转载 Linux socket通信细节补充

如图所示,其实每一个fd 在内核中都会有一个readbuff和write buff,在其通信的时候,是先把数据发到write 缓冲中(应用层),然后再到传输层····最后发到目的fd的read缓冲中,我们都知道,read系统调用是阻塞的,是因为一旦调用它的时候它的read缓冲要一直等待直到数据到来;在其通信的过程可能会出现TCP粘包这个问题,出现原因:(1)发送方原因TCP默认使用Nagle算法(主要作用:减少网络中报文段的数量),而Nagle算法主要做两件事:只有上一个分组得到确认,才会发送下.

2021-07-26 21:01:04 68

原创 Linux socket编程--poll多路复用

#include <stdio.h> 2 #include <unistd.h> 3 #include <string.h> 4 #include <arpa/inet.h> 5 #include <netinet/in.h> 6 #include <errno.h> 7 #include <sys/types.h> 8 #include <sys/socket.h> 9 #in.

2021-07-26 15:04:30 264

原创 Linux socket编程——select多路复用

select多路复用感觉比之前学的多进程多线程复杂多了不过还好最终还是理解了。这里做个笔记代码实现步骤:1、首先是socket初始化并返回监听套接字(文件描述符)函数,用到socket、bind、listen。int socket_init(void)2、然后第二步是先清理select函数监听的集合(一个文件描述符的集合),并把监听套接字加入到集合rdset中,因为一开始集合中只有监听套接字的文件描述符,所以最大值maxfd就是listenfd,但是我们要清楚,不管最大值是谁、是多大,selec

2021-07-25 21:15:10 563

原创 socket网络编程客户端和服务器端代码

服务器端代码 1 /*服务器端*/ 2 3 #include <stdio.h> 4 #include <unistd.h> 5 #include <string.h> 6 #include <arpa/inet.h> 7 #include <netinet/in.h> 8 #include <errno.h> 9 #include <sys/types.h> 10 #include &l

2021-07-20 22:01:37 410

原创 Linux下C语言实现获取指定目录下某个文件里面的数据

假如这个文件是在“/home/lls/APUE/ch2/tem/"这个目录下,以”28“开头命名的。内容是假如我们要获取2190这个数据。下面就是代码 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <assert.h

2021-07-17 20:44:59 676

原创 动态数组实现堆栈

动态数组的特点是程序在运行的时候才知道数组的长度。 9 void push(int datad); 10 void create_stack(int size); 11 void pop(void); 12 int top(void); 13 int empty(); 14 int full(); 15 void print(); 16 void destroy_stack();观察上面几个函数的名字就知道跟我之前写的静态数组实现堆栈其实实现起来差别不大,这里我记录一下这俩者之间的

2021-07-16 21:04:36 234

原创 静态数组实现堆栈

1、要使用静态数组实现堆栈,首先要先创建一个静态数组,数组的大小和下标都要声明,这里下标初始化为-1。 5 #define size 10 6 static int stack[size]; 7 static int top_element = -1;2、第二步,我们要想清楚这个逻辑:首先是如果堆栈还没满的情况下,则才可以压入元素,也就是先数组下标加1,然后压入的元素赋值给数组,下标是top_element;比如是是压入的第一个元素10,数组下标加1,则top_element=0,然后赋

2021-07-16 16:44:01 155

原创 C语言实现文件拷贝功能----open write read close lseek 系统调用

1 /*实现文件拷贝功能*/ 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <unistd.h> 6 #include <sys/stat.h> 7 #include <sys/types.h> 8 #include <fcntl...

2021-07-16 15:20:55 1307

原创 文件IO操作--系统调用open write read close--一个例子

新建一个文件夹,把hello world写进去,然后又读出来打印出来,最后关闭文件 1 #include <stdio.h> 2 #include <unistd.h> 3 #include <sys/stat.h> 4 #include <sys/types.h> 5 #include <fcntl.h> 6 #include <assert.h> 7 int main() 8 { 9

2021-07-16 14:48:12 88

原创 链式堆栈--代码实现

用链表来实现堆栈,用的是头插法,先进后出。1、把一个元素压入堆栈是通过在链表头部添加一个元素实现。先新建一个指针指向new_node要添加进来的元素,然后它要指向之前的第一个元素,并且指向第一个节点的指针要指向它void push (int data)2、弹出一个元素是通过删除链表头部第一个元素实现。我们要保证指向第一个元素的指针永远指向在第一个元素这个位置上的元素:head = first_node->next;,这个first_node是我们即将弹出的那个元素。void pop(void)

2021-07-15 09:32:11 270

原创 链式队列 || 循环队列--C语言实现

链式队列的思想是尾插法,先进先出。1、首先我们需要一个头节点//创建一个结构体表示节点typedef struct node_s { int data; struct node_s* next;}que;//创建头节点que* creat_head_node() { que* head = (que*)malloc(sizeof(que)); head->next = NULL; memset(head, 0, sizeof(que)); r

2021-07-15 09:06:47 346

原创 判断系统是大小端字节序--指针和联合体

第一种方法:指针 2 #include <stdio.h> 3 4 int main() 5 { 6 int a = 0x12345678; 7 char *p = (char *)&a; 8 9 if(*p == 0x78) 10 { 11 printf("小端字节序"); 12 } 13 else if(*p ==0x

2021-07-12 21:56:40 55

原创 c语言文件创建与拷贝的几个例子--fopen、strstr、fgets、fwrite

1、创建一个文件并向其写入字符串 1 #include <stdio.h> 2 3 int main() 4 { 5 FILE *fp; 6 char str[] = "ddd\ndhdhd\ndshf\ndhf\nHello\nniaho f f\ndiof\nfdhiohf\nfhf\nff\njf\ nfjf\nfjf\new\nw\n"; 7 fp = fopen("test.txt","w+"); 8

2021-07-11 21:13:25 242 3

原创 shell脚本实现创建多个用户

编写一个shell脚本,实现想要创建多少个用户就创建多少个用户实现这一代码需要解决的是:1、如何产生随机数做为密码查阅资料:Linux系统产生随机数的6种方法https://blog.51cto.com/baishuchao/19438152、如何实现一创建用户的同时也设置好了密码–可以使用管道查阅资料:利用管道实现sudo命令免输入密码的方法https://www.jb51.net/article/48570.htm3、如何控制创建多少个用户,这个就简单了,传个参数就去就行 1 #!/bi

2021-07-10 17:26:26 821

原创 shell脚本实现提取指定文件中的数据存放到另一文件中

从一个存放联系方式的文件提取某个人的联系方式并且输出重定向到另外一个文件中lianxi.txt这个文件是存放联系方式的文件,也就是我们要操作的文件下面这个程序意思是说从lianxi.txt这个文件中提取出含有王五这一行数据并且将它赋值给变量A,在打印输出的时候将变量A输出重定向到file1这个文件中 #!/bin/bash 2 grep 王五 lianxi.txt | while read A 3 do 4 5 echo $A > file1 6 done

2021-07-09 16:39:58 4386

原创 Qt工程打包和部署

之前按照教程用Qt仿写了一个串口调试助手。在串口编程的时候其实也很简单,我们要熟悉UART协议,知道串口的波特率、数据位、停止位、校验位、起始位以及停止位。写好这个串口调试助手之后,接下来就是要打包和部署了,打包和部署的步骤是:1、把工程切换到release模式,然后编译。 release模式:基本没有调试信息,debug模式:有很多调试信息。里面的三种模式我还没有完全理解2、添加图标,找一张后缀是ico的图片,放过工程所在目录,然后在工程文件新一行写入RC_ICONS=serial_iocn.i

2021-07-09 11:35:08 350

原创 SPI协议

SPI协议SPI简介寻址方式通信过程极性和相位I1C和SPI的异同SPI简介SPI总线SPI(Serial Peripheral Interface)是串行外设接口的缩写,SPI是一种高速的、全双工、同步的串行通信总线;SPI采用主从方式工作,一般有一个主设备和一个或多个从设备;SPI需要至少4根线,分别是MISO(主设备输入从设备输出)、MOSI(主设备输出从设备输入)、SCLK(时钟)、 CS(片选),SPI使用引脚较少且布线方便,所以越来越多的芯片集成了这种通信协议寻址方式当主设备要和某个

2021-07-08 00:00:46 255

原创 stm32f4-读取温湿度-使用IIC协议、定时器

任务:使用stm32f4单片机SHT30温湿度传感器的数据要求:按下按键1一次发送数据到串口调试助手一次要求其实很简单,只要一个if语句就可以实现,不过为了掌握定时器的使用,我这里加了一个独立看门狗按键1被按下,发送数据到串口调试助手的同时并且喂狗,按下按键1就是喂狗操作。我知道这样子有点多余,但是如果喂狗操作换成其他条件,比如发送数据寄存器空标志位时就喂狗,这样的话就可以防止程序跑飞了。这只是我个人的想法,第二个感觉有点问题,希望指正!感激不尽需要读取温湿度源码的可以评论区发邮箱。...

2021-07-07 17:56:15 417 1

原创 stm32f4——独立看门狗——库函数实现&&寄存器理解

一、首先是库函数实现第一步是对独立看门狗进行初始化,总共需要使用五个函数,分别如下1、IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对IWDG->PR IWDG->RLR的写2、IWDG_SetPrescaler(prer); //设置IWDG分频系数3、 IWDG_SetReload(rlr); //设置IWDG装载值4、IWDG_ReloadCounter(); //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器

2021-07-02 17:01:55 633 1

原创 中断学习——stm32f407按键控制LED灯

1、首先我们用到按键跟LED灯,所以找出对应的端口并且对其进行初始化```c//初始化LED端口,LED1对应PF9,LED2对应PF10void LED11_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟 //GPIOF9,F10初始化设置 GPIO_InitStructure.GPIO

2021-06-25 22:08:12 3782 4

原创 IIC协议

IIC协议1、I1C总线简介2、IIC总线通信过程3、IIC总线寻址方式4、IIC总线信号实现5、典型IIC时序1、I1C总线简介(1)110总线是Philips公司标题在八十年代初推出的一种串行、半双工总线主要用于近距离、低速的芯片之间的通信;110总线有两根双向的信号线一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时 钟的同步; IIC总线硬件结构简单,成本较低,因此在各个领域得到了广泛的应用。(2)IIC总线是一种多主机总线,连接在IIC总线上的器件分为主机和从机主机有权发起和结束一

2021-06-25 19:00:09 592

原创 RS232 485

RS232 485(一)UART存在的问题(二)RS232协议1、接口2、信号3、电平转换(三)RS232存在的问题(四)RS485协议1、信号2、接口3、电平转换(一)UART存在的问题1、电气接口不统一:UART只是对信号的时序进行了定义,而未定义接口的电气特性;2、UART通信时一般直接使用处理器使用的电平,即TTL电平,但不同的处理器使用的电平存在差异, 所以不同的处理器使用UART通信时一般不能直接相连;3、UART没有规定不同器件连接时连接器的标准, 所以不同器件之间通过UART通信

2021-06-24 23:24:06 90

原创 UART通信协议实践--stm32串口通信(一)

基于UART通信协议写的串口通信程序本文章只是写了stm32通过串口向上位机发送数据的程序,程序简单易懂,最适合刚学完UART协议的小伙伴练手。在开发环境和新建工程这个我就不罗嗦了,芯片是stm32f407ZG,可自行百度查找如何搭建开发环境和新建工程以下是usart.c和usart.h以及mian.c文件中的程序。usart.c文件#include "usart.h"void Usart1_Init(){ GPIO_InitTypeDef GPIO_InitStructure; US

2021-06-24 18:46:02 241

原创 UART通信协议

UART通信协议(一)一、定义二、基本概念了解三、串口通信原理(过程)四、UART控制器一、定义UART通常被称为通用异步收发器,是一种通用的串行、异步通信总线。该总线有俩条数据 线,可以实现全双工的发送和接受。在嵌入式系统中常用于主机与辅助设备之间的通信。二、基本概念了解1、串行与并行(1)并行通讯:同一时刻,可以传输多个bit位的信号,有多少个信号位就需要多少根数据线。(2)串行通讯:同一时刻,只能传输一个bit位的信号,只需要一根数据线。2、单工全双工以及半双工(1)单工:数据

2021-06-23 18:18:44 1997

空空如也

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

TA关注的人

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