OpenMV与STM32之间的通信(附源码)

本篇文章旨在记录我电赛期间使用openmv和stm32单片机之间进行串口通信,将openmv识别到的坐标传输给单片机。背景是基于2023年全国大学生电子设计大赛E题:舵机云台追踪识别。

单片机的串口通信原理我便不再详细讲解,下面直接上代码分析。

值得注意的是接线:RX——>TX

                                 TX——>RX

                                 单片机和OPENMV必须共地

非常重要!!!!

一、串口通信传输两个数据(x坐标和y坐标) 

(一)、 OPENMV串口通信部分

import sensor, image, time,math,pyb
from pyb import UART,LED
import json
import ustructsensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False) # must be turned off for color tracking
sensor.set_auto_whitebal(False) # must be turned off for color tracking
red_threshold_01=(10, 100, 127, 32, -43, 67)
clock = time.clock()uart = UART(3,115200)   #定义串口3变量
uart.init(115200, bits=8, parity=None, stop=1) # init with given parametersdef find_max(blobs):    #定义寻找色块面积最大的函数max_size=0for blob in blobs:if blob.pixels() > max_size:max_blob=blobmax_size = blob.pixels()return max_blobdef sending_data(cx,cy,cw,ch):global uart;#frame=[0x2C,18,cx%0xff,int(cx/0xff),cy%0xff,int(cy/0xff),0x5B];#data = bytearray(frame)data = ustruct.pack("<bbhhhhb",      #格式为俩个字符俩个短整型(2字节)0x2C,                      #帧头10x12,                      #帧头2int(cx), # up sample by 4   #数据1int(cy), # up sample by 4    #数据2int(cw), # up sample by 4    #数据1int(ch), # up sample by 4    #数据20x5B)uart.write(data);   #必须要传入一个字节数组while(True):clock.tick()img = sensor.snapshot()blobs = img.find_blobs([red_threshold_01])max_b = find_max(blobs)cx=0;cy=0;if blobs:#如果找到了目标颜色cx=max_b[5]cy=max_b[6]cw=max_b[2]ch=max_b[3]img.draw_rectangle(max_b[0:4]) # rectimg.draw_cross(max_b[5], max_b[6]) # cx, cyFH = bytearray([0x2C,0x12,cx,cy,cw,ch,0x5B])#sending_data(cx,cy,cw,ch)uart.write(FH)print(cx,cy,cw,ch)

注意观察下图标注的部分,我不做详细讲解,但是很容易理解: 

接下来请看STM32串口通信部分的代码:

