031——从GUI->Client->Server->driver实现dht11数据的采集

目录

0、设置ip

1、修改显示界面

2、 修改客户端

3、 修改服务器程序通信部分

4、 修改驱动处理程序

5、 重写驱动程序

6、 展示


0、设置ip

因为ifconfig命令要被淘汰了,所以我们改成使用ip命令设置ubuntu的ip

ip addr add 192.168.5.10/24 dev ens36
ip addr show

1、修改显示界面

之前共用一个get value现在给每个人一个单独的显示框

2、 修改客户端

            #dht11elif cmd[2] == '0' and cmd[3] == '5':if cmd[4] == 'g':global_var.TEM=cmd[4]+cmd[5]global_var.HUM=cmd[6]+cmd[7]message = f"{global_var.TEM}°C   {global_var.HUM}%"window['DHT11_O'].update(message)else:print("DHT11: message ERROR")  
            elif event == 'dht11':set_tx_buf('dht11', 'g')send_cmd(client_socket)

        DHT11 测量温度的精度为± 2℃,检测范围为-20℃ -60℃。湿度的精度为± 5%RH,检测范围为 5%RH-95%RH,常用于对精度和实时性要求不高的温湿度测量场合。

所以温度要用三位数表示把低温也加上,湿度的话两位就够了

            #dht11elif cmd[2] == '0' and cmd[3] == '5':if cmd[4] == 'g':global_var.TEM=cmd[5]+cmd[6]+cmd[7]global_var.HUM=cmd[8]+cmd[9]message = f"{global_var.TEM}°C   {global_var.HUM}%"window['DHT11_O'].update(message)else:print("DHT11: message ERROR")  

3、 修改服务器程序通信部分

                printf("dht11!!!\n");if ('g' == cmd[4]){opt = dht11_handle(buf);tx_buffer = buf;}printf(">>>>>>%s\n",tx_buffer);         if (send(acceptfd, tx_buffer, strlen(tx_buffer), 0) < 0){perror("send failed");  }break;

局部变量太多了东西展示都给driver_handele做

4、 修改驱动处理程序

/*
*author   : xintianyu
*function : Handle dht11 Settings
*date     : 2024-4-20
-----------------------
author date  modify*/
int dht11_handle(char *data)
{/*传入参数后面要做通用处理使用空指针*/char *device = "/dev/cebss_dht11";unsigned char buf[2];int ret = NOERROR;static int fd;/* 打开文件 */fd = open(device, O_RDWR);if (fd == -1){printf("can not open file %s\n", device);return ERROR;}
read:if (read(fd, buf, 2) == 2){printf("get Humidity: %d, Temperature : %d\n", buf[0], buf[1]);sprintf(data,"@005g%d%d", buf[0], buf[1]);}else{sleep(5);printf("get dht11: -1\n");goto read;}close(fd);return ret;
}

5、 重写驱动程序

