51单片机第15步_串口多机通讯使用CRC8校验
本章重点介绍串口多机通讯使用CRC8校验。
数据格式:"$123xxxx*crc8\r\n";
如:"$1234567890ABCDEF*06\r\n"
如:"$1231234567890*31\r\n"
crc8是CRC校验值,为十六进制的ASCII码,不包含'$'和校验值前面的那个'*'
#include <REG51.h> //包含头文件REG51.h,使能51内部寄存器;
#include <intrins.h> //包含头文件intrins.h,要放在stdio.h的头文件之前;
//使能函数: _nop_(); 相当于汇编的NOP指令;
//使能函数: bit _testbit_( bit bit_value ); 对bit_value进行测试,若bit_value=1,返回1,否则返回0;
//使能函数: _cror_( unsigned char x, unsigned char n ); 将字节型变量x的值,向右循环移动n位,然后将其
//值返回;
//相当于汇编的RR A命令;
//使能函数: _iror_( unsigned int x, unsigned char n ); 将双字节型变量x的值,向右循环移动n位,然后将
//其值返回;
//使能函数: _lror_( unsigned long x, unsigned char n ); 将4字节型变量x的值,向右循环移动n位,然后将
//其值返回;
//使能函数: _crol_( unsigned char x, unsigned char n ); 将字节型变量x的值,向左循环移动n位,然后将其
//值返回;
//使能函数: _irol_( unsigned int x, unsigned char n ); 将双字节型变量x的值,向左循环移动n位,然后将
//其值返回;
//使能函数: _lrol_( unsigned long x, unsigned char n ); 将4字节型变量x的值,向左循环移动n位,然后将
//其值返回;
//以上的循环左移和循环右移,同C语言的左移和右移是不同的,使用时要小心;
#include <string.h>
#define OSC_FREQ 11059200L
//#define BAUD_115200 256 - (OSC_FREQ/192L)/115200L //
//#define BAUD_38400 256 - (OSC_FREQ/192L)/38400L //
#define BAUD_Time 1
#if(BAUD_Time==1)
//若波特率加倍,则使用下面参数;
#define BAUD_57600 256 - (OSC_FREQ/192L)/57600L //255
#define BAUD_28800 256 - (OSC_FREQ/192L)/28800L //254
#define BAUD_19200 256 - (OSC_FREQ/192L)/19200L //253
#define BAUD_14400 256 - (OSC_FREQ/192L)/14400L //252
#define BAUD_9600 256 - (OSC_FREQ/192L)/9600L //250
#define BAUD_4800 256 - (OSC_FREQ/192L)/4800L //244
#define BAUD_2400 256 - (OSC_FREQ/192L)/2400L //232
#define BAUD_1200 256 - (OSC_FREQ/192L)/1200L //208
#else
//若波特率不加倍,则使用下面参数;
#define BAUD_9600 256 - (OSC_FREQ/384L)/9600L
#define BAUD_4800 256 - (OSC_FREQ/384L)/4800L
#define BAUD_1200 256 - (OSC_FREQ/384L)/1200L
#endif
#define receive_buffer_size 30
unsigned char receive_buffer[receive_buffer_size];
bit Start_Flag,Receive_End_Flag;
unsigned char next_in;
//unsigned char crc8;
//函数功能:将y的第i_bit位,设置为1;
unsigned char bit_set( unsigned char y,unsigned char i_bit)
{ unsigned char temp;
temp=1<<i_bit;
y=temp|y;
return(y);
}
//函数功能:将y的第i_bit位,设置为0;
unsigned char bit_clear(char y,char i_bit)
{ char temp;
temp=1<<i_bit;
temp=~temp;
y&=temp;
return(y);
}
//函数功能:若test_data的第test_bit位为1,则返回1,否则返回0;
bit bit_test(char test_data,char test_bit)
{ char temp;
bit bit_value;
temp=test_data;
temp=temp>>test_bit;
if( (temp&0x01)==0x01 ) bit_value=1;
else bit_value=0;
return(bit_value);
}
//函数功能:产生8位的CRC校验值;
unsigned char generate_8bit_crc(unsigned char* ptr, unsigned int length, unsigned char pattern)
{ unsigned char *current_data;
unsigned char crc_byte;
unsigned int byte_counter;
unsigned char bit_counter;
current_data = ptr;
crc_byte = *current_data++;
for(byte_counter=0; byte_counter < (length-1); byte_counter++)
{ for(bit_counter=0; bit_counter < 8; bit_counter++)
{ if( !bit_test(crc_byte,7) )
{ crc_byte=crc_byte<<1;
bit_test( *current_data, 7 - bit_counter ) ? crc_byte=bit_set(crc_byte,0) : bit_clear(crc_byte,0);
continue;
}
crc_byte <<= 1;
bit_test(*current_data, 7 - bit_counter) ? crc_byte=bit_set(crc_byte,0) : bit_clear(crc_byte,0);
crc_byte ^= pattern;
}
current_data++;
}
for(bit_counter=0; bit_counter < 8; bit_counter++)
{ if(!bit_test(crc_byte,7))
{ crc_byte <<= 1;
continue;
}
crc_byte <<= 1;
crc_byte ^= pattern;
}
return(crc_byte);
}
//函数功能:将'0'~'9','A'~'F'的ASCII码转换为十六进制(0x00~0x09,0x0a~0x0f)输出;
unsigned char ASCII_To_HEX(unsigned char ASCII )
{ unsigned char temp;
if(ASCII<='9') temp=ASCII-'0';
else temp=ASCII-0x37;
return(temp);
}
//函数功能:从串口读入一个字符;
char getc()
{ char c;
while (!RI);
c = SBUF;
RI = 0;
return (c);
}
//函数功能:从串口输出一个字符;
void putc(char c)
{ SBUF=c;
while (!TI);
TI = 0;
}
//函数功能:接收和发送中断服务函数;
//数据格式:"$123xxxx*crc8\r\n";
//如:"$1234567890ABCDEF*06\r\n"
//如:"$1231234567890*31\r\n"
//crc8是CRC校验值,为十六进制的ASCII码,不包含'$'和校验值前面的那个'*'
void isr_UART(void) interrupt 4 using 0
{ unsigned char temp,crc8,crc_data;
if( RI&&(!Receive_End_Flag) ) //处理接收数据;
{ temp=getc(); //从串口接收一个字节;
receive_buffer[next_in]=temp;
putc(temp);//调试时,使用;
temp=next_in; //保存下标值;
next_in++; //修改下标值;
if(temp<3) //比对从机地址是否为"$123"
{ if( Start_Flag )
{ if( (temp==0)&&(receive_buffer[0]!='1') ) next_in=0;
if( (temp==1)&&(receive_buffer[1]!='2') ) next_in=0;
if( (temp==2)&&(receive_buffer[2]!='3') ) next_in=0;
}
else
{ if(receive_buffer[0]=='$') Start_Flag=1;
next_in=0;
}
}
else
{ if( (receive_buffer[temp-1]=='\r')&&(receive_buffer[temp]=='\n') ) //接收到"\r\n"
{ crc8=generate_8bit_crc( receive_buffer,temp-4,1); //计算接收到数据的CRC8校验值;
crc_data=ASCII_To_HEX(receive_buffer[temp-3]);
crc_data=(crc_data<<4)&0xf0; //获取CRC校验值的高4位值;
temp=ASCII_To_HEX(receive_buffer[temp-2]); //获取CRC校验值的低4位值;
crc_data=crc_data+temp; //获取接收到的CRC校验值;
if(crc8==crc_data) //若CRC校验值正确,则执行下面语句;
{ Receive_End_Flag=1;
}
next_in=0; //接收完成;
Start_Flag=0; //为下次接收起始标志做备;
}
}
if(next_in>=receive_buffer_size)
{ next_in=0; //接收数据太长,取消接收;
Start_Flag=0; //为下次接收起始标志做备;
}
}
}
//函数功能:若接收到的数据有效,则打印出来;
void Print_Receive_data()
{ unsigned char i;
i=0;
if(Receive_End_Flag)
{ while(receive_buffer[i]!='\n')
{ putc(receive_buffer[i]);
i++;
}
putc(receive_buffer[i]); //打印'\n';
Receive_End_Flag=0;
}
}
//函数功能:初始化串口,设置波特率为9600bps@11.0592MHz,使能接收,使用8位UART;
void Serial_Port_Initialization()
{ PCON = 0x80;
SCON=0x50; //串行控制寄存器: SM0,SM1,SM2,REN,TB8,RB8,TI,RI
//SM1:SM0=01,选择方式1,SM2=0,表示非多机通讯,8-bit UART;
//REN=1,使能接收;
TMOD&=0x0f;
TMOD|= 0x20;
//定时器方式控制寄存器:GATE1,C/T1,M11,M10,GATE0,C/T0,M01,M00
//GATE=0,TR置1便可以启动Timer;GATE=1,TR置1,且INT脚输入高电平,才可以启动Timer;
//M11:M10=10,选择方式2,8位自动重装载;
TH1=BAUD_9600; //TH1: reload value for 9600 baud @11.0592MHz;
TL1=TH1;
TR1=1; //启动Timer1;
TI=0; //为下次发送做准备;
RI=0;
next_in=0;
Start_Flag=0;
Receive_End_Flag=0; //将接收完成标志设置为0;
ES=1; //使能串口接收和发送中断;
EA=1; //开总中断
}
//函数功能: Delay 50us
void delay_50us(unsigned char _50us)
{ while(_50us--)
{ _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
void main(void)
{
Serial_Port_Initialization(); //初始化串口,设置波特率9600bps@11.0592MHz,使能接收,使用8位UART;
for(;;)
{ Print_Receive_data(); //若接收到的数据有效,则打印出来;
delay_50us(20); //延时1ms;
}
}
/*
//函数功能:将hex8的低4位(0~9,a~f)转换为'0'~'9','A'~'F'输出;
unsigned char HEX_To_ASCII(unsigned char hex8 )
{unsigned char temp;
temp=hex8;
temp=(unsigned char)(temp&0x0f); //求低4位值;
if(temp<0x0a) temp+=0x30; //将低4位值(在0~9中)转换为ASCII码;
else temp+=0x37; //将低4位值(在a~f中)转换为大写字母的ASCII码;
return(temp);
}
//函数功能:将'0'~'9','A'~'F'的ASCII码转换为十六进制(0x00~0x09,0x0a~0x0f)输出;
unsigned char ASCII_To_HEX(unsigned char ASCII )
{ unsigned char temp;
if(ASCII<='9') temp=ASCII-'0';
else temp=ASCII-0x37;
return(temp);
}
//函数功能:将y的第i_bit位,设置为1;
unsigned char bit_set( unsigned char y,unsigned char i_bit)
{ unsigned char temp;
temp=1<<i_bit;
y=temp|y;
return(y);
}
//函数功能:将y的第i_bit位,设置为0;
unsigned char bit_clear(char y,char i_bit)
{ char temp;
temp=1<<i_bit;
temp=~temp;
y&=temp;
return(y);
}
//函数功能:若test_data的第test_bit位为1,则返回1,否则返回0;
bit bit_test(char test_data,char test_bit)
{ char temp;
bit bit_value;
temp=test_data;
temp=temp>>test_bit;
if( (temp&0x01)==0x01 ) bit_value=1;
else bit_value=0;
return(bit_value);
}
//函数功能:产生8位的CRC校验值;
unsigned char generate_8bit_crc(unsigned char* ptr, unsigned int length, unsigned char pattern)
{ unsigned char *current_data;
unsigned char crc_byte;
unsigned int byte_counter;
unsigned char bit_counter;
current_data = ptr;
crc_byte = *current_data++;
for(byte_counter=0; byte_counter < (length-1); byte_counter++)
{ for(bit_counter=0; bit_counter < 8; bit_counter++)
{ if( !bit_test(crc_byte,7) )
{
crc_byte=crc_byte<<1;
bit_test( *current_data, 7 - bit_counter ) ? crc_byte=bit_set(crc_byte,0) : bit_clear(crc_byte,0);
continue;
}
crc_byte <<= 1;
bit_test(*current_data, 7 - bit_counter) ? crc_byte=bit_set(crc_byte,0) : bit_clear(crc_byte,0);
crc_byte ^= pattern;
}
current_data++;
}
for(bit_counter=0; bit_counter < 8; bit_counter++)
{ if(!bit_test(crc_byte,7))
{ crc_byte <<= 1;
continue;
}
crc_byte <<= 1;
crc_byte ^= pattern;
}
return(crc_byte);
}
//函数功能:将y的第i_bit位,设置为1;调用方式: sbit_set(&x,i);
void bit_set( unsigned char *y,unsigned char i_bit)
{ unsigned char temp;
temp=1<<i_bit;
y[0]=temp|y[0];
}
//函数功能:将y的第i_bit位,设置为0;调用方式: sbit_clear(&x,i);
void bit_clear(char *y,char i_bit)
{ char temp;
temp=1<<i_bit;
temp=~temp;
y[0]&=temp;
}
//函数功能:若test_data的第test_bit位为1,则返回1,否则返回0;
void bit_test(char test_data,char test_bit,unsigned char *return_value)
{ char temp;
//bit bit_value;
temp=test_data;
temp=temp>>test_bit;
if( (temp&0x01)==0x01 ) return_value[0]=1;
else return_value[0]=0;
//return(bit_value);
}
//函数功能:产生8位的CRC校验值;
void generate_8bit_crc(unsigned char* ptr, unsigned int length, unsigned char *return_value )
{ unsigned char tenp_value;
unsigned char *current_data;
unsigned char crc_byte;
unsigned int byte_counter;
unsigned char bit_counter;
unsigned char pattern=0x01;
current_data = ptr;
crc_byte = *current_data++;
for(byte_counter=0; byte_counter < (length-1); byte_counter++)
{ for(bit_counter=0; bit_counter < 8; bit_counter++)
{ bit_test( crc_byte,7,&tenp_value );
//if( !bit_test(crc_byte,7) )
if(tenp_value==0)
{
crc_byte=crc_byte<<1;
bit_test( *current_data, 7 - bit_counter,&tenp_value );
//bit_test( *current_data, 7 - bit_counter ) ? bit_set(crc_byte,0) : bit_clear(crc_byte,0);
if(tenp_value==1) bit_set(&crc_byte,0);
else bit_clear(&crc_byte,0);
continue;
}
crc_byte <<= 1;
bit_test( *current_data, 7 - bit_counter,&tenp_value );
//bit_test(*current_data, 7 - bit_counter) ? crc_byte=bit_set(crc_byte,0) : bit_clear(crc_byte,0);
if(tenp_value==1) bit_set(&crc_byte,0);
else bit_clear(&crc_byte,0);
crc_byte ^= pattern;
}
current_data++;
}
for(bit_counter=0; bit_counter < 8; bit_counter++)
{ bit_test( crc_byte,7,&tenp_value );
//if(!bit_test(crc_byte,7))
if(tenp_value==0)
{ crc_byte <<= 1;
continue;
}
crc_byte <<= 1;
crc_byte ^= pattern;
}
return_value[0]=crc_byte;
//return(crc_byte);
}
*/
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
51单片机第15步_串口多机通讯使用CRC8校验
本章重点介绍串口多机通讯使用CRC8校验。 数据格式:"$123xxxx*crc8\r\n"; 如:"$1234567890ABCDEF*06\r\n" 如:"$1231234567890*31\r\n" crc8是CRC校验值,为十六进制的ASCII码,不包含$和校验值前面的那个* #include <REG51.h> //包含…...
![](https://img-blog.csdnimg.cn/direct/e6d05d3a91c6414d997c6552d9accd89.png)
WPF----进度条ProgressBar(渐变色)
ProgressBar 是一种用于指示进程或任务的进度的控件,通常在图形用户界面(GUI)中使用。它提供了一种视觉反馈,显示任务的完成程度,帮助用户了解任务的进展情况。 基本特性 Minimum 和 Maximum 属性: 这些属…...
![](https://www.ngui.cc/images/no-images.jpg)
Apipost接口测试工具的原理及应用详解(四)
本系列文章简介: 随着软件行业的快速发展,API(应用程序编程接口)作为不同软件组件之间通信的桥梁,其重要性日益凸显。API的质量直接关系到软件系统的稳定性、性能和用户体验。因此,对API进行严格的测试成为…...
![](https://img-blog.csdnimg.cn/direct/7d16118285644d54a2cfa09d1d32cb15.png)
【图论】200. 岛屿问题
200. 岛屿问题 难度:中等 力扣地址:https://leetcode.cn/studyplan/top-100-liked/ 问题描述 给你一个由 1(陆地)和 0(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围&…...
![](https://www.ngui.cc/images/no-images.jpg)
AI学习指南机器学习篇-随机森林的优缺点
AI学习指南机器学习篇-随机森林的优缺点 引言 机器学习是人工智能领域的重要分支,其中随机森林(Random Forest)算法以其高性能和广泛应用而备受瞩目。然而,就像任何其他算法一样,随机森林也有其优缺点。本文将深入探讨随机森林算法的优势和…...
![](https://www.ngui.cc/images/no-images.jpg)
基于boost::beast的http服务器(上)
文章目录 1.beast网落库介绍2.相关类及api3.异步读写的处理3.1异步写案例3.2异步读案例 1.beast网落库介绍 Beast网络库是一个基于Boost库的C网络库,特别用于开发高性能的网络应用程序。它提供了一组易于使用的API,主要用于处理HTTP和WebSocket协议&…...
![](https://www.ngui.cc/images/no-images.jpg)
深度学习之近端策略优化(Proximal Policy Optimization,PPO)
PPO(Proximal Policy Optimization,近端策略优化)是深度强化学习中的一种算法,属于策略梯度方法中的一种。PPO通过优化策略来最大化累积奖励,具有稳定性好、易于调参等优点,是目前广泛应用的一种深度强化学习算法。下面介绍PPO的基本原理和流程。 PPO基本原理 PPO算法的…...
![](https://img-blog.csdnimg.cn/img_convert/8626aed1c9c3c239475fa95cd7c5e0eb.jpeg)
用pycharm进行python爬虫的步骤
使用 pycharm 进行 python 爬虫的步骤:下载并安装 pycharm。创建一个新项目。安装 requests 和 beautifulsoup 库。编写爬虫脚本,包括获取页面内容、解析 html 和提取数据的代码。运行爬虫脚本。保存和处理提取到的数据。 用 PyCharm 进行 Python 爬虫的…...
![](https://www.ngui.cc/images/no-images.jpg)
重写功能 rewrite
Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之 一,用于实现URL的重写,URL的…...
![](https://www.ngui.cc/images/no-images.jpg)
ISO19110操作要求类中/req/operation/operation-attributes的详细解释
/req/operation/operation-attributes 要求: 只有要素属性(feature attributes)可以通过‘observesValueOf’、‘triggeredByValuesOf’或‘affectsValuesOf’关联角色与要素操作(feature operations)关联。 具体解释 定义 要…...
![](https://img-blog.csdnimg.cn/direct/75c1291905594f129ae6495a80125c40.png)
访客(UV)、点击量(PV)、IP、访问量(VV)概念
1、https://www.cnblogs.com/QingPingZm/articles/13855808.htmlhttps://www.cnblogs.com/QingPingZm/articles/13855808.html...
![](https://img-blog.csdnimg.cn/direct/ae2d4628c56e4e1b84a280a32d83019b.png)
C++系统编程篇——Linux第一个小程序--进度条
(1)先引入一个概念:行缓冲区 \r和\n \r表示回车 \n表示回车并换行 ①代码一 #include<stdio.h> #include<unistd.h> int main()…...
![](https://img-blog.csdnimg.cn/direct/7d2c91a5c157404997578726d2416e0f.jpeg)
一个中文和越南语双语版本的助贷平台开源源码
一个中文和越南语双语版本的助贷平台开源源码。后台试nodejs。 后台 代理 前端均为vue源码,前端有中文和越南语。 前端ui黄色大气,逻辑操作简单,注册可对接国际短信,可不对接。 用户注册进去填写资料,后台审批&…...
![](https://img-blog.csdnimg.cn/direct/8f705c8b21984997bc8a2329b8c71f21.png)
【游戏引擎之路】登神长阶(五)
5月20日-6月4日:攻克2D物理引擎。 6月4日-6月13日:攻克《3D数学基础》。 6月13日-6月20日:攻克《3D图形教程》。 6月21日-6月22日:攻克《Raycasting游戏教程》。 6月23日-6月30日:攻克《Windows游戏编程大师技巧》。 …...
![](https://www.ngui.cc/images/no-images.jpg)
FireAct:使用智能体(agent)微调大语言模型
1.概述 近年来,针对语言模型(LMs)的研究致力于探索其与外部工具或环境互动的能力,以推进新型语言代理的发展。此类代理具备从环境反馈中汲取新知识、通过语言推理进行连续决策,以及借助自我反思提升任务解决能力的能力。工业界的进展,如ChatGPT插件,凸显了语言代理在实际…...
![](https://img-blog.csdnimg.cn/direct/77fb258ebdb64ad68d7d38c50f611a4e.png)
20240626让飞凌的OK3588-C开发板在相机使用1080p60分辨率下预览
20240626让飞凌的OK3588-C开发板在相机使用1080p60分辨率下预览 2024/6/26 15:15 4.2.1 全编译测试 在源码路径内,提供了编译脚本 build.sh,运行该脚本对整个源码进行编译,需要在终端切换到解压 出来的源码路径,找到 build.sh 文件…...
![](https://img-blog.csdnimg.cn/bea4c65a98c844bb8a68befeec0f2c62.png)
python数据分析——数据分类汇总与统计
数据分类汇总与统计 前言一、Groupby分类统计语法按列分组示例一示例二示例三 遍历各分组示例 使用字典和Series分组示例 使用函数分组示例 二、数据聚合groupby的聚合函数示例一示例二 逐列及多函数应用示例一示例二 返回不含行索引的聚合数据示例 三、一般性的“拆分-应用-合…...
![](https://img-blog.csdnimg.cn/direct/e2df944ec66249c08f0010367f22e477.png)
iOS17系统适配
iOS17 新功能 文章目录 iOS17 新功能iOS17支持哪几款机型Xcode15新特性iOS17-开发适配指南 横屏待机 在iOS 17中,还带来了横屏待机功能,苹果将这个新功能命名为“Standby”模式,为 iPhone 带来了全新的玩法。iPhone启用之后,默认情…...
![](https://i-blog.csdnimg.cn/direct/8ce58869eb934c9c9c686585ff712cc1.png)
树洞陪聊陪玩交友程序系统源码,解锁交友新体验
在繁忙的都市生活中,你是否渴望找到一片属于自己的秘密花园,倾诉心声、分享快乐?今天,就让我带你走进这片名为“树洞”的神秘之地,感受陪聊陪玩交友的全新魅力! 🌳树洞陪聊陪玩交友程序系统 你…...
![](https://img-blog.csdnimg.cn/direct/9f9396801cae41ab8024421d29c25a62.png)
区间动态规划——最长回文子序列长度(C++)
把夜熬成粥,然后喝了它。 ——2024年7月1日 书接上回:区间动态规划——最长回文子串(C)-CSDN博客,大家有想到解决办法吗? 题目描述 给定一个字符串s(s仅由数字和英文大小写字母组成࿰…...
![](https://img-blog.csdnimg.cn/img_convert/0387860c1cff6a3df560d863c467e305.png)
无人机远程控制:北斗短报文技术详解
无人机(UAV)技术的快速发展和应用,使得远程控制成为了一项关键技术。无人机远程控制涉及无线通信、数据处理等多个方面,其中北斗短报文技术以其独特的优势,在无人机远程控制领域发挥着重要作用。本文将详细解析无人机远…...
![](https://img-blog.csdnimg.cn/img_convert/ca5751aea8cc236eace9eea1963d4b99.png)
240627_关于CNN中图像维度变化问题
240627_关于CNN中图像维度变化问题 在学习一些经典模型时,其中得维度变化关系总搞不太明白,集中学习了以下,在此作以梳理总结: 一般来说涉及到的维度变换都是四个维度,当batch size4,图像尺寸为640*640&a…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N7T8)
食品行业怎么用JSON群发短信
食品作为日常生活不可缺少的元素,市场需求是很稳定的,但是份额就那么多,商家都要来抢占的话,就需要运营推广各凭本事,市场运营中选择合适的推广方式,可以增加店铺销售额,很多实体店或商城都会建…...
![](https://img-blog.csdnimg.cn/direct/a7f0ea111aa34b7c82aba916ba525c39.png)
MySQL高级-MVCC-隐藏字段
文章目录 1、介绍2、测试2.1、进入服务器中的 /var/lib/mysql/atguigu/2.2、查看有主键的表 stu2.3、查看没有主键的表 employee2.3.1、创建表 employee2.3.2、查看表结构及其其中的字段信息 1、介绍 ---------------- | id | age | name | ---------------- | 1 | 1 | Js…...
![](https://www.ngui.cc/images/no-images.jpg)
探索PcapPlusPlus开源库:网络数据包处理与性能优化
文章目录 0. 本文概要1. PcapPlusPlus介绍1.1 概述1.2主要特性和功能1.3 PcapPlusPlus 主要模块关系和依赖1.4 网络协议层处理过程 2. 实例2.1 基于 PcapPlusPlus 的应用程序设计和封装流程:2.2 多线程示例代码2.3 代码说明: 3. 程序性能进一步优化3.1 避…...
![](https://img-blog.csdnimg.cn/img_convert/12895f5bdee81153b1a304c7338d3100.webp?x-oss-process=image/format,png)
深入理解SSH:网络安全的守护者
在当今数字化时代,网络安全已成为全球关注的焦点。随着网络攻击手段的不断升级,保护数据传输的安全性变得尤为重要。SSH(Secure Shell)作为一种安全的网络协议,为远程登录和网络服务提供了强大的安全保障,成…...
![](https://img-blog.csdnimg.cn/direct/8866f7e490964806ad42b6bd79b46a30.png)
DDD学习笔记四
领域模型的构建 基础领域模型的基本组成有名称、属性、关联、职责、事件和异常 发掘领域概念3种策略: 1)学习已有系统,重用已有模型 2)使用分类标签。分类标签来源于领域,需要我们研究一些资料并做一些提炼。从采用5W…...
![](https://www.ngui.cc/images/no-images.jpg)
Head First设计模式中的典型设计模式解析与案例分析
Head First设计模式中的典型设计模式解析与案例分析 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 《Head First设计模式》是一本广受欢迎的书籍,…...
![](https://img-blog.csdnimg.cn/direct/72478754fa154a9fa3d145b16846369f.png)
iptables 防火墙(一)
iptables 防火墙(一) 一、Linux 防火墙基础防火墙分类 二、iptables 的表、链结构规则表规则链数据包过滤的匹配流程 三、编写防火墙规则iptables 的安装iptables的基本语法规则的匹配条件通用匹配隐含匹配显式匹配 四、总结 在网络安全的世界里…...
![](https://img-blog.csdnimg.cn/direct/235de12c74c44c908f65735fc6b761e3.png)
数据库物理结构设计-定义数据库模式结构(概念模式、用户外模式、内模式)、定义数据库、物理结构设计策略
一、引言 如何基于具体的DBMS产品,为数据库逻辑结构设计的结果,即关系数据库模式,制定适合应用要求的物理结构 1、在设计数据库物理结构前,数据库设计人员首先 要充分了解所用的DBMS产品的功能、性能和特点,包括提供…...
![](https://img-blog.csdnimg.cn/direct/cecbb8125e914c2094aeea085b08427b.png)
QT加载安装外围依赖库的翻译文件后翻译失败的现象分析:依赖库以饿汉式的形式暴露单例接口导致该现象的产生
1、前提说明 VS2019 QtClassLibaryDll是动态库,QtWidgetsApplication4是应用程序。 首先明确:动态库以饿汉式的形式进行单例接口暴露; 然后,应用程序加载动态库的翻译文件并进行全局安装; // ...QTranslator* trans = new QTranslator();//qDebug() << trans->…...
![](https://img-blog.csdnimg.cn/direct/45e83d2f1cff4845a4f2e7a613034e1b.png)
13_旷视轻量化网络--ShuffleNet V2
回顾一下ShuffleNetV1:08_旷视轻量化网络--ShuffleNet V1-CSDN博客 1.1 简介 ShuffleNet V2是在2018年由旷视科技的研究团队提出的一种深度学习模型,主要用于图像分类和目标检测等计算机视觉任务。它是ShuffleNet V1的后续版本,重点在于提供更高效的模…...
![](https://img-blog.csdnimg.cn/direct/ffaa4a8ab08d44d4bd903fda0a23a43b.png)
Linux系统编程--进程间通信
目录 1. 介绍 1.1 进程间通信的目的 1.2 进程间通信的分类 2. 管道 2.1 什么是管道 2.2 匿名管道 2.2.1 接口 2.2.2 步骤--以父子进程通信为例 2.2.3 站在文件描述符角度-深度理解 2.2.4 管道代码 2.2.5 读写特征 2.2.6 管道特征 2.3 命名管道 2.3.1 接口 2.3.2…...
![](https://img-blog.csdnimg.cn/direct/a645d12a31d14a3eab30c46c32dede57.png)
docker-本地部署-后端
前置条件 后端文件 这边是一个简单项目的后端文件目录 docker服务 镜像文件打包 #命令行 docker build -t author/chatgpt-ai-app:1.0 -f ./Dockerfile .红框是docker所在文件夹 author:docker用户名chatgpt-ai-app:打包的镜像文件名字:1.0 &#…...
![](https://www.ngui.cc/images/no-images.jpg)
TLS + OpenSSL + Engine + PKCS#11 + softhsm2 安全通信
引擎库路径只有在 /lib 下才能被 "LOAD" 识别到,OpenSSL的ReadMe给的示例在/lib,大概是在构建OpenSSL时默认的configure指定了lib路径 // #define PKCS11_ENGINE_PATH "/usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so" #define …...
![](https://img-blog.csdnimg.cn/direct/a1a57b088dfd4138bb0ef37a01e4b59e.gif#pic_center)
Unity实现简单的MVC架构
文章目录 前言MVC基本概念示例流程图效果预览后话 前言 在Unity中,MVC(Model-View-Controller)框架是一种架构模式,用于分离游戏的逻辑、数据和用户界面。MVC模式可以帮助开发者更好地管理代码结构,提高代码的可维护性…...
![](https://img-blog.csdnimg.cn/direct/d3d1fc9535a142eeb82860d4ad35e112.gif#pic_center)
【简单讲解下OneFlow深度学习框架】
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...
![](https://img-blog.csdnimg.cn/direct/1ef71e1c1904476bb2df844a7c8f2e20.png)
FastGPT 调用Qwen 测试Hello world
Ubuntu 安装Qwen/FastGPT_fastgpt message: core.chat.chat api is error or u-CSDN博客 参考上面文档 安装FastGPT后 登录, 点击右上角的 新建 点击 这里,配置AI使用本地 ollama跑的qwen模型 问题:树上有3只鸟,开了一枪&#…...
![](https://img-blog.csdnimg.cn/img_convert/b9cc1af5cb88b9ecdc9913fa6a458d8b.png)
Golang-GMP
GMP调度 golang-GMP语雀笔记整理 GMP调度设计目的,为何设计GMP?GMP的底层实现几个核心数据结构GMP调度流程 设计目的,为何设计GMP? 无论是多进程、多线程目的都是为了并发提高cpu的利用率,但多进程、多线程都存在局限性。比如多进程通过时…...
![](https://img-blog.csdnimg.cn/direct/56df1eefacac46949ba89677021aadad.png)
【PythonWeb开发】Flask自定义模板路径和静态资源路径
在大型的 Flask 项目中,确实可能会有多个子应用(Blueprints),每个子应用可能都有自己的静态文件和模板。为了更好地管理和组织这些资源,可以使用static_folder 和template_folder 属性来统一管理。必须同时设置好主应用…...
![](https://img-blog.csdnimg.cn/direct/507f2b70b22f404cb8fc2eadacd24ecf.jpeg#pic_center)
Java对象创建过程
在日常开发中,我们常常需要创建对象,那么通过new关键字创建对象的执行中涉及到哪些流程呢?本文主要围绕这个问题来展开。 类的加载 创建对象时我们常常使用new关键字。如下 ObjectA o new ObjectA();对虚拟机来讲首先需要判断ObjectA类的…...
![](https://img-blog.csdnimg.cn/direct/0712d6b93d4943df967c31f4d7acd552.png)
Does a vector database maintain pre-vector chunked data for RAG systems?
题意:一个向量数据库是否为RAG系统维护预向量化分块数据? 问题背景: I believe that when using an LLM with a Retrieval-Augmented Generation (RAG) approach, the results retrieved from a vector search must ultimately be presented…...
![](https://www.ngui.cc/images/no-images.jpg)
Rust-11-错误处理
Rust 将错误分为两大类:可恢复的(recoverable)和 不可恢复的(unrecoverable)错误。对于一个可恢复的错误,比如文件未找到的错误,我们很可能只想向用户报告问题并重试操作。不可恢复的错误总是 b…...
![](https://www.ngui.cc/images/no-images.jpg)
自动化测试:使用Postman进行接口测试与脚本编写
Postman 是一种流行的 API 测试工具,广泛应用于开发和测试过程中。它不仅可以用于手动测试,还支持自动化测试和脚本编写,以确保 API 的可靠性和性能。本文将详细介绍如何使用 Postman 进行接口测试与脚本编写,帮助你更高效地进行自…...
![](https://img-blog.csdnimg.cn/direct/dc34a23dfe7f43329864b91f687ec80d.png)
ONLYOFFICE 8.1 桌面编辑器测评:引领数字化办公新潮流
目录 前言 下载安装 新功能概述 1.PDF 编辑器的改进 2. 演示文稿中的幻灯片版式 3.语言支持的改进 4. 隐藏“连接到云”板块 5. 页面颜色设置和配色方案 界面设计:简洁大方,操作便捷 性能评测:稳定流畅,高效运行 办公环…...
![](https://img-blog.csdnimg.cn/direct/de6bd4e8e37c4e61a79c37b2551d466e.png)
基于大语言模型LangChain框架:知识库问答系统实践
ChatGPT 所取得的巨大成功,使得越来越多的开发者希望利用 OpenAI 提供的 API 或私有化模型开发基于大语言模型的应用程序。然而,即使大语言模型的调用相对简单,仍需要完成大量的定制开发工作,包括 API 集成、交互逻辑、数据存储等…...
![](https://www.ngui.cc/images/no-images.jpg)
解锁Transformer的鲁棒性:深入分析与实践指南
🛡️ 解锁Transformer的鲁棒性:深入分析与实践指南 Transformer模型自从由Vaswani等人在2017年提出以来,已经成为自然语言处理(NLP)领域的明星模型。然而,模型的鲁棒性——即模型在面对异常、恶意或不寻常…...
![](https://img-blog.csdnimg.cn/direct/ad5e8d19bcaf42339feb1056934baca0.png)
mybatis#号和$区别
在MyBatis中,#{}和${}都是用于实现动态SQL的占位符,但它们在使用场景和安全性上有明显的区别: 用途区别: #{}主要用于传递接口传输过来的具体数据,如参数值,它可以防止SQL注入,因为MyBatis会…...
![](https://img-blog.csdnimg.cn/img_convert/4d44e1263932e8e922d4b2b90046c154.png)
AI绘画 Stable Diffusion【实战进阶】:图片的创成式填充,竖图秒变横屏壁纸!想怎么扩就怎么扩!
大家好,我是向阳。 所谓图片的创成式填充,就是基于原有图片进行扩展或延展,在保证图片合理性的同时实现与原图片的高度契合。是目前图像处理中常见应用之一。之前大部分都是通过PS工具来处理的。今天我们来看看在AI绘画工具 Stable Diffusio…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux内核 -- 汇编结合ko案例之PMU获取cpu cycle技术
ARMv7汇编实现周期计数读取与清空 本文档详细描述了如何在ARMv7平台上使用汇编语言编写周期计数器读取与清空函数,如何在内核模块中导出这些函数供其他模块调用,以及如何使用Netlink接口供用户态程序进行调用。 1. 汇编函数实现 首先,编写…...
![](https://img-blog.csdnimg.cn/direct/95f0d59eeb244e81abe8e6ba26265bc5.png)
昇思25天学习打卡营第11天|基于MindSpore通过GPT实现情感分类
学AI还能赢奖品?每天30分钟,25天打通AI任督二脉 (qq.com) 基于MindSpore通过GPT实现情感分类 %%capture captured_output # 实验环境已经预装了mindspore2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号 !pip uninsta…...
![](https://www.ngui.cc/images/no-images.jpg)
探索QCS6490目标检测AI应用开发(二):摄像头视频的拉取和解码
作为《探索QCS6490目标检测AI应用开发》文章,紧接上一期,我们介绍如何在应用程序中拉取视频流,并且用硬件解码,得到逐帧的图像画面。我们使用了高通的Intelligent Multimedia SDK(IM SDK)完成视频的拉流和硬…...
![](https://www.ngui.cc/images/no-images.jpg)
opencv简单小项目
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像和视频处理功能。使用OpenCV可以开发各种简单的小项目,例如: 图像基本操作: 读取和显示图像。调整…...
![](https://www.ngui.cc/images/no-images.jpg)
iOS 真机打包,证书报错No signing certificate “iOS Distribution” found
之前将APP从旧账号转移到了新账号,在新账号打包的时候遇到的证书问题。 因为新账号还没有导出“本地签名证书”,也还没有创建新的“发布证书”。当我创建好这两者之后,在xcode打包的时候就报错了。 报错信息: No signing certifi…...
![](https://www.ngui.cc/images/no-images.jpg)
【嵌入式——FreeRTOS】队列集
【嵌入式——FreeRTOS】队列集 简介相关API代码示例 简介 一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以使用队列集。 作用:用于对多个队列或信号量进行“监听”,其中不…...
![](https://img-blog.csdnimg.cn/direct/a5ca0a57472b4339aeaef351a5cf5941.png#pic_center)
【ACM_2023】3D Gaussian Splatting for Real-Time Radiance Field Rendering
【ACM_2023】3D Gaussian Splatting for Real-Time Radiance Field Rendering 一、前言Abstract1 INTRODUCTION2 RELATED WORK2.1 Traditional Scene Reconstruction and Rendering2.2 Neural Rendering and Radiance Fields2.3 Point-Based Rendering and Radiance Fields 3 O…...
![](https://www.ngui.cc/images/no-images.jpg)
来自90年前的首款银箭赛车,梅赛德斯-奔驰W25创造无数传奇
90年前,这款银色单座赛车奠定了“银箭”这个名称,至今仍适用于梅赛德斯-奔驰的赛车。梅赛德斯-奔驰W25于1934年6月3日在纽博格林的艾菲尔赛事中首次亮相,Manfred von Brauchitsch赢得比赛,创下平均时速122.5公里的新纪录。这是成功故事的开始,延续至今天的梅赛德斯-AMG Pe…...
![](https://www.ngui.cc/images/no-images.jpg)
加量不加价!问界新M7Ultra导购哪款更值得买?
本以为是焕新版,最终命名为Ultra版 名字不重要我们扒一扒新的M7 Ultra有哪些升级 哪款车型才是更值得入的呢?四款车型,5座车以及6座车分别对应单电机后驱版+四驱版车型1.5T发动机、42度电池包两驱车型纯电续航240公里四驱车型纯电续航210公里代替新M7的四款智驾车型7月1日前…...
![](https://www.ngui.cc/images/no-images.jpg)
马斯克:若苹果在操作系统层面集成OpenAI,我将禁止苹果设备进入我的公
文|编辑部整理 编辑|大风马斯克:若苹果在操作系统层面集成OpenAI,我将禁止苹果设备进入我的公司马斯克表示,如果苹果与OpenAI合作,在操作系统层面整合ChatGPT,我将禁止那些携带苹果设备的人来访。届时,访客将需要在公司大门口接受针对苹果设备的设备检查。马斯克提及,“…...
![](https://img-blog.csdnimg.cn/direct/856076db2d46428dbaa94b453557fad2.gif#pic_center)
Django入门全攻略:从零搭建你的第一个Web项目
系列文章目录 努力ing Django入门全攻略:从零搭建你的第一个Web项目努力ing… 文章目录 系列文章目录前言一、Django1.1 Django安装1.2 Django项目创建1.3 目录介绍 二、子应用2.1 子应用创建2.2 目录结构2.3 子应用注册2.4 子应用视图逻辑2.4.1 编写视图2.4.2 编写…...
![](https://www.ngui.cc/images/no-images.jpg)
Flutter 中的 RichText 小部件:全面指南
Flutter 中的 RichText 小部件:全面指南 Flutter 是一个流行的跨平台 UI 工具包,它允许开发者使用 Dart 语言来构建高性能、高保真的移动应用。在 Flutter 中,RichText 是一个非常有用的小部件,它允许开发者在同一个文本行中混合…...
![](https://img-blog.csdnimg.cn/direct/44198aee94be46f58e6cde9485b52b78.png)
SAP 生产订单报工函数BAPI_PRODORDCONF_CREATE_TT不返回报错信息
最近财务一直反馈MES报工的数据都没有成本,然后去查看原因发现是财务当月的KP26的价格没有进行维护,导致没有收集到工单的报工成本。 但是在前台操作CO11 报工的时候,系统会给出报错的信息 但是我们在调用函数BAPI_PRODORDCONF_CREATE_TT的时候,系统并没有返回报错的信息…...