【树莓派系列】树莓派wiringPi库详解,官方外设开发
树莓派wiringPi库详解,官方外设开发
文章目录
- 树莓派wiringPi库详解,官方外设开发
- 一、安装wiringPi库
- 二、wiringPi库API大全
- 1.硬件初始化函数
- 2.通用GPIO控制函数
- 3.时间控制函数
- 4.串口通信
- 串口API
- 串口通信配置
- 多串口通信配置
- 串口自发自收测试
- 串口间通信测试
- 测试代码
- 编译:
- 5.中断
- 6.多线程
- 7.软件PWM
- 引脚对照表
wiringPi是一个很棒的树莓派IO控制库,使用C语言开发,提供了丰富的接口:GPIO控制,中断,多线程,等等。
一、安装wiringPi库
有些树莓派镜像文件自带wiringPi库,所以无须安装,如果没有请自行参看下方安装
进入 wiringPi的github (https://git.drogon.net/?p=wiringPi;a=summary) 下载安装包。点击页面的第一个链接的右边的snapshot,下载安装压缩包。
然后进入安装包所在的目录执行以下命令:
tar xfz wiringPi-98bcb20.tar.gz //98bcb20为版本标号,可能不同
cd wiringPi-98bcb20
./build
查看是否安装了命令:
gpio -v查看引脚命令:
gpio readall
二、wiringPi库API大全
在使用wiringPi库时,你需要包含头文件 #include <wiringPi.h>。编译时都需要链接该库。
1.硬件初始化函数
使用wiringPi时,你必须在执行任何操作前初始化树莓派,否则程序不能正常工作。
可以调用下表函数之一进行初始化,它们都会返回一个int , 返回 -1 表示初始化失败。
| int wiringPiSetup (void) | 返回:执行状态,-1表示失败 | 当使用这个函数初始化树莓派引脚时,程序使用的是wiringPi 引脚编号表。引脚的编号为 0~16,需要root权限 |
|---|---|---|
| int wiringPiSetupGpio (void) | 返回执行状态,-1表示失败 | 当使用这个函数初始化树莓派引脚时,程序中使用的是BCM GPIO 引脚编号表,需要root权限 |
| wiringPiSetupPhys(void) | 不常用,不做介绍 | |
| wiringPiSetupSys (void) | 不常用,不做介绍 |
2.通用GPIO控制函数
| void pinMode (int pin, int mode) | pin:配置的引脚 mode:指定引脚的IO模式 可取的值:INPUT、OUTPUT、PWM_OUTPUT,GPIO_CLOCK | 作用:配置引脚的IO模式 注意: 只有wiringPi 引脚编号下的1脚(BCM下的18脚) 支持PWM输出 只有wiringPi编号下的7(BCM下的4号)支持GPIO_CLOCK输出 |
|---|---|---|
| void digitalWrite (int pin, int value) | pin:控制的引脚 value:引脚输出的电平值。 可取的值:HIGH,LOW分别代表高低电平 | 让对一个已近配置为输出模式的 引脚 输出指定的电平信号 |
| int digitalRead (int pin) | pin:读取的引脚 返回:引脚上的电平,可以是LOW HIGH 之一 | 读取一个引脚的电平值 LOW HIGH ,返回 |
| void analogWrite(int pin, int value) | pin:引脚 value:输出的模拟量 | 模拟量输出 树莓派的引脚本身是不支持AD转换的,也就是不能使用模拟量的API, 需要增加另外的模块 |
| int analogRead (int pin) | pin:引脚 返回:引脚上读取的模拟量 | 模拟量输入 树莓派的引脚本身是不支持AD转换的,也就是不能使用模拟量的API, 需要增加另外的模块 |
| void pwmWrite (int pin, int value) | pin:引脚 value:写入到PWM寄存器的值,范围在0~1024之间。 | 输出一个值到PWM寄存器,控制PWM输出。 pin只能是wiringPi 引脚编号下的1脚(BCM下的18脚) |
| void pullUpDnControl (int pin, int pud) | pin:引脚 pud:拉电阻模式 可取的值:PUD_OFF 不启用任何拉电阻。关闭拉电阻。 PUD_DOWN 启用下拉电阻,引脚电平拉到GND PUD_UP 启用上拉电阻,引脚电平拉到3.3v | 对一个设置IO模式为 INPUT 的输入引脚设置拉电阻模式。 与Arduino不同的是,树莓派支持的拉电阻模式更丰富。 树莓派内部的拉电阻达50K欧姆 |
3.时间控制函数
将执行流暂停 指定的微秒数(1000微秒 = 1毫秒 = 0.001秒)。
因为Linux本身是多线程的,所以实际暂停时间可能会长一些。参数是unsigned int 类型,最大延时时间可达71分钟
| unsigned int millis (void) | 这个函数返回 一个 从你的程序执行 wiringPiSetup 初始化函数(或者wiringPiSetupGpio ) 到 当前时间 经过的 毫秒数。 返回类型是unsigned int,最大可记录 大约49天的毫秒时长。 |
|---|---|
| unsigned int micros (void) | 这个函数返回 一个 从你的程序执行 wiringPiSetup 初始化函数(或者wiringPiSetupGpio ) 到 当前时间 经过的 微秒数。 返回类型是unsigned int,最大可记录 大约71分钟的时长。 |
| void delay (unsigned int howLong) | 将当前执行流暂停 指定的毫秒数。因为Linux本身是多线程的,所以实际暂停时间可能会长一些。参数是unsigned int 类型,最大延时时间可达49天 |
| void delayMicroseconds (unsigned int howLong) | 将执行流暂停 指定的微秒数(1000微秒 = 1毫秒 = 0.001秒)。 因为Linux本身是多线程的,所以实际暂停时间可能会长一些。参数是unsigned int 类型,最大延时时间可达71分钟 |
4.串口通信
串口API
使用时需要包含头文件:#include <wiringSerial.h>
这个是Linux下的标准IO库函数,需要包含头文件#include <unistd.h>
当要接收的数据量过大时,wiringPi建议使用这个函数。
| int serialOpen (char *device, int baud) | device:串口的地址,在Linux中就是设备所在的目录。 默认一般是"/dev/ttyAMA0",我的是这样的。 baud:波特率 返回:正常返回文件描述符,否则返回-1失败。 | 打开并初始串口 |
|---|---|---|
| void serialClose (int fd) | fd:文件描述符 | 关闭fd关联的串口 |
| void serialPutchar (int fd, unsigned char c) | fd:文件描述符 c:要发送的数据 | 发送一个字节的数据到串口 |
| void serialPuts (int fd, char *s) | fd:文件描述符 s:发送的字符串,字符串要以’\0’结尾 | 发送一个字符串到串口 |
| void serialPrintf (int fd, char *message, …) | fd:文件描述符 message:格式化的字符串 | 像使用C语言中的printf一样发送数据到串口 |
| int serialDataAvail (int fd) | fd:文件描述符 返回:串口缓存中已经接收的,可读取的字节数,-1代表错误 | 获取串口缓存中可用的字节数。 |
| int serialGetchar (int fd) | fd:文件描述符 返回:读取到的字符 | 从串口读取一个字节数据返回。 如果串口缓存中没有可用的数据,则会等待10秒,如果10后还有没,返回-1 所以,在读取前,做好通过serialDataAvail判断下。 |
| void serialFlush (int fd) | fd:文件描述符 | 刷新,清空串口缓冲中的所有可用的数据。 |
| *size_t write (int fd,const void * buf,size_t count) | fd:文件描述符 buf:需要发送的数据缓存数组 count:发送buf中的前count个字节数据 返回:实际写入的字符数,错误返回-1 | 这个是Linux下的标准IO库函数,需要包含头文件#include <unistd.h> 当要发送到的数据量过大时,wiringPi建议使用这个函数。 |
| *size_t read(int fd,void * buf ,size_t count); | fd:文件描述符 buf:接受的数据缓存的数组 count:接收的字节数. 返回:实际读取的字符数。 | 这个是Linux下的标准IO库函数,需要包含头文件#include <unistd.h> 当要接收的数据量过大时,wiringPi建议使用这个函数。 |
串口通信配置
也就是将调试接口修改为通信接口,同时也要关闭蓝牙功能。(仅供了解,推荐使用下面的多串口)
注意,目前搜到的大多数描述树莓派 4 串口的文章,大多数开头都是禁用下蓝牙,这个做法针对树莓派0-3 是必须的,因为本身串口不够用,但对树莓派 4 来说并不需要,因为有额外 4 个串口可以利用,默认配置好的两串口一个用于蓝牙(UART0)另一个是 miniUART 可以保留设置。此方面的文章大多都是一个流程,原因是参考的最初版本是树莓派 3 的设置;树莓派 4 的额外串口设置可以参考下面的多串口通信配置。
/* 修改 cmdline.txt文件 */
>cd /boot
>sudo vim cmdline.txt删除【】之间的部分
dwc_otg.lpm_enable=0 【console=ttyAMA0,115200】 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
/*下列代码由于不同的固件库可能没有,则不用修改*,如果没有,完成上述之后重启即可/
/*修改 inittab文件 */
>cd /etc/
>sudo vim inittab注释掉最后一行内容:,在前面加上 # 号
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100//重启
sudo reboot
树莓派的串口是设备名是:ttyAMA0
多串口通信配置
串口1:/dev/ttyS0 mini串口:mini串口的时钟源由cpu提供,会随主频的变化而变化,通信不稳定,但可以通过固定CPU主频来稳定通信。(很麻烦)
串口0:/dev/ttyAMA0 硬件串口有独立的时钟源,通信稳定,但默认分配成了蓝牙功能。可以通过禁用蓝牙等操作来使用这个串口。
- 展示所有串口命令
dtoverlay -a | grep uart
展示 pi4 中所有串口
pi@pi:~ $ dtoverlay -a | grep uartmidi-uart0midi-uart1midi-uart2midi-uart3midi-uart4midi-uart5miniuart-btqca7000-uart0uart0uart1uart2uart3uart4uart5
- 查看特定串口信息
dtoverlay -h uart2
pi@raspberrypi:~ $ dtoverlay -h uart2
Name: uart2
Info: Enable uart 2 on GPIOs 0-3
Usage: dtoverlay=uart2,<param>
Params: ctsrts Enable CTS/RTS on GPIOs 2-3 (default off)
相关信息会展现 GPIOs 与新的 UART 串口的分配:0-3 对应 UART2, 4-7 对应 UART3,8-11 对应 UART 4,以及 12-15 对应 GUIO 5
| 树莓派0、1、2、3 | UART0(PL011) UART1(mini UART) | 由于本身串口不够用,故需要禁用下蓝牙 (默认配置好的两串口一个用于蓝牙(UART0)另一个是miniUART) |
|---|---|---|
| 树莓派4B | UART0(PL011) UART1(mini UART) UART2(PL011) UART3(PL011) UART4(PL011) UART5(PL011) | 对树莓派4B来说并不需要,因为有额外 4 个串口可以利用。 |
3. 配置开启串口 UART2-5
sudo vi /boot/firmware/config.txt或者:具体看目录下有哪个
sudo vi /boot/config.txt
在结尾添加:
dtoverlay=uart2
dtoverlay=uart3
dtoverlay=uart4
dtoverlay=uart5
重启后查看是否生效:
ls /dev/ttyAMA*
观察到:
pi@pi:~ $ ls /dev/ttyAMA*
/dev/ttyAMA2 /dev/ttyAMA3 /dev/ttyAMA4 /dev/ttyAMA5
下面给出各 UART 串口与 GPIO 对应关系,一般使用建议UART2-5。
| 引脚号为wiringPi编码 | TX | RX | 所指向的设备节点 |
|---|---|---|---|
| UART0 | 15 | 16 | -> ttyAMA0 |
| UART2 | 30 | 31 | -> ttyAMA1 |
| UART3 | 7 | 21 | -> ttyAMA2 |
| UART4 | 10 | 13 | -> ttyAMA3 |
| UART5 | 26 | 23 | -> ttyAMA4 |
注:UART0 对应的 ttyAMA0,UART1 对应的 ttyS0,UART2 到 UART5 对应的 ttyAMA1 到 ttyAMA4。
串口自发自收测试
现在我们先测试 UART2 是否启用成功,比较简单的测试方式是将其 TXD 和 RXD 相连,自发自收。
根据上方对应关系,UART2 对应 TXD2 和 RXD2,对应 30和 31,对应 ttyAMA1
如果跟下方一样就证明已经开启
pi@raspberrypi:~ $ python3
Python 3.7.3 (default, Jul 25 2020, 13:03:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial
>>> ted = serial.Serial(port="/dev/ttyAMA1", baudrate=9600)
>>> ted.write("Hello World".encode("gbk"))
11
>>> ted.read(11)
b'Hello World'
>>>

同理也可以测试其他的串口
pi@raspberrypi:~ $ python3 Python 3.7.3 (default, Jul 25 2020, 13:03:44) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import serial >>> ted = serial.Serial(port="/dev/ttyAMA1", baudrate=9600) >>> ted.write("Hello World".encode("gbk")) 11 >>> ted.read(11) b'Hello World' >>> ted3 = serial.Serial(port="/dev/ttyAMA2", baudrate=9600) >>> ted3.write("Hello No.3".encode("gbk")) 10 >>> ted3.read(10) b'Hello No.3' >>> ted4 = serial.Serial(port="/dev/ttyAMA3", baudrate=9600) >>> ted4.write("Hello No.4".encode("gbk")) 10 >>> ted4.read(10) b'Hello No.4' >>> ted5 = serial.Serial(port="/dev/ttyAMA4", baudrate=9600) >>> ted5.write("Hello No.5".encode("gbk")) 10 >>> ted5.read(10) b'Hello No.5' >>>
串口间通信测试
测试 UART2 和 UART3 间的通信
| wiringPi编码 | ||
|---|---|---|
| UART2 | TXD2 (30) | RXD2 (31) |
| UART3 | RXD3 (21) | TXD3 (7) |
pi@raspberrypi:~ $ python3
Python 3.7.3 (default, Jul 25 2020, 13:03:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial
>>> ted = serial.Serial(port="/dev/ttyAMA1", baudrate=9600)
>>> ted3 = serial.Serial(port="/dev/ttyAMA2", baudrate=9600)
>>> ted.write("Msg from UART2...".encode("gbk"))
17
>>> ted3.read(17)
b'Msg from UART2...'
>>> ted3.write("Msg from UART3...".encode("gbk"))
17
>>> ted.read(17)
b'Msg from UART3...'
>>>
OK 挺顺利,UART2 和 UART3 间通信正常。
测试代码
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{int fd; char cmd;char *str;str=(char*)malloc(1024);fd=serialOpen("/dev/ttyAMA1",115200); //打开并初始串口if(fd == -1){printf("uart error\n");}if(wiringPiSetup() == -1){ //初始化树莓派引脚printf("init wiringPi error!\n");return -1;}while(1){// serialPutchar(fd,'c');// serialPuts(fd,"aaaaaaaaa\r\n");while(serialDataAvail(fd)<=0); //获取串口缓存中可用的字节数cmd = serialGetchar(fd); //从串口读取一个字节数据返回// memset(str,0,1024);// sprintf(str,"get cmd:%c\r\n",cmd);// serialPuts(fd,str); //发送一个字符串到串口printf("get data:cmd=%c\n",cmd);serialPrintf (fd, "get cmd:%c\r\n", cmd); //发送数据到串口if(cmd=='q'){serialPuts(fd,"quit\r\n");printf("quit\n");break;}// delayMicroseconds(1000000);}free(str);serialClose(fd); //关闭fd关联的串口return 0;
}
编译:
gcc demo.c -lwiringPi
5.中断
很少使用
6.多线程
使用linux C库里面的多线程
7.软件PWM
树莓派硬件上支持的PWM输出的引脚有限,为了突破这个限制,wiringPi提供了软件实现的PWM输出API。
需要包含头文件:#include <softPwm.h>
编译时需要添pthread库链接 -lpthread
pin:用来作为软件PWM输出的引脚
initalValue:引脚输出的初始值
pwmRange:PWM值的范围上限
建议使用100.
返回:0表示成功。
| int softPwmCreate (int pin, int initialValue, int pwmRange) | pin:用来作为软件PWM输出的引脚 initalValue:引脚输出的初始值 pwmRange:PWM值的范围上限 建议使用100. 返回:0表示成功。 |
|---|
使用一个指定的pin引脚创建一个模拟的PWM输出引脚 void softPwmWrite (int pin, int value)
pin:通过softPwmCreate创建的引脚
value:PWM引脚输出的值
更新引脚输出的PWM值
其他
https://www.cnblogs.com/lulipro/p/5992172.html
引脚对照表

相关文章:
【树莓派系列】树莓派wiringPi库详解,官方外设开发
树莓派wiringPi库详解,官方外设开发 文章目录 树莓派wiringPi库详解,官方外设开发一、安装wiringPi库二、wiringPi库API大全1.硬件初始化函数2.通用GPIO控制函数3.时间控制函数4.串口通信串口API串口通信配置多串口通信配置串口自发自收测试串口间通信测…...
前端模块化CommonJs、ESM、AMD总结
前端开发模式进化史 前端工程化正是为了应对这些演化中出现的挑战和需求而发展起来的: 前后端混合:服务端渲染,javascript仅实现交互前后端分离:借助 ajax 实现前后端分离、单页应用(SPA)等新模式模块化开发:npm 管理…...
JavaWeb - 8 - 请求响应 分层解耦
请求响应 请求(HttpServletRequest):获取请求数据 响应(HttpServletResponse):设置响应数据 BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程…...
1G,2G,3G,4G,5G各代通信技术的关键技术,联系和区别
目录 1G2G3G4G5G各代通信技术的联系和区别联系区别 1G 1G的主要特点是无线移动化。关键技术为蜂窝组网,支持频率复用和移动切换,可以实现个人和个人移动状态下不间断的语音通信。 1G通信系统现已关闭,其主要缺点是串好和盗号。 2G 数字化…...
【宽搜】2. leetcode 102 二叉树的层序遍历
题目描述 题目链接:二叉树的层序遍历 根据上一篇文章的模板可以直接写代码,需要改变的就是将N叉树的child改为二叉树的left和right。 代码 class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector&…...
Go语言实现长连接并发框架 - 请求分发器
文章目录 前言接口结构体接口实现项目地址最后 前言 你好,我是醉墨居士,我们上篇博客实现了任务管理器的功能,接下来这篇博客我们将要实现请求分发模块的开发 接口 trait/dispatcher.go type Dispatcher interface {Start()Dispatch(conn…...
Redis: 集群测试和集群原理
集群测试 1 ) SET/GET 命令 测试 set 和 get 因为其他命令也基本相似,我们在 101 节点上尝试连接 103 $ /usr/local/redis/bin/redis-cli -c -a 123456 -h 192.168.10.103 -p 6376我们在插入或读取一个 key的时候,会对这个key做一个hash运算,…...
问题解决实录 | bash 中 tmux 颜色显示不全
点我进入博客 如下图,tmux 中颜色显示不全: echo $TERM输出的是 screen 但在 bash 里面输出的是 xterm-256 color 在 bash 里面输入: touch ~/.tmux.conf vim ~/.tmux.conf set -g default-terminal "xterm-256color"使之生效 source …...
古典舞在线交流平台:SpringBoot设计与实现详解
摘 要 随着互联网技术的发展,各类网站应运而生,网站具有新颖、展现全面的特点。因此,为了满足用户古典舞在线交流的需求,特开发了本古典舞在线交流平台。 本古典舞在线交流平台应用Java技术,MYSQL数据库存储数据&#…...
五子棋双人对战项目(6)——对战模块(解读代码)
目录 一、约定前后端交互接口的参数 1、房间准备就绪 (1)配置 websocket 连接路径 (2)构造 游戏就绪 的 响应对象 2、“落子” 的请求和响应 (1)“落子” 请求对象 (2)“落子…...
查缺补漏----I/O中断处理过程
中断优先级包括响应优先级和处理优先级,响应优先级由硬件线路或查询程序的查询顺序决定,不可动态改变。处理优先级可利用中断屏蔽技术动态调整,以实现多重中断。下面来看他们如何运用在中断处理过程中: 中断控制器位于CPU和外设之…...
Java API接口开发规范
文章目录 一、命名规范1.1 接口命名1.2 变量命名 二、接收参数规范2.1 请求体(Body)2.2 查询参数(Query Parameters) 三、参数检验四、接收方式规范五、异常类处理六、统一返回格式的定义七、API接口的幂等性(Idempote…...
Go语言实现长连接并发框架 - 任务管理器
文章目录 前言接口结构体接口实现项目地址最后 前言 你好,我是醉墨居士,我们上篇博客实现了路由分组的功能,接下来这篇博客我们将要实现任务管理模块 接口 trait/task_mgr.go type TaskMgr interface {RouterGroupStart()StartWorker(tas…...
【大数据】深入解析分布式数据库:架构、技术与未来
目录 1. 分布式数据库的定义2. 架构类型2.1 主从架构2.2 同步与异步复制2.3 分片架构 3. 技术实现3.1 一致性模型3.2 CAP理论3.3 数据存储引擎 4. 应用场景5. 选择分布式数据库的因素5.1 数据一致性需求5.2 读写负载5.3 成本5.4 技术栈兼容性 6. 未来发展趋势总结 分布式数据库…...
uniapp框架中实现文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间
前言 uni-file-picker是uniapp中的一个文件选择器组件,用于选择本地文件并返回选择的文件路径或文件信息。该组件支持选择单个文件或多个文件,可以设置文件的类型、大小限制,并且可以进行文件预览。 提示:以下是本篇文章正文内容,下面案例可供参考 uni-file-picker组件具…...
GEE教程:NASA/GRACE/MASS_GRIDS/LAND数据的查看不同时期液态水数据的变化情况
目录 简介 NASA/GRACE/MASS_GRIDS/LAND 函数 first() Arguments: Returns: Image 代码 结果 简介 利用NASA/GRACE/MASS_GRIDS/LAND数据的查看不同时期液态水数据的变化情况。 NASA/GRACE/MASS_GRIDS/LAND NASA/GRACE/MASS_GRIDS/LAND数据是由NASA的重力恒星MASS数据…...
世邦通信股份有限公司IP网络对讲广播系统RCE
漏洞描述 SPON世邦IP网络广播系统采用的IPAudio™技术, 将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输的双向音频扩声系统。传统广播系统存在的音质不佳,传输距离有限,缺乏互动等问题。该系统设备使用简便,…...
爬虫——爬取小音乐网站
爬虫有几部分功能??? 1.发请求,获得网页源码 #1.和2是在一步的 发请求成功了之后就能直接获得网页源码 2.解析我们想要的数据 3.按照需求保存 注意:开始爬虫前,需要给其封装 headers {User-…...
5G NR SSB简介
文章目录 SSB介绍SSB波束扫描 SSB介绍 5G NR 引入了SSB 这个概念,同步信号和PBCH块(Synchronization Signal and PBCH block, 简称SSB) 它由主同步信号(Primary Synchronization Signals, 简称PSS)、辅同步信号(Secondary Synchronization Signals, 简称SSS)、PBCH…...
java将mysql表结构写入到word表格中
文章目录 需要的依赖 需要的依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version> </dependency> <!--07版本的,行数不受限制--> <dependency>&l…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...
WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
深度解析:etcd 在 Milvus 向量数据库中的关键作用
目录 🚀 深度解析:etcd 在 Milvus 向量数据库中的关键作用 💡 什么是 etcd? 🧠 Milvus 架构简介 📦 etcd 在 Milvus 中的核心作用 🔧 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...