#include "asm-generic/errno-base.h"
#include "asm-generic/gpio.h"
#include "linux/jiffies.h"
#include <linux/module.h>
#include <linux/poll.h>
#include <linux/delay.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/mutex.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/tty.h>
#include <linux/kmod.h>
#include <linux/gfp.h>
#include <linux/gpio/consumer.h>
#include <linux/platform_device.h>
#include <linux/of_gpio.h>
#include <linux/of_irq.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/slab.h>
#include <linux/fcntl.h>
#include <linux/timer.h>struct gpio_desc{int gpio;int irq;char *name;int key;struct timer_list key_timer;
} ;static struct gpio_desc gpios[] = {{115, 0, "dht11", },
};/* 主设备号                                                                 */
static int major = 0;
static struct class *gpio_class;static u64 g_dht11_irq_time[84];
static int g_dht11_irq_cnt = 0;/* 环形缓冲区 */
#define BUF_LEN 128
static char g_keys[BUF_LEN];
static int r, w;struct fasync_struct *button_fasync;static irqreturn_t dht11_isr(int irq, void *dev_id);
static void parse_dht11_datas(void);#define NEXT_POS(x) ((x+1) % BUF_LEN)static int is_key_buf_empty(void)
{return (r == w);
}static int is_key_buf_full(void)
{return (r == NEXT_POS(w));
}static void put_key(char key)
{if (!is_key_buf_full()){g_keys[w] = key;w = NEXT_POS(w);}
}static char get_key(void)
{char key = 0;if (!is_key_buf_empty()){key = g_keys[r];r = NEXT_POS(r);}return key;
}static DECLARE_WAIT_QUEUE_HEAD(gpio_wait);// static void key_timer_expire(struct timer_list *t)
static void key_timer_expire(unsigned long data)
{// 解析数据, 放入环形buffer, 唤醒APPparse_dht11_datas();
}/* 实现对应的open/read/write等函数,填入file_operations结构体                   */
static ssize_t dht11_read (struct file *file, char __user *buf, size_t size, loff_t *offset)
{int err;char kern_buf[2];if (size != 2)return -EINVAL;g_dht11_irq_cnt = 0;/* 1. 发送18ms的低脉冲 */err = gpio_request(gpios[0].gpio, gpios[0].name);gpio_direction_output(gpios[0].gpio, 0);gpio_free(gpios[0].gpio);mdelay(18);gpio_direction_input(gpios[0].gpio);  /* 引脚变为输入方向, 由上拉电阻拉为1 *//* 2. 注册中断 */err = request_irq(gpios[0].irq, dht11_isr, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, gpios[0].name, &gpios[0]);mod_timer(&gpios[0].key_timer, jiffies + 10);	/* 3. 休眠等待数据 */wait_event_interruptible(gpio_wait, !is_key_buf_empty());free_irq(gpios[0].irq, &gpios[0]);//printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);/* 设置DHT11 GPIO引脚的初始状态: output 1 */err = gpio_request(gpios[0].gpio, gpios[0].name);if (err){printk("%s %s %d, gpio_request err\n", __FILE__, __FUNCTION__, __LINE__);}gpio_direction_output(gpios[0].gpio, 1);gpio_free(gpios[0].gpio);/* 4. copy_to_user */kern_buf[0] = get_key();kern_buf[1] = get_key();printk("get val : 0x%x, 0x%x\n", kern_buf[0], kern_buf[1]);if ((kern_buf[0] == (char)-1) && (kern_buf[1] == (char)-1)){printk("get err val\n");return -EIO;}err = copy_to_user(buf, kern_buf, 2);return 2;
}static int dht11_release (struct inode *inode, struct file *filp)
{return 0;
}/* 定义自己的file_operations结构体                                              */
static struct file_operations dht11_drv = {.owner	 = THIS_MODULE,.read    = dht11_read,.release = dht11_release,
};static void parse_dht11_datas(void)
{int i;u64 high_time;unsigned char data = 0;int bits = 0;unsigned char datas[5];int byte = 0;unsigned char crc;/* 数据个数: 可能是81、82、83、84 */if (g_dht11_irq_cnt < 81){/* 出错 */put_key(-1);put_key(-1);// 唤醒APPwake_up_interruptible(&gpio_wait);g_dht11_irq_cnt = 0;return;}// 解析数据for (i = g_dht11_irq_cnt - 80; i < g_dht11_irq_cnt; i+=2){high_time = g_dht11_irq_time[i] - g_dht11_irq_time[i-1];data <<= 1;if (high_time > 50000) /* data 1 */{data |= 1;}bits++;if (bits == 8){datas[byte] = data;data = 0;bits = 0;byte++;}}// 放入环形buffercrc = datas[0] + datas[1] + datas[2] + datas[3];if (crc == datas[4]){put_key(datas[0]);put_key(datas[2]);}else{put_key(-1);put_key(-1);}g_dht11_irq_cnt = 0;// 唤醒APPwake_up_interruptible(&gpio_wait);
}static irqreturn_t dht11_isr(int irq, void *dev_id)
{struct gpio_desc *gpio_desc = dev_id;u64 time;/* 1. 记录中断发生的时间 */time = ktime_get_ns();g_dht11_irq_time[g_dht11_irq_cnt] = time;/* 2. 累计次数 */g_dht11_irq_cnt++;/* 3. 次数足够: 解析数据, 放入环形buffer, 唤醒APP */if (g_dht11_irq_cnt == 84){del_timer(&gpio_desc->key_timer);parse_dht11_datas();}return IRQ_HANDLED;
}/* 在入口函数 */
static int __init dht11_init(void)
{int err;int i;int count = sizeof(gpios)/sizeof(gpios[0]);printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);for (i = 0; i < count; i++){		gpios[i].irq  = gpio_to_irq(gpios[i].gpio);/* 设置DHT11 GPIO引脚的初始状态: output 1 */err = gpio_request(gpios[i].gpio, gpios[i].name);gpio_direction_output(gpios[i].gpio, 1);gpio_free(gpios[i].gpio);setup_timer(&gpios[i].key_timer, key_timer_expire, (unsigned long)&gpios[i]);//timer_setup(&gpios[i].key_timer, key_timer_expire, 0);//gpios[i].key_timer.expires = ~0;//add_timer(&gpios[i].key_timer);//err = request_irq(gpios[i].irq, dht11_isr, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "100ask_gpio_key", &gpios[i]);}/* 注册file_operations 	*/major = register_chrdev(0, "100ask_dht11", &dht11_drv);  /* /dev/gpio_desc */gpio_class = class_create(THIS_MODULE, "100ask_dht11_class");if (IS_ERR(gpio_class)) {printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);unregister_chrdev(major, "100ask_dht11");return PTR_ERR(gpio_class);}device_create(gpio_class, NULL, MKDEV(major, 0), NULL, "mydht11"); /* /dev/mydht11 */return err;
}/* 有入口函数就应该有出口函数:卸载驱动程序时,就会去调用这个出口函数*/
static void __exit dht11_exit(void)
{int i;int count = sizeof(gpios)/sizeof(gpios[0]);printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);device_destroy(gpio_class, MKDEV(major, 0));class_destroy(gpio_class);unregister_chrdev(major, "100ask_dht11");for (i = 0; i < count; i++){//free_irq(gpios[i].irq, &gpios[i]);//del_timer(&gpios[i].key_timer);}
}/* 7. 其他完善:提供设备信息,自动创建设备节点                                     */module_init(dht11_init);
module_exit(dht11_exit);MODULE_LICENSE("GPL");

韦东山老师基于中断的驱动程序准确度太低了,所以我们写个不基于中断的试试

#include <linux/module.h>  
#include <linux/kernel.h>  
#include <linux/fs.h>  
#include <linux/gpio.h>  
#include <linux/delay.h>  
#include <linux/uaccess.h>  #define DHT11_GPIO 115  // 假设DHT11连接到GPIO 115  
#define DHT11_DATA_LEN 8  // DHT11数据长度(包括温湿度值、校验和)  static int dht11_gpio;
static u8 dht11_data[DHT11_DATA_LEN];static void dht11_set_gpio_output(void)  
{  gpio_direction_output(dht11_gpio, 0);  
}  static void dht11_set_gpio_input(void)  
{  gpio_direction_input(dht11_gpio);  
}  static int dht11_read_data(void)  
{  int i, j;  u8 last_state = 0;  // 发送开始信号  dht11_set_gpio_output();  gpio_set_value(dht11_gpio, 0);  udelay(18000);  gpio_set_value(dht11_gpio, 1);  udelay(20);  dht11_set_gpio_input();  // 等待DHT11响应  while (gpio_get_value(dht11_gpio)) {  udelay(1);  if (j++ > 100) {  return -1;  // 超时  }  }  // 读取数据  for (i = 0; i < DHT11_DATA_LEN; i++) {  dht11_data[i] = 0;  for (j = 0; j < 8; j++) {  while (!gpio_get_value(dht11_gpio)) {  udelay(1);  if (j++ > 100) {  return -1;  // 超时  }  }  udelay(40);  if (!gpio_get_value(dht11_gpio)) {  dht11_data[i] |= (1 << (7 - j));  }  }  }  // 检查校验和  u8 sum = 0;  for (i = 0; i < DHT11_DATA_LEN - 1; i++) {  sum += dht11_data[i];  }  if (sum != dht11_data[DHT11_DATA_LEN - 1]) {  return -1;  // 校验和错误  }  return 0;  
}
static int dht11_open(struct inode *inode, struct file *file)  
{  return 0;  
}  static ssize_t dht11_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)  
{  int ret;  char data_str[32];  int temp_integral, temp_decimal;  int humi_integral, humi_decimal;  ret = dht11_read_data();  if (ret < 0) {  return ret;  }  // 解析温度和湿度值  temp_integral = dht11_data[2];  temp_decimal = dht11_data[3];  humi_integral = dht11_data[0];  humi_decimal = dht11_data[1];  // 将数据转换为字符串格式  snprintf(data_str, sizeof(data_str), "Temp: %d.%d C, Humidity: %d.%d %%\n",  temp_integral, temp_decimal, humi_integral, humi_decimal);  // 将数据复制到用户空间  if (copy_to_user(buf, data_str, strlen(data_str))) {  return -EFAULT;  }  return strlen(data_str);  
}static int dht11_release(struct inode *inode, struct file *file)  
{  return 0;  
}  static loff_t dht11_lseek(struct file *file, loff_t offset, int whence)  
{  return -EINVAL; // 不支持lseek操作  
}static const struct file_operations dht11_fops = {  .owner = THIS_MODULE,  .read = dht11_read,  .open = dht11_open,  .release = dht11_release,  .llseek = dht11_lseek,  
};  static int __init dht11_init(void)  
{  int ret;  // 请求GPIO资源  dht11_gpio = gpio_request(DHT11_GPIO, "DHT11");  if (dht11_gpio < 0) {  printk(KERN_ERR "Failed to request GPIO %d\n", DHT11_GPIO);  return -ENODEV;  }  // 导出GPIO到用户空间(可选)  // gpio_export(DHT11_GPIO, false);  // 注册字符设备  ret = register_chrdev(0, "dht11", &dht11_fops);  if (ret < 0) {  printk(KERN_ERR "Failed to register character device\n");  gpio_free(dht11_gpio);  return ret;  }  // 创建设备节点  ret = device_create(class_create(THIS_MODULE, "dht11"), NULL, MKDEV(ret, 0), NULL, "cebss_dht11");  if (ret < 0) {  printk(KERN_ERR "Failed to create device\n");  unregister_chrdev(ret, "dht11");  gpio_free(dht11_gpio);  return ret;  }  printk(KERN_INFO "DHT11 driver loaded\n");  return 0;  
}  static void __exit dht11_exit(void)  
{  device_destroy(class_destroy(dht11_class), MKDEV(major, 0));  unregister_chrdev(major, "dht11");  gpio_free(dht11_gpio);  printk(KERN_INFO "DHT11 driver unloaded\n");  
}  module_init(dht11_init);
module_exit(dht11_exit);
MODULE_LICENSE("GPL");

