0%

1
2
3
4
QString date = "date -s \"2007-08-03 14:15:00\"" 
QProcess::startDetached(date);
QProcess::startDetached("hwclock -w"); // 同步系统时间
QProcess::startDetached("sync"); // 保存配置

ubuntu 重新加入已有网络

总共三步:

  1. 安装: curl -s https://install.zerotier.com | sudo bash
  2. 加入网络: sudo zerotier-cli join 你的network ID
  3. 最后一步一定不要忘,要去官网上授权:点击网络id,向下找到授权的部分,在前面打上勾。

显示当前系统时区

1
timedatectl

显示系统支持的时区列表

1
timedatectl list-timezones

设置时区

1
sudo timedatectl set-timezone Asia/Hong_Kong

Go语言笔记

参考:https://www.runoob.com/go/go-tutorial.html

数据类型

值类型是 int、float、string、bool、struct和array,直接存储值,分配栈的内存空间,被函数调用完之后会释放。

引用类型是 slice、map、chan和值类型对应的指针,存储是一个地址(指针),指针指向内存中真正存储数据的首地址,内存通常在堆分配,通过GC回收。

  1. new 与 make 的区别

new 的参数要求传入一个类型,而不是一个值,它会申请该类型的内存大小空间,并初始化为对应的零值,返回该指向类型空间的一个指针。

make 也用于内存分配,但它只用于引用对象 slice、map、channel的内存创建,返回的类型是类型本身。

基础语语法

  1. 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。

  2. 第一行代码 package main 定义包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。

  3. Go 语言的字符串可以通过 + 实现

  4. 常量定义:const identifier [type] = value

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import "fmt"

func main() {
const LENGTH int = 10
const WIDTH int = 5
var area int
const a, b, c = 1, false, "str" //多重赋值

area = LENGTH * WIDTH
fmt.Printf("面积为 : %d", area)
println()
println(a, b, c)
}
  1. iota,特殊常量,可以认为是一个可以被编译器修改的常量。iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。
  2. select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收。
    
  3. go 语言函数可以返回多个值。
  4. Go 语言切片是对数组的抽象。Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

接口

并发

包结构

  1. 权限: 所有成员在包内均可见,无论是不是在一个源码文件中。但只有首字母大写的为可导出成员,在包外可见。
  2. 源码必须使用UTF-8。
  3. 包内每个源文件都可以定义一个或多个初始化函数,但编译器不保证执行顺序。编译器先初始化全局变理,然后才开始执行初始化函数。最后才main.main入口函数。
  4. 内部包:所有保存在internal目录下的包(包含自身)仅能被其父目录下的包(包含所有层次的子目录)访问。

反射

测试

C语言版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

/**********************************************
* LOG DEFINE *
**********************************************/
// OFF FATAL ERROR WARN INFO DEBUG TRACE
// 0 1 2 3 4 5 6
#define OFF (0)
#define FATAL (1)
#define ERROR (2)
#define WARN (3)
#define INFO (4)
#define DEBUG (5)
#define TRACE (6)

#define LOG_LEVEL DEBUG