#include "uart.h"
#include "oled.h"
#include "stdio.h"static u8 Cx=0,Cy=0,Cw=0,Ch=0;void USART1_Init(void)
{//USART1_TX:PA 9   //USART1_RX:PA10GPIO_InitTypeDef GPIO_InitStructure;     //串口端口配置结构体变量USART_InitTypeDef USART_InitStructure;   //串口参数配置结构体变量NVIC_InitTypeDef NVIC_InitStructure;     //串口中断配置结构体变量RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //打开PA端口时钟//USART1_TX   PA9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;          		 //PA9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  		 //设定IO口的输出速度为50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	   		 //复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);             	 	 //初始化PA9//USART1_RX	  PA10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;             //PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);                 //初始化PA10 //USART1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;  //抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;		  //子优先级2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			  //IRQ通道使能NVIC_Init(&NVIC_InitStructure);	                          //根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = 115200;                  //串口波特率为115200USART_InitStructure.USART_WordLength = USART_WordLength_8b;   //字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;        //一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;           //无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	                  //收发模式USART_Init(USART1, &USART_InitStructure);                     //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能中断USART_Cmd(USART1, ENABLE);                     //使能串口1//如下语句解决第1个字节无法正确发送出去的问题USART_ClearFlag(USART1, USART_FLAG_TC);        //清串口1发送标志}//USART1 全局中断服务函数
void USART1_IRQHandler(void)			 
{u8 com_data; u8 i;static u8 RxCounter1=0;static u16 RxBuffer1[10]={0};static u8 RxState = 0;	static u8 RxFlag1 = 0;if( USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)  	   //接收中断  {USART_ClearITPendingBit(USART1,USART_IT_RXNE);   //清除中断标志com_data = USART_ReceiveData(USART1);if(RxState==0&&com_data==0x2C)  //0x2c帧头{RxState=1;RxBuffer1[RxCounter1++]=com_data;OLED_Refresh();}else if(RxState==1&&com_data==0x12)  //0x12帧头{RxState=2;RxBuffer1[RxCounter1++]=com_data;}else if(RxState==2){RxBuffer1[RxCounter1++]=com_data;if(RxCounter1>=10||com_data == 0x5B)       //RxBuffer1接受满了,接收数据结束{RxState=3;RxFlag1=1;Cx=RxBuffer1[RxCounter1-5];Cy=RxBuffer1[RxCounter1-4];Cw=RxBuffer1[RxCounter1-3];Ch=RxBuffer1[RxCounter1-2];}}else if(RxState==3)		//检测是否接受到结束标志{if(RxBuffer1[RxCounter1-1] == 0x5B){USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);//关闭DTSABLE中断if(RxFlag1){OLED_Refresh();OLED_ShowNum(0, 0,Cx,3,16,1);OLED_ShowNum(0,17,Cy,3,16,1);OLED_ShowNum(0,33,Cw,3,16,1);OLED_ShowNum(0,49,Ch,3,16,1);}RxFlag1 = 0;RxCounter1 = 0;RxState = 0;USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);}else   //接收错误{RxState = 0;RxCounter1=0;for(i=0;i<10;i++){RxBuffer1[i]=0x00;      //将存放数据数组清零}}} else   //接收异常{RxState = 0;RxCounter1=0;for(i=0;i<10;i++){RxBuffer1[i]=0x00;      //将存放数据数组清零}}}}

注意观察下面的图:

二、串口通信传输多个数据(四个点的x、y坐标同时传输给STM32单片机)

(一)OPENMV串口部分

from machine import Pin
import sensor, image, time, pyb
#import seekfree
from pyb import UART# 初始化TFT180屏幕
#lcd = seekfree.LCD180(3)# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565) # 设置图像色彩格式为RGB565格式
sensor.set_framesize(sensor.QQVGA)  # 设置图像大小为160*120
sensor.set_auto_whitebal(True)      # 设置自动白平衡
sensor.set_brightness(3000)         # 设置亮度为3000
sensor.skip_frames(time = 20)       # 跳过帧
uart = UART(3, 115200,timeout_char=3000) #配置串口
clock = time.clock()def sending_data(cx,cy,cw,ch):global uart;data = ustruct.pack("<bbhhb",      #格式为俩个字符俩个短整型(2字节)0x2C,                      #帧头10x12,                      #帧头2int (cx1), # up sample by 4    #数据26int (cy1),int (cx2), # up sample by 4    #数据26int (cy2),int (cx3), # up sample by 4    #数据26int (cy3),int (cx4), # up sample by 4    #数据26int (cy4),0x5B)uart.write(data);   #必须要传入一个字节数组while(True):clock.tick()img = sensor.snapshot()# -----矩形框部分-----# 在图像中寻找矩形for r in img.find_rects(threshold = 10000):# 判断矩形边长是否符合要求if r.w() > 20 and r.h() > 20:# 在屏幕上框出矩形img.draw_rectangle(r.rect(), color = (255, 0, 0), scale = 4)# 获取矩形角点位置corner = r.corners()# 在屏幕上圈出矩形角点img.draw_circle(corner[0][0], corner[0][1], 5, color = (0, 0, 255), thickness = 2, fill = False)img.draw_circle(corner[1][0], corner[1][1], 5, color = (0, 0, 255), thickness = 2, fill = False)img.draw_circle(corner[2][0], corner[2][1], 5, color = (0, 0, 255), thickness = 2, fill = False)img.draw_circle(corner[3][0], corner[3][1], 5, color = (0, 0, 255), thickness = 2, fill = False)# 打印四个角点坐标, 角点1的数组是corner[0], 坐标就是(corner[0][0],corner[0][1])# 角点检测输出的角点排序每次不一定一致,矩形左上的角点有可能是corner0,1,2,3其中一个corner1_str = f"corner1 = ({corner[0][0]},{corner[0][1]})"corner2_str = f"corner2 = ({corner[1][0]},{corner[1][1]})"corner3_str = f"corner3 = ({corner[2][0]},{corner[2][1]})"corner4_str = f"corner4 = ({corner[3][0]},{corner[3][1]})"print(corner1_str + "\n" + corner2_str + "\n" + corner3_str + "\n" + corner4_str)# 显示到屏幕上,此部分会降低帧率#lcd.show_image(img, 160, 120, 0, 0, zoom=0)  #屏幕显示#串口通信传输的数据cx1=(int)(corner[0][0]*10)cy1=(int)(corner[0][1]*10)cx2=(int)(corner[1][0]*10)cy2=(int)(corner[1][1]*10)cx3=(int)(corner[2][0]*10)cy3=(int)(corner[2][1]*10)cx4=(int)(corner[3][0]*10)cy4=(int)(corner[3][1]*10)FH=bytearray([0x2C,0x12,cx1,cy1,cx2,cy2,cx3,cy3,cx4,cy4,0x5B])uart.write(FH)cx1=0cy1=0cx2=0cy2=0cx3=0cy3=0cx4=0cy4=0# 打印帧率print(clock.fps())

下面请观察这幅代码截图:

(二)、STM32串口通信部分

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>
#include "OLED.h"
#include "LED.h"
#include "Serial.h"uint8_t Serial_RxData;
uint8_t Serial_RxFlag;
static int16_t Cx1=0,Cy1=0,Cx2=0,Cy2=0,Cx3=0,Cy3=0,Cx4=0,Cy4=0; int Cx5[16];//用于存放分段求的坐标值
int Cy5[16];
//static u8 RxFlag1 = 0;//串口中断接收标志位extern float Ang1,Ang2,AngFlag;
extern float Angle1,Angle2;int avel_X1 ;
int avel_X2 ;
int avel_X3 ;
int avel_X4 ;int avel_Y1 ;
int avel_Y2 ;
int avel_Y3 ;
int avel_Y4 ;void Serial_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//TXGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//RXGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_Init(USART3, &USART_InitStructure);USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);USART_Cmd(USART3, ENABLE);
}void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART3, Byte);while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
}void Serial_SendArray(uint8_t *Array, uint16_t Length)
{uint16_t i;for (i = 0; i < Length; i ++){Serial_SendByte(Array[i]);}
}void Serial_SendString(char *String)
{uint8_t i;for (i = 0; String[i] != '\0'; i ++){Serial_SendByte(String[i]);}
}uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{uint32_t Result = 1;while (Y --){Result *= X;}return Result;
}void Serial_SendNumber(uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i ++){Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');}
}int fputc(int ch, FILE *f)
{Serial_SendByte(ch);return ch;
}void Serial_Printf(char *format, ...)
{char String[100];va_list arg;va_start(arg, format);vsprintf(String, format, arg);va_end(arg);Serial_SendString(String);
}
//USART3 全局中断服务函数
void USART3_IRQHandler(void)			 
{int com_data; u8 i;u8 Jieshou = 1;static u8 RxCounter1=0;static int RxBuffer1[16]={0};static u8 RxState = 0;	static u8 RxFlag1 = 0;//串口中断接收标志位,已被移除至函数体外作为全局变量if( USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET && Jieshou == 1)  	   //接收中断  {
//			OLED_ShowSignedNum(1,1,520,4);USART_ClearITPendingBit(USART3,USART_IT_RXNE);   //清除中断标志com_data = USART_ReceiveData(USART3);if(Jieshou == 1){if(RxState==0&&com_data==0x2C)  //0x2c帧头{RxBuffer1[RxCounter1++]=com_data;RxState=1;}else if(RxState==1&&com_data==0x12)  //0x12帧头{RxBuffer1[RxCounter1++]=com_data;RxState=2;}			else if(RxState==2){RxBuffer1[RxCounter1++]=com_data;if(RxCounter1>=14||com_data == 0x5B)       //RxBuffer1接受满了,接收数据结束{RxState=3;RxFlag1=1;Jieshou = 2;Cx1=RxBuffer1[RxCounter1-9];Cy1=RxBuffer1[RxCounter1-8];Cx2=RxBuffer1[RxCounter1-7];Cy2=RxBuffer1[RxCounter1-6];Cx3=RxBuffer1[RxCounter1-5];Cy3=RxBuffer1[RxCounter1-4];Cx4=RxBuffer1[RxCounter1-3];Cy4=RxBuffer1[RxCounter1-2];OLED_ShowSignedNum(1,1,Cx1,4);OLED_ShowSignedNum(2,1,Cy1,4);OLED_ShowSignedNum(3,1,Cx2,4);OLED_ShowSignedNum(4,1,Cy2,4);OLED_ShowSignedNum(1,7,Cx3,4);OLED_ShowSignedNum(2,7,Cy3,4);OLED_ShowSignedNum(3,7,Cx4,4);OLED_ShowSignedNum(4,7,Cy4,4);}}}else if(RxState==3)		//检测是否接受到结束标志{if(RxBuffer1[RxCounter1-1] == 0x5B){USART_ITConfig(USART3,USART_IT_RXNE,DISABLE);//关闭DTSABLE中断if(RxFlag1){	AngFlag=0;HuanRaoZuoBiao();
//										
//							OLED_ShowSignedNum(1,1,Cx1,4);//							OLED_ShowSignedNum(2,1,Cx2,4);
//							OLED_ShowSignedNum(3,1,avel_X1,4);
//							OLED_ShowSignedNum(4,1,Cx5[0],4);AngFlag=1;RxFlag1 = 0;RxCounter1 = 0;RxState = 0;									}USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);									}else   //接收错误{RxState = 0;RxCounter1=0;for(i=0;i<10;i++){RxBuffer1[i]=0x00;      //将存放数据数组清零}}} else   //接收异常{RxState = 0;RxCounter1=0;for(i=0;i<10;i++){RxBuffer1[i]=0x00;      //将存放数据数组清零}}}}

 注意观察下面这副代码截图:

以上便是我对电赛期间OPENMV与单片机之间实现串口通信的代码实现。学者若有疑问或需要代码工程,可以私聊我。收到后我会及时回复。

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

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

相关文章

wireshark创建显示过滤器实验简述

伯克利包过滤是一种在计算机网络中进行数据包过滤的技术&#xff0c;通过在内核中插入过滤器程序来实现对网络流量的控制和分析。 在数据包细节面板中创建显示过滤器&#xff0c;显示过滤器可以在wireshark捕获数据之后使用。 实验拓扑图&#xff1a; 实验基础配置&#xff1…

HTML input 实现回车切换到下一个输入框功能

前言 遇到需求&#xff0c;在客户填写单子时&#xff0c;有多个输入框&#xff0c;为了省事&#xff0c;不需要频繁移动光标填写。 实现效果 实现方式一 HTML <input type"text" name"serialNumber1" onkeydown"cursor(this);"/><in…

阿里云魔搭发起“ModelScope-Sora开源计划”,将为中国类Sora模型开发提供一站式工具链

在2024年3月23日的全球开发者先锋大会上&#xff0c;阿里云的魔搭社区宣布了一个新计划&#xff1a;“ModelScope-Sora开源计划”。这个计划旨在通过开源方式&#xff0c;帮助中国在Sora模型类型上做出更多创新。这个计划提供了一整套工具&#xff0c;包括处理数据的工具、多模…

Web开发-Django学习笔记

客户端如何获取服务端的数据信息&#xff1f; 通常 是 HTTP网络协议&#xff0c;通过网络传输数据信息。 客户端通过HTTP协议发送请求信息给服务端&#xff0c;并从服务端接收响应信息。 Web 前端开发&#xff1a; &#xff08;HTML、CSS、JS&#xff09;文件部署在后端服务…

Vidmore Video Fix for Mac 视频修复工具

Vidmore Video Fix for Mac是一款功能强大且易于使用的视频修复工具&#xff0c;专为Mac用户设计。它凭借先进的视频修复技术&#xff0c;能够帮助用户解决各种视频问题&#xff0c;如视频文件损坏、无法播放、格式不支持等。 软件下载&#xff1a;Vidmore Video Fix for Mac v…

QT资源添加调用

添加资源文件&#xff0c;新建资源文件夹&#xff0c;命名resource&#xff0c;然后点下一步&#xff0c;点完成 资源&#xff0c;右键add Prefix 添加现有文件 展示的label图片切换 QLabel *led_show; #include "mainwindow.h" #include<QLabel> #include&l…

67、yolov8目标检测和旋转目标检测算法部署Atlas 200I DK A2开发板上

基本思想&#xff1a;需求部署yolov8目标检测和旋转目标检测算法部署atlas 200dk 开发板上 一、转换模型 链接: https://pan.baidu.com/s/1hJPX2QvybI4AGgeJKO6QgQ?pwdq2s5 提取码: q2s5 from ultralytics import YOLO# Load a model model YOLO("yolov8s.yaml")…

Spring-01

Spring 1.Spring是什么? spring是一个开源的Java应用框架&#xff0c;它提供了一套全面的基础设施支持 2.Spring框架的主要特点 1&#xff09;依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09; 2&#xff09;面向切面编程&#xff08;AOP&#xff09…

如何使用剪映专业版剪辑视频

1.操作界面功能介绍 2.时间线的使用 拖动前端后端缩减时长&#xff0c;有多个素材可以拖动调节前后顺序拼接。 分割视频 删除

C语言最大公约数(辗转相除法)

输入两个整数&#xff0c;求他们的最大公约数&#xff1a; 如果我们不用辗转相除法的话&#xff0c;两个整数的最大公约数&#xff0c;我们就可以定义一个整数为两个整数中最小的那个数&#xff0c;然后两个整数一起除我们新定义的整数&#xff0c;如果都除尽了&#xff0c;这…

淘宝商品采集API商品详情数据接口商品搜索列表API接口

淘宝商品采集API、商品详情数据接口以及商品搜索列表API接口是淘宝开放平台提供的一系列接口&#xff0c;旨在帮助开发者更高效地获取淘宝平台上的商品信息。以下是对这些接口的基本介绍和使用方法&#xff1a; 请求示例&#xff0c;API接口接入Anzexi58 一、淘宝商品采集API …

Linux 环境安装 Elasticsearch 8.X

安装前说明 首先确定操作系统&#xff0c;在Linux发行版上执行uname -a查看具体系统。我是Ubuntu系统&#xff0c;可以用直接用apt-get安装&#xff0c;也可以下载tar.gz包手动安装。使用apt-get安装更方便快速&#xff0c;但不同的文件会被安装到不同的目录&#xff0c;不方便…

OSCP靶场--RubyDome

OSCP靶场–RubyDome 考点(CVE-2022-25765 suid ruby提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -Pn -sC -sV 192.168.249.22 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-29 00:28 EDT Nmap scan report for 192.168.249.22 Hos…

实时渲染是什么意思?实时渲染和离线渲染的区别

一、实时渲染是什么意思&#xff1f; 实时渲染是指在计算机程序运行时即时地生成图像和动画的过程&#xff0c;这种渲染技术通常用于网络游戏、虚拟现实和增强现实等需要实时交互的XR应用中。实时渲染需要在每秒内渲染数百万到数十亿个像素&#xff0c;以呈现出平滑的动画和交…

深入并广泛了解Redis常见的缓存使用问题

Redis 作为一门主流技术&#xff0c;缓存应用场景非常多&#xff0c;很多大中小厂的项目中都会使用redis作为缓存层使用。 但是Redis作为缓存&#xff0c;也会面临各种使用问题&#xff0c;比如数据一致性&#xff0c;缓存穿透&#xff0c;缓存击穿&#xff0c;缓存雪崩&#…

39.基于SpringBoot + Vue实现的前后端分离-无人智慧超市管理系统(项目 + 论文PPT)

项目介绍 随着互联网时代的发展&#xff0c;传统的线下管理技术已无法高效、便捷的管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;国家在环境要求不断提高的前提下&#xff0c;无人智慧超市管理系统建设也逐渐进入了信…

AI新工具 小模型也有大智慧Qwen1.5-MoE;大模型动态排行榜;马斯克更新Grok-1.5

✨ 1: Qwen1.5-MoE 阿里巴巴一款小型 MoE 模型&#xff0c;只有 27 亿个激活参数&#xff0c;但性能与最先进的 7B 模型&#xff08;如 Mistral 7B 和 Qwen1.5-7B&#xff09;相匹配。 Qwen1.5-MoE是一个使用混合专家模型&#xff08;Mixture-of-Experts&#xff0c;MoE&…

小型分布式文件存储系统GoFastDfs应用简介

前言 最近稍微留意了一下各个文件存储系统的协议&#xff0c;发现minio是LGPLV3, 而fastdfs 是GPL3,这些协议其实对于商业应用是一个大坑。故而寻找一些代替品。 go-fastdfs就是其中之一&#xff0c;官网在&#xff1a; go-fastdfs 具体应用 其实可以直接查看官网教程的。 下…

【学习】JMeter和Postman两种测试工具的主要区别有哪些

Postman和JMeter都是常用的API测试工具&#xff0c;但它们之间存在一些不同之处。以下是Postman和JMeter的主要区别&#xff1a; 语言支持 Postman是一个基于Chrome的应用程序&#xff0c;因此它使用JavaScript作为编程语言。这意味着你可以使用JavaScript来编写测试脚本和断…

element-ui升级到element-plus兼容性问题处理

1.报错&#xff1a;dropdown-item.mjs:42 Uncaught (in promise) TypeError: Cannot destructure property ‘onItemEnter’ of ‘(0 , vue__WEBPACK_IMPORTED_MODULE_0__.inject)(…)’ as it is undefined. 对应的源码位置如下&#xff0c;是elemen-plus中的dropdown-item文件…