不认识,因为注册的时候没用变量直接给返回值拿来用了

主设备号也没对上

static int __init dht11_init(void)  
{  int ret;  // 请求GPIO资源  dht11_gpio = gpio_request(DHT11_GPIO, "DHT11");  if (dht11_gpio < 0) {  printk(KERN_ERR "Failed to request GPIO %d\n", DHT11_GPIO);  return -ENODEV;  }  // 导出GPIO到用户空间(可选)  // gpio_export(DHT11_GPIO, false);  // 注册字符设备  major = register_chrdev(0, "dht11", &dht11_fops);  if (major < 0) {  printk(KERN_ERR "Failed to register character device\n");  gpio_free(dht11_gpio);  return ret;  }  gpio_class = class_create(THIS_MODULE, "dht11");// 创建设备节点  ret = device_create(gpio_class, NULL, MKDEV(major, 0), NULL, "cebss_dht11");  if (ret < 0) {  printk(KERN_ERR "Failed to create device\n");  unregister_chrdev(major, "dht11");  gpio_free(dht11_gpio);  return ret;  }  printk(KERN_INFO "DHT11 driver loaded\n");  return 0;  
}  static void __exit dht11_exit(void)  
{  device_destroy(gpio_class, MKDEV(major, 0));  unregister_chrdev(major, "dht11");  gpio_free(dht11_gpio);  printk(KERN_INFO "DHT11 driver unloaded\n");  
}  

