当前位置: 首页 > news >正文

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);

}

*/

相关文章:

51单片机第15步_串口多机通讯使用CRC8校验

本章重点介绍串口多机通讯使用CRC8校验。 数据格式:"$123xxxx*crc8\r\n"; 如:"$1234567890ABCDEF*06\r\n" 如:"$1231234567890*31\r\n" crc8是CRC校验值,为十六进制的ASCII码,不包含$和校验值前面的那个* #include <REG51.h> //包含…...

WPF----进度条ProgressBar(渐变色)

ProgressBar 是一种用于指示进程或任务的进度的控件&#xff0c;通常在图形用户界面&#xff08;GUI&#xff09;中使用。它提供了一种视觉反馈&#xff0c;显示任务的完成程度&#xff0c;帮助用户了解任务的进展情况。 基本特性 Minimum 和 Maximum 属性&#xff1a; 这些属…...

Apipost接口测试工具的原理及应用详解(四)

本系列文章简介&#xff1a; 随着软件行业的快速发展&#xff0c;API&#xff08;应用程序编程接口&#xff09;作为不同软件组件之间通信的桥梁&#xff0c;其重要性日益凸显。API的质量直接关系到软件系统的稳定性、性能和用户体验。因此&#xff0c;对API进行严格的测试成为…...

【图论】200. 岛屿问题

200. 岛屿问题 难度&#xff1a;中等 力扣地址&#xff1a;https://leetcode.cn/studyplan/top-100-liked/ 问题描述 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&…...

AI学习指南机器学习篇-随机森林的优缺点

AI学习指南机器学习篇-随机森林的优缺点 引言 机器学习是人工智能领域的重要分支&#xff0c;其中随机森林(Random Forest)算法以其高性能和广泛应用而备受瞩目。然而&#xff0c;就像任何其他算法一样&#xff0c;随机森林也有其优缺点。本文将深入探讨随机森林算法的优势和…...

基于boost::beast的http服务器(上)

文章目录 1.beast网落库介绍2.相关类及api3.异步读写的处理3.1异步写案例3.2异步读案例 1.beast网落库介绍 Beast网络库是一个基于Boost库的C网络库&#xff0c;特别用于开发高性能的网络应用程序。它提供了一组易于使用的API&#xff0c;主要用于处理HTTP和WebSocket协议&…...

深度学习之近端策略优化(Proximal Policy Optimization,PPO)

PPO(Proximal Policy Optimization,近端策略优化)是深度强化学习中的一种算法,属于策略梯度方法中的一种。PPO通过优化策略来最大化累积奖励,具有稳定性好、易于调参等优点,是目前广泛应用的一种深度强化学习算法。下面介绍PPO的基本原理和流程。 PPO基本原理 PPO算法的…...

用pycharm进行python爬虫的步骤

使用 pycharm 进行 python 爬虫的步骤&#xff1a;下载并安装 pycharm。创建一个新项目。安装 requests 和 beautifulsoup 库。编写爬虫脚本&#xff0c;包括获取页面内容、解析 html 和提取数据的代码。运行爬虫脚本。保存和处理提取到的数据。 用 PyCharm 进行 Python 爬虫的…...

重写功能 rewrite

Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求&#xff0c;此功能依靠 PCRE(perl compatible regular expression)&#xff0c;因此编译之前要安装PCRE库&#xff0c;rewrite是nginx服务器的重要功能之 一&#xff0c;用于实现URL的重写&#xff0c;URL的…...

ISO19110操作要求类中/req/operation/operation-attributes的详细解释

/req/operation/operation-attributes 要求: 只有要素属性&#xff08;feature attributes&#xff09;可以通过‘observesValueOf’、‘triggeredByValuesOf’或‘affectsValuesOf’关联角色与要素操作&#xff08;feature operations&#xff09;关联。 具体解释 定义 要…...

访客(UV)、点击量(PV)、IP、访问量(VV)概念

1、https://www.cnblogs.com/QingPingZm/articles/13855808.htmlhttps://www.cnblogs.com/QingPingZm/articles/13855808.html...

C++系统编程篇——Linux第一个小程序--进度条

&#xff08;1&#xff09;先引入一个概念&#xff1a;行缓冲区 \r和\n \r表示回车 \n表示回车并换行 ①代码一 #include<stdio.h> #include<unistd.h> int main()…...

一个中文和越南语双语版本的助贷平台开源源码

一个中文和越南语双语版本的助贷平台开源源码。后台试nodejs。 后台 代理 前端均为vue源码&#xff0c;前端有中文和越南语。 前端ui黄色大气&#xff0c;逻辑操作简单&#xff0c;注册可对接国际短信&#xff0c;可不对接。 用户注册进去填写资料&#xff0c;后台审批&…...

【游戏引擎之路】登神长阶(五)

5月20日-6月4日&#xff1a;攻克2D物理引擎。 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 6月23日-6月30日&#xff1a;攻克《Windows游戏编程大师技巧》。 …...

FireAct:使用智能体(agent)微调大语言模型

1.概述 近年来,针对语言模型(LMs)的研究致力于探索其与外部工具或环境互动的能力,以推进新型语言代理的发展。此类代理具备从环境反馈中汲取新知识、通过语言推理进行连续决策,以及借助自我反思提升任务解决能力的能力。工业界的进展,如ChatGPT插件,凸显了语言代理在实际…...

20240626让飞凌的OK3588-C开发板在相机使用1080p60分辨率下预览

20240626让飞凌的OK3588-C开发板在相机使用1080p60分辨率下预览 2024/6/26 15:15 4.2.1 全编译测试 在源码路径内&#xff0c;提供了编译脚本 build.sh&#xff0c;运行该脚本对整个源码进行编译&#xff0c;需要在终端切换到解压 出来的源码路径&#xff0c;找到 build.sh 文件…...

python数据分析——数据分类汇总与统计

数据分类汇总与统计 前言一、Groupby分类统计语法按列分组示例一示例二示例三 遍历各分组示例 使用字典和Series分组示例 使用函数分组示例 二、数据聚合groupby的聚合函数示例一示例二 逐列及多函数应用示例一示例二 返回不含行索引的聚合数据示例 三、一般性的“拆分-应用-合…...

iOS17系统适配

iOS17 新功能 文章目录 iOS17 新功能iOS17支持哪几款机型Xcode15新特性iOS17-开发适配指南 横屏待机 在iOS 17中&#xff0c;还带来了横屏待机功能&#xff0c;苹果将这个新功能命名为“Standby”模式&#xff0c;为 iPhone 带来了全新的玩法。iPhone启用之后&#xff0c;默认情…...

树洞陪聊陪玩交友程序系统源码,解锁交友新体验

在繁忙的都市生活中&#xff0c;你是否渴望找到一片属于自己的秘密花园&#xff0c;倾诉心声、分享快乐&#xff1f;今天&#xff0c;就让我带你走进这片名为“树洞”的神秘之地&#xff0c;感受陪聊陪玩交友的全新魅力&#xff01; &#x1f333;树洞陪聊陪玩交友程序系统 你…...

区间动态规划——最长回文子序列长度(C++)

把夜熬成粥&#xff0c;然后喝了它。 ——2024年7月1日 书接上回&#xff1a;区间动态规划——最长回文子串&#xff08;C&#xff09;-CSDN博客&#xff0c;大家有想到解决办法吗&#xff1f; 题目描述 给定一个字符串s&#xff08;s仅由数字和英文大小写字母组成&#xff0…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...