使用F1C200S从零制作掌机之I2C传感器

news2024/9/22 5:21:17

访问I2C设备(比如eeprom),我知道的有三总方法:

(一)i2c-dev操作I2C设备:不用添加设备驱动,用户直接在应用层完成对具体I2C 设备的驱动工作。

(二)sysfs操作I2C设备:需添加设备驱动,通过sys展示出来的文件操作设备(比如/sys/devices/platform/s3c2440-i2c/i2c-0/0-0050/eeprom)

(三)设备节点操作i2C设备:添加设备驱动,为设备驱动创建设备节点,从/dev访问I2C设备(比如/dev/eeprom)

原文链接:https://blog.csdn.net/wuxiwang/article/details/140118183

一 OLED 12880(SH1107)

模组链接:https://item.taobao.com/item.htm?spm=a1z09.2.0.0.512d2e8dkifnvI&id=674600863020&_u=tom5bln21f7

模组资料:https://pan.baidu.com/s/17XWkG6xXvj94V_DfXcro8Q 1217

内核支持fb_sh1106.c,所以这里尝试按照去改fb_sh1106.c去适配fb_sh1107.c。

1.1 sh1106和sh1107的区别?

支持的分辨率不一样。

2.1 模块原理图

image-20240801204420796

2.2 供电

5v供电。

2.3 接线

模块引脚F1C200S
VCC5V
GNDGND
SDATWI0_SDA/PD0
SCLTWI0_SCK/PD12

2.4 测试

image-20240801205001343

sh1107_app.sh

i2cset -y 0 0x3c 0x00 0xAE
i2cset -y 0 0x3c 0x00 0xDC
i2cset -y 0 0x3c 0x00 0x00
i2cset -y 0 0x3c 0x00 0x20
i2cset -y 0 0x3c 0x00 0x81
i2cset -y 0 0x3c 0x00 0x80
i2cset -y 0 0x3c 0x00 0xA0
i2cset -y 0 0x3c 0x00 0xA4
i2cset -y 0 0x3c 0x00 0xA6
i2cset -y 0 0x3c 0x00 0xC0
i2cset -y 0 0x3c 0x00 0xA8
i2cset -y 0 0x3c 0x00 0x7F
i2cset -y 0 0x3c 0x00 0xD5
i2cset -y 0 0x3c 0x00 0x50
i2cset -y 0 0x3c 0x00 0xD3
i2cset -y 0 0x3c 0x00 0x00
i2cset -y 0 0x3c 0x00 0xDB
i2cset -y 0 0x3c 0x00 0x37
i2cset -y 0 0x3c 0x00 0xD9
i2cset -y 0 0x3c 0x00 0x22
i2cset -y 0 0x3c 0x00 0xaf

# 清屏
for i in {0..15}
do
        v=$((0xb0+i))
        i2cset -y 0 0x3c 0x00 $v
        i2cset -y 0 0x3c 0x00 0x11
        i2cset -y 0 0x3c 0x00 0x08

        for i in {0..79}
        do
                i2cset -y 0 0x3c 0x40 0xff
        done
done

# 黑屏
for i in {0..15}
do
        v=$((0xb0+i))
        i2cset -y 0 0x3c 0x00 $v
        i2cset -y 0 0x3c 0x00 0x11
        i2cset -y 0 0x3c 0x00 0x08

        for i in {0..79}
        do
                i2cset -y 0 0x3c 0x40 0x00
        done
done

二 温湿度传感器(SHT35)

内核已持支持的hwmon设备,查看https://www.kernel.org/doc/html/latest/hwmon/index.html

linux内核已自带的sht3x驱动,但是该驱动不支持设备树。

2.1 模块供电

image-20240730134143955

2.2 硬件接线

模块引脚F1C200S
VCC3.3V
GNDGND
SDATWI0_SDA/PD0
SCLTWI0_SCK/PD12

2.3 内核配置

image-20240731085608439

2.4 设备树

与之前保持一致。支持i2c0。

2.5 驱动

内核自带驱动增加调试代码。

vim driver/hwmon/sht3x.c
static int sht3x_probe(struct i2c_client *client,
		       const struct i2c_device_id *id)
{
	......

	// 在驱动匹配成功之后,会打印
	printk("sht3x_probe\r\n");
}

编译

sudo cp driver/hwmon/sht3x.ko /media/wang/rootfs/lib/modules/5.4.99