/home/book/program/cebss/driver/01_driver/06_dht11/dht11_drv.c: In function ‘dht11_read_data’:
/home/book/program/cebss/driver/01_driver/06_dht11/dht11_drv.c:65:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
     u8 sum = 0;

这个是经典问题,变量要在最开始定义

/home/book/program/cebss/driver/01_driver/06_dht11/dht11_drv.c: In function ‘dht11_init’:
/home/book/program/cebss/driver/01_driver/06_dht11/dht11_drv.c:151:9: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
     ret = device_create(gpio_class, NULL, MKDEV(major, 0), NULL, "cebss_dht11");

这个函数的返回值是device结构体

WARNING: "__bad_udelay" [/home/book/program/cebss/driver/01_driver/06_dht11/dht11_drv.ko] undefined!

这个警告是可能是因为gcc或内核不支持这个级别演延时导致的,不过问题不大

查了内核源码发现好多人都用了,证明是支持的,所以可能是头文件包含的问题。

算了自己写一个假的好了正常要考虑架构频率进程切换等很多问题所以就简单延时一下好了

void my_udelay(unsigned long usecs)  
{  unsigned long loops = usecs * LOOP_PER_USEC;  while(loops--);
}

[root@100ask:/mnt]# insmod dht11_drv.ko 
[ 2587.699869] ------------[ cut here ]------------
[ 2587.711912] WARNING: CPU: 0 PID: 362 at fs/sysfs/dir.c:31 sysfs_warn_dup+0x64/0x74
[ 2587.722923] sysfs: cannot create duplicate filename '/class/dht11'
[ 2587.731625] ---[ end trace b08c58d5eeb9152c ]---
[ 2587.739230] ------------[ cut here ]------------
[ 2587.744038] WARNING: CPU: 0 PID: 362 at lib/kobject.c:240 kobject_add_internal+0x2a8/0x344
[ 2587.753533] ---[ end trace b08c58d5eeb9152d ]---
[ 2587.761908] Failed to create device
insmod: ERROR: could not insert module dht11_drv.ko: File exists