#define LOG(level, format, ...) \
if(LOG_LEVEL >= level) { \
fprintf(stderr, "[%s|%s@%s,%d] " format "\n", \
#level, __func__, __FILE__, __LINE__, ##__VA_ARGS__ ); \
}

通过QSS 去掉菜单前面的对勾。用颜色表示 checked 状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21


QMenu::item {
padding:8px 32px;/*设置菜单项文字上下和左右的内边距,效果就是菜单中的条目左右上下有了间隔*/
margin:0px 8px;/*设置菜单项的外边距*/
border-bottom:1px solid #DBDBDB;/*为菜单项之间添加横线间隔*/
padding-left:0px;
}

QMenu::item:selected { /* when user selects item using mouse or keyboard */
background-color: #00fff9;/*这一句是设置菜单项鼠标经过选中的样式*/
}

QMenu::item:checked { /* checked */
background-color: #ff0000;
}

QMenu::indicator { /* delete the default icon v */
image: none;
}

效果图:

![image-20201121110545903](QMenu 自定义样式/image-20201121110545903.png)

Win10 启用组策略

WIN+R 运行输入 gpedit.msc 发现找不到这个命令。在网上查了一下,说可能是因为自已用的Win10是家庭版,不支持这个功能。

发现用下面的方法可以手动安装。亲测好用。

1
2
3
4
5
6
7
8
9
10
11
12
13

@echo off

pushd "%~dp0"

dir /b %systemroot%\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >gp.txt

dir /b %systemroot%\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>gp.txt

for /f %%i in ('findstr /i . gp.txt 2^>nul') do dism /online /norestart /add-package:"%systemroot%\servicing\Packages\%%i"

pause

把上面的内容存到一个bat文件中。用管理员权限执行,就能自动安装。

然后就可以运行 gpedit.msc 了。

Win10 微软拼音双拼设置

Win10 微软拼音添加小鹤双拼

首先打开注册表,找到这个路径:

1
计算机\HKEY_CURRENT_USER\Software\Microsoft\InputMethod\Settings\CHS

然后新建一个名为 UserDefinedDoublePinyinScheme0的字符串值,数值数据为

1
小鹤双拼*2*^*iuvdjhcwfg^xmlnpbksqszxkrltvyovt

然后在设置中将默认的输入法设置为小鹤双拼。

微软拼音支持自定义时间格式

1
2
3
4
5
6
7
# 关键字需要用 %% 来包裹
yyyy 4 位年
MM 2 位月
dd 2 位日
HH 2 位小时(24 小时制)
mm 2 位分钟数
ss 2 位秒数

示例:

1
2
3
# 结果是这样的格式: 2020-02-07 12:36:52
# 具体的格式参看, 详见 ref
%yyyy%-%MM%-%dd% %HH%:%mm%:%ss%

概述

SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一种同步串行接口技术,是一种高速的,全双工,同步的通信总线。

优缺点

特点

  1. 高速、同步、全双工、非差分、总线式
  2. 主从机通信模式

优点

  1. 支持全双工通信
  2. 通信简单
  3. 数据传输速率块

缺点

  1. 没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据
  2. 可靠性上有一定的缺陷。

协议详解

它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。

  1. SDO/MOSI – 主设备数据输出,从设备数据输入;
  2. SDI/MISO – 主设备数据输入,从设备数据输出;
  3. SCLK – 时钟信号,由主设备产生;
  4. CS/SS – 从设备使能信号,由主设备控制。当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低或者是拉高。

mark

SPI通信有4种不同的模式,不同的从设备可能在出厂是就是配置为某种模式,这是不能改变的;但我们的通信双方必须是工作在同一模式下,所以我们可以对我们的主设备的SPI模式进行配置,通过CPOL(时钟极性)和CPHA(时钟相位)来控制我们主设备的通信模式,具体如下:

  1. Mode0:CPOL=0,CPHA=0
  2. Mode1:CPOL=0,CPHA=1
  3. Mode2:CPOL=1,CPHA=0
  4. Mode3:CPOL=1,CPHA=1

时钟极性CPOL是用来配置SCLK的电平出于哪种状态时是空闲态或者有效态,时钟相位CPHA是用来配置数据采样是在第几个边沿:

  1. CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时
  2. CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时
  3. CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿
  4. CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿

例如:

CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是
SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。

CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是
SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。

CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是
SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。

CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是
SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。

mark

mark

需要注意的是:我们的主设备能够控制时钟,因为我们的SPI通信并不像UART或者IIC通信
那样有专门的通信周期,有专门的通信起始信号,有专门的通信结束信号;所以我们的
SPI协议能够通过控制时钟信号线,当没有数据交流的时候我们的时钟线要么是
保持高电平要么是保持低电平。

协议对比

spi 与 iic

  1. iic总线不是全双工,2根线SCL SDA。spi总线实现全双工,4根线SCK CS MOSI MISO

  2. iic总线是多主机总线,通过SDA上的地址信息来锁定从设备。spi总线只有一个主设备,主设备通过CS片选来确定从设备

  3. iic总线传输速度在100kbps-4Mbps。spi总线传输速度更快,可以达到30MHZ以上。

  4. iic总线空闲状态下SDA SCL都是高电平。spi总线空闲状态MOSI MISO也都是 SCK是有CPOL决定的

  5. iic总线scl高电平时sda下降沿标志传输开始,上升沿标志传输结束。spi总线cs拉低标志传输开始,cs拉高标志传输结束

  6. iic总线是SCL高电平采样。spi总线因为是全双工,因此是沿采样,具体要根据CPHA决定。一般情况下master device是SCK的上升沿发送,下降沿采集

  7. iic总线和spi总线数据传输都是MSB在前,LSB在后(串口是LSB在前)

  8. iic总线和spi总线时钟都是由主设备产生,并且只在数据传输时发出时钟

  9. iic总线读写时序比较固定统一,设备驱动编写方便。spi总线不同从设备读写时序差别比较大,因此必须根据具体的设备datasheet来实现读写,相对复杂一些。

SPI、IIC、UART和CAN 使用场景对比

SPI 和I2C这两种通信方式都是短距离的,芯片和芯片之间或者其他元器件如传感器和芯片之间的通信。 SPI和IIC是板上通信,IIC有时也会做板间通信,不过距离甚短,不过超过一米,例如一些触摸屏,手机液晶屏那些薄膜排线很多用IIC,I2C能用于替代标准的并行总线,能连接的各种集成电路和功能模块。I2C是多主控总线,所以任何一个设备都能像主控器一样工作,并控制总线。总线上每一个设备都有一个独一无二的地址,根据设备它们自己的能力,它们可以作为发射器或接收器工作。多路微控制器能在同一个I2C总线上共存这两种线属于低速传输。

UART是应用于两个设备之间的通信,如用单片机做好的设备和计算机的通信。这样的通信可以做长距离的。UART速度比上面两者者快,最高达100K左右,用与计算机与设备或者计算机和计算之间通信,但有效范围不会很长,约10米左右,UART优点是支持面广,程序设计结构很简单,随着USB的发展,UART也逐渐走向下坡。

CAN使用场景完全不一样:

  1. CAN 通讯距离最大是10 公里(设速率为5Kbps),或最大通信速率为1Mbps(设通信距离为40 米)。
  2. CAN 总线上的节点数可达110 个。通信介质可在双绞线,同轴电缆,光纤中选择。
  3. CAN 采用非破坏性的总线仲裁技术,当多个节点同时发送数据时,优先级低的节点会主动退出发送,高优先级的节点可继续发送,节省总线仲裁时间。
  4. CAN 是多主方式工作,网上的任一节点均可在任意时刻主动地向网络上其他节点发送信息。
  5. CAN 采用报文识别符识别网络上的节点,从而把节点分成不同的优先级,高优先级的节点享有传送报文的优先权。报文是短帧结构,短的传送时间使其受干扰概率低,CAN 有很好的效验机制,这些都保证了CAN 通信的可靠性。