2.6 设备信息

sht35_device.c

#include <linux/types.h> 
#include <linux/kernel.h> 
#include <linux/module.h> 
#include <linux/errno.h> 
#include <linux/device.h> 
#include <linux/platform_device.h> 
#include <linux/i2c.h>

static struct i2c_board_info sht3x_i2c_board_info __initdata = {
	I2C_BOARD_INFO("sht3x", 0x44),
};

static int __init sht3x_init(void)
{
	int ret = 0;
	struct i2c_adapter *adapter;
	printk("sht3x_init\r\n");
	adapter = i2c_get_adapter(0);
	i2c_new_client_device(adapter, &sht3x_i2c_board_info);
	return ret;
}

static void __exit sht3x_exit(void) 
{ 
	
}
 
module_init(sht3x_init); 
module_exit(sht3x_exit); 
MODULE_LICENSE("GPL"); 
MODULE_AUTHOR("wangxinchen");

Makefile

ifneq ($(KERNELRELEASE),)
#kbuild syntax. dependency relationshsip of files and target modules are listed here.
obj-m := sht35_device.o
else
PWD:= $(shell pwd)

KDIR := /home/wang/workplace/code/linux-5.4.99
all:
	$(MAKE) -C $(KDIR) M=$(PWD) modules
	rm -rf .*.cmd *.o *.mod.c  .tmp_versions *.mod *.symvers *.order
clean:
	rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions *.mod *.symvers *.order
endif

编译

make
sudo cp sht35_device.ko /media/wang/rootfs/lib/modules/5.4.99

2.7 测试

insmod /lib/modules/5.4.99/sht35_device.ko
insmod /lib/modules/5.4.99/sht3x.ko
ls /sys/class/hwmon/
ls /sys/class/hwmon/hwmon0
cat /sys/class/hwmon/hwmon0/temp1_input
cat /sys/class/hwmon/hwmon0/humidity1_input

2.8 应用程序

sht35_app.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    FILE *temp_file, *humi_file;
    int temperature, humidity;
    char buf[64];

    while(1){
	temp_file = fopen("/sys/class/hwmon/hwmon0/temp1_input", "r");
	if (temp_file == NULL) {
	    perror("Error opening file");
	    return EXIT_FAILURE;
	}
	humi_file = fopen("/sys/class/hwmon/hwmon0/humidity1_input", "r");
	if (temp_file == NULL) {
	    perror("Error opening file");
	    return EXIT_FAILURE;
	}

        // 读取温度值
        if (fgets(buf, sizeof(buf), temp_file) != NULL) {
            temperature = atoi(buf);
            printf("Temperature: %.3f C   ", (float)temperature / 1000); // 温度通常以毫摄氏度为单位
        }

        // 读取湿度
        if (fgets(buf, sizeof(buf), humi_file) != NULL) {
            humidity = atoi(buf);
            printf("Humidity: %.3f C\n", (float)humidity / 1000); // 温度通常以毫摄氏度为单位
        }

	fclose(temp_file);
	fclose(humi_file);
		
	//sleep(1);
	usleep(100000);  //100ms
    }

    return EXIT_SUCCESS;
}

需要放在移植的debian系统下编译。

gcc sht35_app.c -o sht35_app

导入开发板测试

创建I2C设备:
echo sht3x 0x44 > /sys/bus/i2c/devices/i2c-0/new_device
加载驱动
insmod /lib/modules/5.4.99/sht3x.ko
测试程序
./sht35_app
删除I2C设备:
echo 0x44 > /sys/bus/i2c/devices/i2c-0/delete_device

2.9 参考

https://blog.csdn.net/u014754841/article/details/132580947

https://blog.csdn.net/lihui126/article/details/45723017

三 气体传感器(SGP30)

3.1 供电

image-20240730150215641

3.2 模块原理图

image-20240731100210054

3.3 接线

模块F1C200S
VCC3.3V
GNDGND
SDATWI0_SDA/PD0
SCLTWI0_SCK/PD12

3.4 内核配置

image-20240730110226641

image-20240801132706682

3.5 设备树

	gas@58 {
		compatible = "sensirion,sgp30";
		reg = <0x58>;
		status = "okay";
	};

3.6 驱动

编译成模块,手动加载便于调试。

内核自带驱动使用了IIO子系统。