和单板自带的驱动撞class名了

[root@100ask:/mnt]# insmod dht11_drv.ko 
[ 2757.481544] Failed to request GPIO 115
insmod: ERROR: could not insert module dht11_drv.ko: No such device

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,改了一晚上啦,都不好不知道咋回事算了还是用老师的代码吧

下面是我改过的最新版

#include <linux/module.h>  
#include <linux/kernel.h>  
#include <linux/fs.h>  
#include <linux/gpio.h>  
#include <linux/delay.h>  
#include <linux/uaccess.h>
#include <asm/io.h>  // 假设DHT11连接到GPIO 115
#define DHT11_GPIO 115
// DHT11数据长度(包括温湿度值、校验和)
#define DHT11_DATA_LEN 8
// 假设每个循环迭代需要1微秒
#define LOOP_PER_USEC 1000static int dht11_gpio;
static u8 dht11_data[DHT11_DATA_LEN];
static struct class *gpio_class;
static int major = 0;void my_udelay(unsigned long usecs)  
{  unsigned long loops = usecs * LOOP_PER_USEC;  while(loops--);
}static void dht11_set_gpio_output(void)  
{  gpio_direction_output(dht11_gpio, 0);  
}  static void dht11_set_gpio_input(void)  
{  gpio_direction_input(dht11_gpio);  
}  static int dht11_read_data(void)  
{  int i = 0, j = 0;u8 sum = 0;  // 发送开始信号  dht11_set_gpio_output();  gpio_set_value(dht11_gpio, 0);  mdelay(18);  gpio_set_value(dht11_gpio, 1);  my_udelay(20);  dht11_set_gpio_input();  // 等待DHT11响应  while (gpio_get_value(dht11_gpio)) {  my_udelay(1);  if (j++ > 100) {printk("等待响应失败\n");  return -1;  // 超时  }  }  // 读取数据  for (i = 0; i < DHT11_DATA_LEN; i++) {  dht11_data[i] = 0;  for (j = 0; j < 8; j++){my_udelay(40);  if (!gpio_get_value(dht11_gpio)) {  dht11_data[i] |= (1 << (7 - j));  }  }  }  // // 检查校验和// for (i = 0; i < DHT11_DATA_LEN - 1; i++) {  //     sum += dht11_data[i];  // }  // if (sum != dht11_data[DHT11_DATA_LEN - 1]) {// 	printk("和校验错误区\n");//     return -1;  // 校验和错误  // }  return 0;  
}
static int dht11_open(struct inode *inode, struct file *file)  
{  return 0;  
}  static ssize_t dht11_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)  
{  int ret;  char data_str[32];  int temp_integral, temp_decimal;  int humi_integral, humi_decimal;  ret = dht11_read_data();  if (ret < 0) {  return ret;  }  // 解析温度和湿度值  temp_integral = dht11_data[2];  temp_decimal = dht11_data[3];  humi_integral = dht11_data[0];  humi_decimal = dht11_data[1];  // 将数据转换为字符串格式  snprintf(data_str, sizeof(data_str), "%3d %2d\n", temp_integral, humi_integral);  printk("%s\n", data_str);// 将数据复制到用户空间  if (copy_to_user(buf, data_str, 6)) {  return -EFAULT;  }  return strlen(data_str);  
}static int dht11_release(struct inode *inode, struct file *file)  
{  return 0;  
}  static loff_t dht11_lseek(struct file *file, loff_t offset, int whence)  
{  return -EINVAL; // 不支持lseek操作  
}static const struct file_operations dht11_fops = {  .owner = THIS_MODULE,  .read = dht11_read,  .open = dht11_open,  .release = dht11_release,  .llseek = dht11_lseek,  
};  static int __init dht11_init(void)  
{// 请求GPIO资源  // dht11_gpio = gpio_request(DHT11_GPIO, "DHT11");  // if (dht11_gpio < 0) {  //     printk(KERN_ERR "Failed to request GPIO %d\n", DHT11_GPIO);  //     return -ENODEV;  // }  // 导出GPIO到用户空间(可选)  // gpio_export(DHT11_GPIO, false);  // 注册字符设备  major = register_chrdev(0, "dht11", &dht11_fops);  if (major < 0) {  printk(KERN_ERR "Failed to register character device\n");  gpio_free(dht11_gpio);return major;  }  gpio_class = class_create(THIS_MODULE, "dht11");// 创建设备节点  device_create(gpio_class, NULL, MKDEV(major, 0), NULL, "cebss_dht11");  if (IS_ERR(gpio_class)) {  printk(KERN_ERR "Failed to create device\n");  unregister_chrdev(major, "dht11");  gpio_free(dht11_gpio);  return PTR_ERR(gpio_class);  }  printk(KERN_INFO "DHT11 driver loaded\n");  return 0;  
}  static void __exit dht11_exit(void)  
{  device_destroy(gpio_class, MKDEV(major, 0));class_destroy(gpio_class);  unregister_chrdev(major, "dht11");  gpio_free(dht11_gpio);printk(KERN_INFO "DHT11 driver unloaded\n");
}  module_init(dht11_init);
module_exit(dht11_exit);
MODULE_LICENSE("GPL");