IIO 驱动框架提供了 sysfs 接口,因此加载成功以后我们可以在用户空间访问对应的 sysfs 目录项,进入目录“/sys/bus/iio/devices/”目录里面,此目录下都是 IIO 框架设备。

GP30主要是对空气质量进行检测,TVOC是一项重要指标,指总可挥发有机物气体。一般我们可以用它来反映甲醛的浓度!

SGP30气体传感器使用了MOS技术和电化学技术来检测VOC分子的浓度,并使用红外线吸收技术来检测CO2浓度。

sudo cp drivers/iio/chemical/sgp30.ko /media/wang/rootfs/lib/modules/5.4.99/

3.7 测试

image-20240804145744424

insmod /lib/modules/5.4.99/sgp30.ko
驱动加载成功,在目录/sys/bus/iio/devices下可看到设备
ls /sys/bus/iio/devices
cat /sys/bus/iio/devices/iio\:device0/in_concentration_co2_input
cat /sys/bus/iio/devices/iio\:device0/in_concentration_voc_input

单位换算

在SGP30的测量中,‌二氧化碳(‌CO2)‌的浓度单位是ppm(‌parts per million)‌,‌而挥发性有机化合物(‌VOC)‌的浓度单位是ppb(‌parts per billion)‌。‌

二氧化碳浓度标准:多少PPM对人体有危害?

image-20240804150941117

PPM: 气体浓度的100万分之一。※1%=10000ppm

PPB: 气体浓度的10亿分之一。※1ppm=1000ppb

image-20240804151645907

image-20240804155435475

这里读出来的结果:

0.000756 转换为 PPM --> 0.000756*1000000 = 756PPM

0.000000120 转换为 PPB --> 0.000000120*1000000000 = 120PPB = 0.12PPM

PPB转换为mg/L的公式是:‌1 ppb = 1 μg/L = 0.001 mg/L。‌

PPM转换为mg/L的公式是:‌1 ppm = 1 mg/L。

在室内空气中,‌VOC检测值的正常范围根据国家相关标准,‌一般在0-500μg/m³之间。‌

https://teesing.com/en/tools/ppm-mg3-converter

VOC 应小于0.5mg/m³(0.155 ppm)

二氧化碳浓度含量与人体的生理反应:

​ 1、350~450ppm,同一般室外环境;

​ 2、350~1000ppm,空气清新,呼吸顺畅;

​ 3、1000~2000ppm,感觉空气浑浊,并开始觉得昏昏欲睡。

3.8 应用程序

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

/*
	加载驱动
	insmod /lib/modules/5.4.99/sgp30.ko
	匹配成功目录/sys/bus/iio/devices下会有设备。
	
	VOC 应小于0.5mg/m³(0.155 ppm)
	
*/

int main() {
    FILE *voc_file, *co2_file;
    float voc_raw, co2_raw;
    char buf[64];

    while(1){
		voc_file = fopen("/sys/bus/iio/devices/iio\:device0/in_concentration_voc_input", "r");
		if (voc_file == NULL) {
			perror("Error opening file");
			return EXIT_FAILURE;
		}
		co2_file = fopen("/sys/bus/iio/devices/iio\:device0/in_concentration_co2_input", "r");
		if (co2_file == NULL) {
			perror("Error opening file");
			return EXIT_FAILURE;
		}

        if (fgets(buf, sizeof(buf), voc_file) != NULL) {
            voc_raw = atof(buf)*1000000000; // 单位PPB
        }
        if (fgets(buf, sizeof(buf), co2_file) != NULL) {
            co2_raw = atof(buf)*1000000; // 单位PPM
        }
        
        // 1PPM=1000PPB
        // 1PPB=1/1000PPM
        // voc Molecular Weight 78.9516 g/mol
        // 0.0409 x (ppm) x 78.9516 = 69.652
        
		printf("voc_mg:%.2f mg/m³ co2_ppm: %d\r\n", voc_raw/1000*0.0409*78.9516, (int)(co2_raw));
		
		fclose(voc_file);
		fclose(co2_file);
		
		//sleep(1);
		usleep(100000);  //100ms
    }

    return EXIT_SUCCESS;
}

四 加速度传感器(ADXL345)

4.1 模块原理图

image-20240730133720283

支持I2C和SPI通信,是靠什么判断的?

image-20240731102746274

4.2 供电

模块是5v供电,内部转3.3v。