最后挣扎一下

试试内核中的dht11程序

也是不行啊,没办法单核cpu这中持续采集就是没法很准确就这样吧。哎

6、 展示

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

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

相关文章

ElasticSearch中使用向量和关键词联合检索

注&#xff1a;案例测试数据及其索引构建详见&#xff1a;ElasticSearch中使用bge-large-zh-v1.5进行向量检索&#xff08;一&#xff09;-CSDN博客 中的第三部分。 假设任务场景为&#xff1a;用“新疆”向量检索相关的数据&#xff0c;同时需要匹配关键词“巴州”。 首先获取…

VUE运行找不到pinia模块

当我们的VUE运行时报错Module not found: Error: Cant resolve pinia in时 当我们出现这个错误时 可能是 没有pinia模块 此时我们之要下载一下这个模块就可以了 npm install pinia

Elasticsearch进阶篇(三):ik分词器的使用与项目应用

ik分词器的使用 一、下载并安装1.1 已有作者编译后的包文件1.2 只有源代码的版本1.3 安装ik分词插件 二、ik分词器的模式2.1 ik_smart演示2.2 ik_max_word演示2.3 standard演示 三、ik分词器在项目中的使用四、ik配置文件4.1 配置文件的说明4.2 自定义词库 五、参考链接 一、下…