4.3 接线

模块引脚F1C200S
VCC505V
GNDGND
SDATWI0_SDA/PD0
SCLTWI0_SCK/PD12

4.4 配置内核

image-20240801132629719

4.5 驱动

内核自带驱动,使用IIO子系统。IIO子系统参考正点原子Linux文档。

sudo cp drivers/iio/accel/adxl345_core.ko /media/wang/rootfs/lib/modules/5.4.99/
sudo cp drivers/iio/accel/adxl345_i2c.ko /media/wang/rootfs/lib/modules/5.4.99/

4.6 设备树

	accelerometer@53 {
        compatible = "adi,adxl345";
        reg = <0x53>;
		status = "okay";
    };

4.7 测试

IIO 驱动框架提供了 sysfs 接口,因此加载成功以后我们可以在用户空间访问对应的 sysfs 目录项,进入目录“/sys/bus/iio/devices/”目录里面,此目录下都是 IIO 框架设备。

image-20240801200758116

insmod /lib/modules/5.4.99/adxl345_core.ko
insmod /lib/modules/5.4.99/adxl345_i2c.ko
驱动加载成功,在目录/sys/bus/iio/devices下可看到设备
ls /sys/bus/iio/devices
cat /sys/bus/iio/devices/iio\:device0/in_accel_scale
cat /sys/bus/iio/devices/iio\:device0/in_accel_x_raw
cat /sys/bus/iio/devices/iio\:device0/in_accel_y_raw
cat /sys/bus/iio/devices/iio\:device0/in_accel_z_raw

4.8 应用程序

如果不用设备树,可以
echo adxl345 0x53> /sys/bus/i2c/devices/i2c-0/new_device

adxl345_app.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

/*
	加载驱动
	insmod adxl345_core.ko
	insmod adxl345_i2c.ko
	
	匹配成功目录/sys/bus/iio/devices下会有设备。
*/

int main() {
    FILE *accel_scale_file, *accel_x_raw_file, *accel_y_raw_file, *accel_z_raw_file;
    int accel_x_raw, accel_y_raw, accel_z_raw;
	float accel_scale;
    char buf[64];

    while(1){
		accel_scale_file = fopen("/sys/bus/iio/devices/iio\:device0/in_accel_scale", "r");
		if (accel_scale_file == NULL) {
			perror("Error opening file");
			return EXIT_FAILURE;
		}
		accel_x_raw_file = fopen("/sys/bus/iio/devices/iio\:device0/in_accel_x_raw", "r");
		if (accel_x_raw_file == NULL) {
			perror("Error opening file");
			return EXIT_FAILURE;
		}
		accel_y_raw_file = fopen("/sys/bus/iio/devices/iio\:device0/in_accel_y_raw", "r");
		if (accel_y_raw_file == NULL) {
			perror("Error opening file");
			return EXIT_FAILURE;
		}
		accel_z_raw_file = fopen("/sys/bus/iio/devices/iio\:device0/in_accel_z_raw", "r");
		if (accel_z_raw_file == NULL) {
			perror("Error opening file");
			return EXIT_FAILURE;
		}

        if (fgets(buf, sizeof(buf), accel_scale_file) != NULL) {
            accel_scale = atof(buf);
            //printf("accel_scale: %f   ", accel_scale);
        }
        if (fgets(buf, sizeof(buf), accel_x_raw_file) != NULL) {
            accel_x_raw = atoi(buf);
            //printf("accel_x_raw: %d   ", accel_x_raw);
        }
		if (fgets(buf, sizeof(buf), accel_y_raw_file) != NULL) {
            accel_y_raw = atoi(buf);
            //printf("accel_y_raw: %d   ", accel_y_raw);
        }
		if (fgets(buf, sizeof(buf), accel_z_raw_file) != NULL) {
            accel_z_raw = atoi(buf);
            //printf("accel_z_raw: %d\n", accel_z_raw);
        }
		printf("accel x:%.2f y:%.2f z:%.2f\r\n", accel_scale*accel_x_raw, accel_scale*accel_y_raw, accel_scale*accel_z_raw);
		
		fclose(accel_scale_file);
		fclose(accel_x_raw_file);
		fclose(accel_y_raw_file);
		fclose(accel_z_raw_file);
		
		//sleep(1);
		usleep(100000);  //100ms
    }

    return EXIT_SUCCESS;
}

执行结果

gcc adxl345_app.c -o adxl345_app
root@wangpi:/home/wxc# ./adxl345_app
accel x:0.34 y:-8.04 z:-3.87
accel x:0.31 y:-8.08 z:-4.02
accel x:0.31 y:-8.08 z:-4.02
accel x:0.27 y:-8.08 z:-3.98
accel x:0.34 y:-8.04 z:-3.98
accel x:0.31 y:-8.04 z:-3.98
accel x:0.31 y:-8.08 z:-3.98
accel x:0.31 y:-8.08 z:-3.98

4.9 问题

accel_scale 为什么是0.0383???

在驱动源码adxl345_core.c中查到答案。

/*
 * In full-resolution mode, scale factor is maintained at ~4 mg/LSB
 * in all g ranges.
 *
 * At +/- 16g with 13-bit resolution, scale is computed as:
 * (16 + 16) * 9.81 / (2^13 - 1) = 0.0383
 */
static const int adxl345_uscale = 38300;

4.10 libiio库

sudo apt install libiio-dev

未完成。

4.11 参考

【【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81】的IIO章节。

五、SSD1306

5.1 模组链接

5.2 模组原理图

image-20240805213206669

5.3 供电

3.3v供电。

5.4 接线

模块引脚F1C200S
VCC3.3V
GNDGND
SDATWI0_SDA/PD0
SCLTWI0_SCK/PD12

5.5 测试

image-20240805201237790

SSD1306_app.sh

i2cset -y 0 0x3c 0x00 0xAE
i2cset -y 0 0x3c 0x00 0x00
i2cset -y 0 0x3c 0x00 0x10
i2cset -y 0 0x3c 0x00 0x40
i2cset -y 0 0x3c 0x00 0x81
i2cset -y 0 0x3c 0x00 0xCF
i2cset -y 0 0x3c 0x00 0xA1
i2cset -y 0 0x3c 0x00 0xC8
i2cset -y 0 0x3c 0x00 0xA6
i2cset -y 0 0x3c 0x00 0xA8
i2cset -y 0 0x3c 0x00 0x3f
i2cset -y 0 0x3c 0x00 0xD3
i2cset -y 0 0x3c 0x00 0x00
i2cset -y 0 0x3c 0x00 0xd5
i2cset -y 0 0x3c 0x00 0x80
i2cset -y 0 0x3c 0x00 0xD9
i2cset -y 0 0x3c 0x00 0xF1
i2cset -y 0 0x3c 0x00 0xDA
i2cset -y 0 0x3c 0x00 0x12
i2cset -y 0 0x3c 0x00 0xDB
i2cset -y 0 0x3c 0x00 0x40
i2cset -y 0 0x3c 0x00 0x20
i2cset -y 0 0x3c 0x00 0x02
i2cset -y 0 0x3c 0x00 0x8D
i2cset -y 0 0x3c 0x00 0x14
i2cset -y 0 0x3c 0x00 0xA4
i2cset -y 0 0x3c 0x00 0xA6
i2cset -y 0 0x3c 0x00 0xAF

# 清屏
for i in {0..7}
do
		echo $i
        v=$((0xb0+i))
        i2cset -y 0 0x3c 0x00 $v
        i2cset -y 0 0x3c 0x00 0x00
        i2cset -y 0 0x3c 0x00 0x10

        for i in {0..127}
        do
                i2cset -y 0 0x3c 0x40 0xff
        done
done
# 黑屏
for i in {0..7}
do
		echo $i
        v=$((0xb0+i))
        i2cset -y 0 0x3c 0x00 $v
        i2cset -y 0 0x3c 0x00 0x00
        i2cset -y 0 0x3c 0x00 0x10

        for i in {0..127}
        do
                i2cset -y 0 0x3c 0x40 0x00
        done
done

5.6 内核配置

image-20240805210400476

image-20240805212338118

5.7 设备树

    ssd1306: oled@3c {
		compatible = "solomon,ssd1306fb-i2c";
		reg = <0x3c>;
		reset-gpios=<&pio 4 12 GPIO_ACTIVE_LOW>;
		solomon,height = <64>;
		solomon,width = <128>;
		solomon,page-offset = <0>;
		solomon,com-lrremap;
		solomon,com-invdir;
		//solomon,com-offset = <32>;
		status = "okay";
	};