利用Opencv4.9为图像添加边框

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇利用OpenCV4.9制作自己的线性滤波器&#xff01; 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 …

[Spring Cloud] (4)搭建Vue2与网关、微服务通信并配置跨域

文章目录 前言gatway网关跨域配置取消微服务跨域配置 创建vue2项目准备一个原始vue2项目安装vue-router创建路由vue.config.js配置修改App.vue修改 添加接口访问安装axios创建request.js创建index.js创建InfoApi.js main.jssecurityUtils.js 前端登录界面登录消息提示框 最终效…

故障诊断 | 用于跨机器工况下故障诊断的深度判别迁移学习网络附Pytorch代码

目录 基础代码小结基础 目前,研究者已经提出了很多用于解决目标域和源域之间的分布对齐和知识迁移问题的领域自适应方法。然而,大多数研究方法只关注到边缘分布对齐,忽略了目标域和源域之间判别性特征的学习。因此,在某些案例中,这些方法仍然不能很好地满足故障诊断要求。…

InFusion:通过从扩散先验学习深度完成来修复3D高斯

InFusion: Inpainting 3D Gaussians via Learning Depth Completion from Diffusion Prior InFusion&#xff1a;通过从扩散先验学习深度完成来修复3D高斯 Zhiheng Liu * 刘志恒 *1144Hao Ouyang * 欧阳浩 *2233Qiuyu Wang 王秋雨33Ka Leong Cheng 郑家亮2233Jie Xiao 街小…

Elasticsearch常用查询语法及RestClient操作

DSL Query基本语法 1&#xff0c;查询所有数据matchall&#xff08;当然并不是会显示所有数据&#xff09; #查询所有数据 GET /索引名/_search {"query": {"查询类型": {"查询条件":"条件值"}} }2&#xff0c;全文搜索检索-分词搜索…

从零实现诗词GPT大模型:实现Transformer架构

专栏规划: https://qibin.blog.csdn.net/article/details/137728228 首先说明一下,跟其他文章不太一样,在本篇文章中不会对Transformer架构中的自注意力机制进行讲解,而是后面单独1~2篇文章详细讲解自注意力机制,我认为由浅入深的先了解Transformer整体架构和其中比较简单…

IDEA JAVA项目如何设置JVM参数