5.8 驱动

使用drivers/video/fbdev/ssd1307fb.c

5.9 测试

insmod /lib/modules/5.4.99/ssd1307fb.ko

image-20240805213907389

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1982670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序教程011-:2:京西购物商城实战之TabBar实现

2、tabBar 2.0 创建tabBar分支 运行如下命令,基于master分支,创建本地tabBar子分支,用来开发和tabBar相关的功能 git checkout -b tabbar2.1 创建tabBar页面 在pages目录中,创建首页(home)、分类(cate)、购物车(cart)、我的(my)这4个tabBar页面,在HBuilderX中…

【网络世界】数据链路层

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 初识数据链路层 &#x1f4c2; 概念 &#x1f4c2; 协议格式 &#x1f4c1; MAC地址 &#x1f4c2; 概念 &#x1f4c2; 与IP地址的区别 &#x1f4c1; MTU &#x1f4c2; 对IP协议的影响 &#x1f4c2; 对UDP协议的影响…

思维+位运算,CF 1934D1 - XOR Break --- Solo Version

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1934D1 - XOR Break --- Solo Version 二、解题报告 1、思路分析 合法操作会让 n 越变越小 假如最高位1为 b1, 次高位1 为b2 那么我们去掉b1 的 1最大能够得到的数为 &#xff08;1 << b2&#xff…

图像传感器 - 从零开始认识各种传感器【二十六期】

图像传感器|从零开始认识各种传感器 1、什么是图像传感器&#xff1f; 图像传感器是将光信号转换为电信号的设备&#xff0c;图像传感器通过捕捉光子并将其转化为电子信号&#xff0c;从而生成数字图像。它是数码相机、摄像机、智能手机、无人机、自动驾驶汽车以及各种工业和医…

良心推荐!分享6个强大的电脑软件,每一个都非常实用

良心推荐&#xff01;分享6个功能强大的电脑软件&#xff0c;每一个都非常实用&#xff01; 1.Listen1 一个可以免费听音乐的软件&#xff0c;也可以在浏览器上作为插件使用&#xff0c;曲库丰富&#xff0c;里面涵盖了QQ音乐、酷狗音乐、网易云音乐等多个平台的歌单资源&…

【MySQL】索引——索引的实现、B+ vs B、聚簇索引 VS 非聚簇索引、索引操作、创建索引、查询索引、删除索引

文章目录 MySQL5. 索引的实现5.1 B vs B5.2 聚簇索引 VS 非聚簇索引 6. 索引操作6.1 创建主键索引6.2 创建唯一索引6.3 创建普通索引6.4 创建全文索引6.5 查询索引6.6 删除索引 MySQL 5. 索引的实现 因为MySQL和磁盘交互的基本单位为Page&#xff08;页&#xff09;。 MySQL 中…

LTrack:实现夜间多目标追踪,并开放低光多目标追踪数据集LMOT

摘要 低光场景在现实应用中很常见&#xff08;例如&#xff0c;夜间的自动驾驶和监控&#xff09;。最近&#xff0c;多目标跟踪在各种实际用例中受到了很多关注&#xff0c;但黑暗场景中的多目标跟踪却很少被考虑。在本文中&#xff0c;我们专注于黑暗场景中的多目标跟踪。为…

点菜吧——随便点 C#生成套餐

前言 一到食堂发现有多种选择&#xff0c;但是有一个固定的套路&#xff0c;只能是一个荤&#xff0c;二个小荤&#xff0c;菜品数量也不少&#xff0c;任君选择&#xff0c;如果是一个选择困难症&#xff0c;就有点烦了&#xff0c;所以出品这个自动生成套餐软件。各位老板可…

Mysql原理与调优-InnoDB行记录结构

目录 1.绪论 2.InnoDB的记录格式分类 3.compact格式 3.1 基本组成 3.2 记录额外信息 3.2.1 记录额外信息组成 3.2.2 变成字段长度列表 3.2.3 null值列表 3.2.4 记录头信息 3.3 实际记录 3.3.1 溢出页 3.3.2 varchar最多可以储存多少个字符的数据 4.其他记录格式和c…

配置python的基本环境

python的背景知识 python是咋来的&#xff1f; Python 是一种广泛使用的高级编程语言&#xff0c;由 Guido van Rossum 在1989年底发明&#xff0c;第一个公开发行版发行于1991年。Python 的设计哲学强调代码的可读性和简洁的语法&#xff08;尤其是使用空格缩进来区分代码块…

tcpdump使用指南

tcpdump 是一款强大的网络抓包工具&#xff0c;它使用 libpcap 库来抓取网络数据包&#xff0c;这个库在几乎在所有的 Linux/Unix 中都有。 tcpdump src 10.5.2.3 and dst port 3389 # 1. 基于IP地址过滤 # 根据源ip进行过滤 $ tcpdump -i eth2 src 192.168.10.100# 根据目标…

sqli-labs靶场练习(1、5-8关)

自己搭建环境啊喂...http://127.0.0.1/sqli-labs-php7-master/ 第一关 1.单引号判断是否存在注入点 /?id1 2.查询列数 ?id1 order by 3-- ?id1 order by 4-- 由此可判断有3列 3.查询用户名和密码分别在哪列 ?id-1 union select 1,2,3 -- 4.查询数据库名称为security ?…

CC2530组网实验-1

1&#xff0c;ZigBee协议栈 协议是一系列的通信标准&#xff0c;通信双方需要共同按照这一标准进行正常的数据发射和接收。协议栈是协议的具体实现形式&#xff0c;通俗点来理解就是协议栈是协议和用户之间的一个接口&#xff0c;开发人员通过使用协议栈来使用这个协议的&…

生活一地猫毛,空气还有猫浮毛!宠物空气净化器帮你消除这些烦恼

随着换毛季节的到来&#xff0c;铲屎官们如临大敌&#xff0c;猫咪将它们的毛发洒满每一个角落&#xff0c;仿佛室内下起了毛茸茸的飘雪。对于铲屎官来说&#xff0c;这不仅耗费时间的清理任务&#xff0c;更是一场守护健康的保卫战。为此&#xff0c;采取了许多措施来应对猫咪…

STL中的vector以及简单实现

vector的简单介绍&#xff1a; 头文件&#xff1a; #include<vector> vector是属于STL的一员&#xff0c;虽然vector的英文意思是向量&#xff0c;但是vector就是一个顺序表&#xff1b; 对于vector来说&#xff0c;面对string的设计的复杂和冗余&#xff0c;vector就…

Java毕业设计 基于SSM和Vue的图书馆座位预约系统小程序

Java毕业设计 基于SSM和Vue的图书馆座位预约系统小程序 这篇博文将介绍一个基于SSM框架和Vue开发的图书馆座位预约系统微信小程序&#xff0c;适合用于Java毕业设计。 功能介绍 用户 登录 注册 首页 图片轮播 关于我们 公告信息 图书馆信息 图书馆详情 预约选座 收藏 …

Tkinter Designer:拖拽式加速Python Tkinter GUI开发的神器

引言 在Python的世界里&#xff0c;创建美观且功能强大的图形用户界面&#xff08;GUI&#xff09;向来是开发者的挑战之一。Tkinter&#xff0c;作为Python的内置GUI库&#xff0c;虽然功能强大&#xff0c;但在实际使用中&#xff0c;设计和实现GUI的过程往往耗时且繁琐。Tki…

Linux中信号的处理

进程正在递达某一个信号期间&#xff0c;同类型的信号无法被递达&#xff01;&#xff01;&#xff01; 当当前信号正在被捕捉事&#xff0c;系统会自动将当前信号加入到进程的信号屏蔽字&#xff08;block&#xff09;。 当信号完成捕捉动作&#xff0c;系统又会自动解除对该…

R语言BIOMOD2 及机器学习方法的物种分布模拟与案例分析

BIOMOD2是一个R软件包&#xff0c;用于构建和评估物种分布模型&#xff08;SDMs&#xff09;。它集成了多种统计和机器学习方法&#xff0c;如GLM、GAM、SVM等&#xff0c;允许用户预测和分析物种在不同环境条件下的地理分布。通过这种方式&#xff0c;BIOMOD帮助研究者评估气候…

Linux-理解shell

文章目录 5. 理解shell5.1 shell的类型5.2 交互shell和系统默认shell5.3 安装zsh shell程序5.4 shell的父子关系5.5 命令列表5.6 命令分组5.7 使用命令分组创建子shell5.8 子shell用法5.9 shell的非内建命令和内建命令5.9.1 非内建命令5.9.2 内建命令5.9.3 history和alias命令介…