问题背景&#xff1a; 有时候项目在本地启动时会报参数引用不到&#xff0c;如果确实找不到在哪里添加的话&#xff0c;我们可以先加JVM参数来暂时解决本地环境的调试。 解决方案&#xff1a; 编辑配置Edit Configurations 选择需要配置的项目&#xff0c;点击Modify options 选…

React基础知识大汇总

函数组件和类组件 函数组件与类组件有什么区别呢&#xff1f; function getName(params:{name:string}){const count 0;return params.name -count; } getName({name:"test"}) getName({name:"哈哈哈"})getName是一个纯函数&#xff0c;不产生任何副作用…

mfc140.dll丢失如何修复,分享多种有效的修复方法

在日常操作和使用电脑的过程中&#xff0c;我们可能会遇到一种较为常见的问题&#xff0c;即在尝试启动或运行某个应用程序时&#xff0c;系统突然弹出一个错误提示窗口&#xff0c;明确指出“mfc140.dll文件丢失”。这个mfc140.dll实际上是一个动态链接库文件&#xff08;DLL&…

mysql基础19——日志

日志 mysql的日志种类非常多 通用查询日志 慢查询日志 错误日志 与时间有关联 二进制日志 中继日志 与主从服务器的同步有关 重做日志 回滚日志 与数据丢失有关 通用查询日志 记录了所有用户的连接开始时间和截至时间 以及给mysql服务器发送的所有指令 当数据异常时&…

计算机体系结构

体系结构 CPU&#xff1a;运算器和控制器 运算器&#xff1a;进行算术和逻辑运算控制器&#xff1a; 输入设备&#xff1a;鼠标、键盘、显示器、磁盘、网卡等输出设备&#xff1a;显卡&#xff0c;磁盘、网卡、打印机等存储器&#xff1a;内存&#xff0c;掉电易失总线&#xf…

借助 NVivo 彻底改变业务创新

在收集定性数据时&#xff0c;通常很难确定信息的情感底蕴。尤其是在金融行业&#xff0c;当涉及到经济金融状况和股票走势等问题时&#xff0c;通过文章、社交媒体和其他消费者平台了解市场的真实整体感受至关重要。这就是对数据应用情绪分析可以提供帮助的地方。 在德勤 针对…

代码随想录第42天|416. 分割等和子集

416. 分割等和子集 416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 动态规划之背包问题&#xff0c;这个包能装满吗&#xff1f;| LeetCode&#xff1a;416.分割等和子集_哔哩哔哩_bilibili 给你一个 只包含正整数 的 非空 数组…

软件测试之【软件测试概论一】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 前言软件生命周期软件项目开发过程软件项目组织架构软件开发相关模型 软件测试…

深入理解与实践“git add”命令的作用

文章目录 **git add命令的作用****git add命令的基本作用****高级用法与注意事项** git add命令的作用 引言&#xff1a; 在Git分布式版本控制系统中&#xff0c;git add命令扮演着至关重要的角色&#xff0c;它是将本地工作区的文件变动整合进版本控制流程的关键步骤。本文旨…

《乱弹篇(30)厌战的杜诗》

时下地球村有一伙成天叫嚣着“打打杀杀”、鼓吹快快发动战争的狂人&#xff0c;他们视老百姓的生命如草芥&#xff0c;毫不珍惜。没有遭受过战火焚烧的人&#xff0c;也跟着成天吠叫“快开战吧”。然而中国唐朝大诗人却是个“厌战派”&#xff0c;他对战争的厌恶集中表现在诗《…

放大器DC参数测试(1)

放大器DC参数测试(1) Hi,uu们,最近在忙啥呢?想好5.1,端午去哪里玩了吗? 咱们直接开始正题,放大器的DC参数还挺多,在Bench测试中,需要自动化测试,通常需要很多Relay去切换不同的配置去测量不同的参数,在这里瑞萨给出了测试参考电路.如图1所示. 图1:直流关键参数测试电路 Re…