STM32 CAN协议讲解以及代码

STM32 CAN

文章目录

  • STM32 CAN
  • 前言
  • 一、CAN外设
    • 1.主控制寄存器CAN_MCR
    • 2.位时序寄存器CAN_BTR
    • 3.CAN的发送邮箱
    • 4.CAN的接收FIFO
    • 5.验收筛选器
  • 二、代码配置
    • 1.初始化
    • 2.发送数据
    • 3.接收数据
    • 4.main.c


前言

前面学习了CAN的一些理论知识,他在我们的STM32里面是怎么用的呢
前面讲了一些can的知识,在STM32里是什么样的呢

一、CAN外设

1.主控制寄存器CAN_MCR

DBF调试冻结:处于程序调试模式才使用。可以设置CAN处于工作模式还是禁止收发状态,禁止收发时仍可以访问接受FIFO中的数据。
TTCM时间触发模式:设置CAN的时间触发通信模式。在此模式下,CAN使用它内部定时器产生时间戳,并把它保存在CAN_RDTxR,CAN_TDTxR寄存器中。可以利用它实现标准分时同步通信功能。
ABOM自动离线管理:当节点检测到他发送错误或者接受错误超过一定值时,会自动离线管理。离线状态下,不能接收或者发送。
AWUM自动唤醒:在使用软件进入睡眠后,如果使用自动唤醒,在检测到总线活动时,会自动唤醒。
NART自动重传:当报文发送失败会自动重传直到成功为止。
RFLM锁定模式:锁定接收FIFO。锁定之后,当接收FIFO溢出时,会丢弃下一个接收的报文。若不锁定,则会覆盖掉之前的报文。
TXFP报文发送优先级的判定方法:当邮箱中有多个报文需要发送时,控制它是根据报文的ID优先级还是报文存进邮箱的顺序来发送。

2.位时序寄存器CAN_BTR

SILM:为0,正常模式;为1,静默模式
LBKM:为1,允许回环模式;为0,禁止回环模式
CAN有四种工作模式。由位时序寄存器的SILM和LBKM组合控制。
在这里插入图片描述
• 正常模式
正常模式下就是一个正常的 CAN 节点,可以向总线发送数据和接收数据。
• 静默模式
静默模式下,它自己的输出端的逻辑 0 数据会直接传输到它自己的输入端,逻辑 1 可以被发送到总线,所以它不能向总线发送显性位 (逻辑 0),只能发送隐性位 (逻辑 1)。输入端可以从总线接收内容。由于它只可发送的隐性位不会强制影响总线的状态,所以把它称为静默模式。这种模式一般用于监测,它可以用于分析总线上的流量,但又不会因为发送显性位而影响总线。
• 回环模式
回环模式下,它自己的输出端的所有内容都直接传输到自己的输入端,输出端的内容同时也会被传输到总线上,即也可使用总线监测它的发送内容。输入端只接收自己发送端的内容,不接收来自总线上的内容。使用回环模式可以进行自检。
• 回环静默模式
回环静默模式是以上两种模式的结合,自己的输出端的所有内容都直接传输到自己的输入端,并且不会向总线发送显性位影响总线,不能通过总线监测它的发送内容。输入端只接收自己发送端的内容,不接收来自总线上的内容。这种方式可以在“热自检”时使用,即自我检查的时候,不会干扰总线。

在STM32中的位时序:
SYNC_SEG,BS1,BS2三段,采样点位于BS1和BS2交界处。SYNC_SEG的固定长度是1Tq.BS1和BS2的长度SJW可以在位时序寄存器中配置。
波特率:
STM32的CAN1和CAN2挂载在APB1上。APB1总线的最大频率是36MHz。在使用CAN2时,必须打开CAN1的时钟。

波特率设置
在这里插入图片描述
举两个例子
500bps

CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);//CAN,波特率500Kbps    

这个是怎么计算的呢,根据前面提到4分频 4/36M *(1+8+9)=500Kbps
那么1M应该怎么配置呢

CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_5tq,CAN_BS1_3tq,4,CAN_Mode_LoopBack);//CAN 1Mbps

4/36*(1+5+3)=1M

3.CAN的发送邮箱

CAN外设有三个发送邮箱,即最多可以缓存3个待发送报文。 每个发送邮箱中包含有四个寄存器。

标识符寄存器CAN_TIxR(存储待发送报文的ID,扩展ID,IDE位及RTR位)
数据长度控制寄存器CAN_TDTxR(存储待发送报文的DLC段)
低位数据寄存器CAN_TDLxR(存储数据段的低四个字节内容)
高位数据寄存器CAN_TDHxR(存储高四字节的内容)
发送邮箱的工作过程:当需要发送报文时,把报文分解成各个段存储到不同的寄存器中,并对标识符寄存器的发送请求位置1,即可把数据发送出去。

4.CAN的接收FIFO

CAN外设有2个接收FIFO,每个FIFO中有3个邮箱,即最多可以缓存6个接收报文。当接收到报文时,FIFO报文计数器会自增,当报文被读取之后,计数器会自减。和发送邮箱类似,FIFO有四个寄存器。
标识符寄存器CAN_RIxR(存储接收报文的ID,扩展ID,IDE位及RTR位)
数据长度控制寄存器CAN_RDTxR(存储接收报文的DLC段)
低位数据寄存器CAN_RDLxR(存储数据段的低四个字节内容)
高位数据寄存器CAN_RDHxR(存储高四字节的内容)

5.验收筛选器

STM32F103的CAN外设有14个筛选器组,每组有两个寄存器。CAN1和CAN2共用筛选器。筛选器的作用下,节点只接受需要的报文到自己的FIFO中。筛选器可以调整筛选ID的长度和过滤模式

(1)根据筛选ID长度分类:

32位:STDID[10:0],EXTID[17:0],IDE,RTR
16位:STDID[10:0],EXTID[17:15],IDE,RTR
(2)根据过滤方式分为:

标识符列表模式:要求报文与列表中的ID的每一个标识符相同才接收。
掩码模式:只要报文ID中规定的某些位相同,就会被接收。
筛选尺度寄存器CAN_FS1R的FSCx位可以设置工作在32位还是16位;筛选模式寄存器CAN_FM1R的FBMx位可以设置工作在标识符列表模式还是掩码模式。每组筛选器有2个32位寄存器,分别为CAN_FxR1,CAN_FxR2,用来存储要筛选的ID或者掩码。
在这里插入图片描述

二、代码配置

1.初始化

备注比正点的例程或者野火的都要详细

/**
* @brief CAN 初始化
* @param tsjw : 重新同步跳跃时间单元.范围: 1~3;
* @param tbs2 : 时间段 2 的时间单元.范围: 1~8;
* @param tbs1 : 时间段 1 的时间单元.范围: 1~16;
* @param brp : 波特率分频器.范围: 1~1024;
* @note 以上 4 个参数, 在函数内部会减 1, 所以, 任何一个参数都不能等于 0
* CAN 挂在 APB1 上面, 其输入时钟频率为 Fpclk1 = PCLK1 = 36Mhz
* tq = brp * tpclk1;
* 波特率 = Fpclk1 / ((tbs1 + tbs2 + 1) * brp);
* 我们设置 can_init(1, 8, 9, 4, 1), 则 CAN 波特率为:
* 36M / ((8 + 9 + 1) * 4) = 500Kbps
* @param mode : CAN_MODE_NORMAL, 普通模式;CAN_MODE_LOOPBACK,回环模式;
* @retval 0, 初始化成功; 其他, 初始化失败;
* */
u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{GPIO_InitTypeDef GPIO_InitStructure; CAN_InitTypeDef        CAN_InitStructure;CAN_FilterInitTypeDef  CAN_FilterInitStructure;
#if CAN_RX0_INT_ENABLE NVIC_InitTypeDef  NVIC_InitStructure;
#endifRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PORTA时钟	                   											 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽GPIO_Init(GPIOA, &GPIO_InitStructure);		//初始化IOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化IO//CAN单元设置CAN_InitStructure.CAN_TTCM=DISABLE;//非时间触发通信模式  //CAN_InitStructure.CAN_ABOM=DISABLE;//软件自动离线管理	 //CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)//CAN_InitStructure.CAN_NART=ENABLE;//禁止报文自动传送 //CAN_InitStructure.CAN_RFLM=DISABLE;	//报文不锁定,新的覆盖旧的 // CAN_InitStructure.CAN_TXFP=DISABLE;	//优先级由报文标识符决定 //CAN_InitStructure.CAN_Mode= mode;//模式设置: mode:0,普通模式;1,回环模式; ////设置波特率CAN_InitStructure.CAN_SJW=tsjw;	//重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位  CAN_SJW_1tq	 CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tqCAN_InitStructure.CAN_BS1=tbs1; //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tqCAN_InitStructure.CAN_BS2=tbs2;//Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~	CAN_BS2_8tqCAN_InitStructure.CAN_Prescaler=brp;  //分频系数CAN_Init(CAN1, &CAN_InitStructure);   // 初始化CAN1 CAN_FilterInitStructure.CAN_FilterNumber=0;//过滤器0CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位 CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;设置过滤器的标识符高位32位IDCAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//设置过滤器的标识符低位CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//设置过滤器的掩码高位32位MASKCAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//设置过滤器的掩码低位CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0表示匹配的数据帧将进入FIFO0缓冲区。CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化
#if CAN_RX0_INT_ENABLECAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.		    NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
#endifreturn 0;
}   

CAN_FilterMode_IdMask宏指定过滤模式为标识符/掩码模式。在这种模式下,过滤器将使用标识符和掩码来匹配数据帧。标识符是数据帧的标识符,而掩码用于指定哪些位需要匹配。如果标识符和掩码的匹配条件满足,数据帧就会被允许通过过滤器。

CAN_FilterMode_IdList宏指定过滤模式为标识符列表模式。在这种模式下,过滤器将使用一个预定义的标识符列表来匹配数据帧。如果数据帧的标识符与列表中的任何一个匹配,数据帧就会被允许通过过滤器。

2.发送数据

//can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)	
//len:数据长度(最大为8)				     
//msg:数据指针,最大为8个字节.
//返回值:0,成功;
//		 其他,失败;
u8 Can_Send_Msg(u8* msg,u8 len)
{	u8 mbox;u16 i=0;CanTxMsg TxMessage;TxMessage.StdId=0x12;					 // 标准标识符 TxMessage.ExtId=0x12;				   // 设置扩展标示符 TxMessage.IDE=CAN_Id_Standard; // 标准帧TxMessage.RTR=CAN_RTR_Data;		 // 数据帧TxMessage.DLC=len;						// 要发送的数据长度for(i=0;i<len;i++)TxMessage.Data[i]=msg[i];			          mbox= CAN_Transmit(CAN1, &TxMessage);   i=0;while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;	//等待发送结束if(i>=0XFFF)return 1;return 0;		}

首先定义了一个CanTxMsg类型的变量TxMessage,用于存储要发送的数据帧的相关信息,包括标识符、帧类型、数据长度和数据内容等。
然后根据输入参数msg和len,将要发送的数据存储到TxMessage.Data数组中。
调用CAN_Transmit函数发送数据帧,并返回发送邮箱(mbox)的编号。
等待发送结束,直到CAN_TransmitStatus返回CAN_TxStatus_Failed或者经过一定的时间限制,才退出等待循环。
如果发送成功,则返回0,否则返回1。
在这里插入图片描述

3.接收数据

//can口接收数据查询
//buf:数据缓存区;	 
//返回值:0,无数据被收到;
//		 其他,接收的数据长度;
u8 Can_Receive_Msg(u8 *buf)
{		   		   u32 i;CanRxMsg RxMessage;if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;		//没有接收到数据,直接退出 CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//读取数据	for(i=0;i<8;i++)buf[i]=RxMessage.Data[i];  return RxMessage.DLC;	
}

首先定义了一个CanRxMsg类型的变量RxMessage,用于存储接收到的数据帧的相关信息,包括标识符、帧类型、数据长度和数据内容等。
使用CAN_MessagePending函数检查CAN1的FIFO0中是否有待接收的数据帧。如果没有数据帧待接收,则直接退出函数并返回0。
调用CAN_Receive函数从CAN1的FIFO0中读取接收到的数据帧,并将其存储到RxMessage变量中。
将接收到的数据存储到输入参数buf指向的缓冲区中。
返回接收到的数据帧的数据长度RxMessage.DLC。
在这里插入图片描述

4.main.c

  CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);//CAN初始化环回模式,波特率500Kbps    while(1){key=KEY_Scan(0);if(key==KEY0_PRES)//KEY0按下,发送一次数据{for(i=0;i<8;i++){canbuf[i]=i;//填充发送缓冲区printf("发送%d\r\n",canbuf[i]);}res=Can_Send_Msg(canbuf,8);//发送8个字节 if(res)printf("发送失败\r\n");		//提示发送失败else printf("发送\r\n");		 		//提示发送成功								   }else if(key==WKUP_PRES)//WK_UP按下,改变CAN的工作模式{	   mode=!mode;CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,mode);//CAN普通模式初始化, 波特率500Kbps if(mode==0)//普通模式,需要2个开发板{printf("正常模式\r\n");}else //回环模式,一个开发板就可以测试了.{printf("回环模式\r\n");}}		 key=Can_Receive_Msg(canbuf);if(key)//接收到有数据{			for(i=0;i<key;i++){									    printf("接收到%d\r\n",canbuf[i]);}}t++; delay_ms(10);if(t==20){LED0=!LED0;//提示系统正在运行	t=0;}		   }
}

初始化CAN模式为回环模式,波特率为500Kbps。
进入循环,不断检测按键状态。
如果KEY0按键按下,将canbuf数组填充为0-7的连续数值,并调用Can_Send_Msg函数发送8个字节的数据帧。如果发送失败,打印"发送失败";如果发送成功,打印"发送"。
如果WK_UP按键按下,切换CAN的工作模式。如果当前为普通模式,将其切换为回环模式,并打印"回环模式";如果当前为回环模式,将其切换为普通模式,并打印"正常模式"。
调用Can_Receive_Msg函数接收数据帧,并将接收到的数据打印出来。
按下KEY0之后
在这里插入图片描述

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

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

相关文章

【手写实现一个简单版的Dubbo,深刻理解RPC框架的底层实现原理】

手写实现一个简单版的Dubbo&#xff0c;深刻理解RPC框架的底层实现原理 RPC框架简介了解Dubbo的实现原理服务暴露服务引入服务调用 手写实现一个简单版的Dubbo服务暴露ServiceBeanProxyFactory#getInvokerProtocol#exportRegistryProtocol#export 服务引入RegistryProto#referD…

matlab画双坐标图的样式

matlab画双坐标图的样式 %% clc,clear,close all; t0:0.1:9*pi; figure; [AX,Ha,Hb]plotyy(t,sin(t),t,exp(t)); % 绘图并创建句柄 % ----------------- 设置刻度 set(AX(1),yTick,[-1.250:0.25:1.25]) % 设置左边Y轴的刻度 set(AX(2),yTick,[0:50:350]) …

服务器连接github

https://zhuanlan.zhihu.com/p/543490354 比着这个一步步做就行。 https://blog.l0v0.com/posts/94ffdbdf.html 上传文件可以看这个 注意&#xff1a; 密钥ssh-keygen设置好之后&#xff0c;以后就不用每次输入账号密码才能访问了。 otherwise&#xff0c;每次要输入账号密码。…

文件批量改名方法:文件自动批量重命名,提升文件管理效率

在日常工作中随着工作时间的推移&#xff0c;在文件数量日益增长的情况下&#xff0c;会在电脑中积累大量的文件。如果文件名混乱无序&#xff0c;查找和识别重要文件将变得非常困难。这不仅会浪费大量的时间和精力&#xff0c;还可能导致重要文件的丢失或混乱。文件批量改名可…

高级驾驶辅助系统 (ADAS)介绍

随着汽车技术持续快速发展,推动更安全、更智能、更高效的驾驶体验一直是汽车创新的前沿。高级驾驶辅助系统( ADAS ) 是这场技术革命的关键参与者,是 指集成到现代车辆中的一组技术和功能,用于增强驾驶员安全、改善驾驶体验并协助完成各种驾驶任务。它使用传感器、摄像头、雷…

【数据结构实验】排序(三)快速排序算法的改进(三者取中法)

文章目录 1. 引言2. 快速排序算法2.1 传统快速排序2.2 三者取中法 3. 实验内容3.1 实验题目&#xff08;一&#xff09;输入要求&#xff08;二&#xff09;输出要求 3.2 算法实现 4. 实验结果 1. 引言 快速排序是一种经典的排序算法&#xff0c;其核心思想是通过选择一个基准元…

armbian折腾之docker搭建chatgptweb指导(无需魔法)

文章目录 前言面板/docker的安装获取中转Key创建docker容器chatgpt-next-web部署[推荐]chatgpt-Web部署 推荐学习openai-hk官方的部署指导 前言 好久都没有折腾armbian&#xff0c;导致吃了很长时间的灰&#xff0c;今天偶然看到B站UP主JeeJK007的搭建视频&#xff0c;便想着能…

小程序如何禁止指定用户访问?如何设置指定用户才能访问?

​有些商家为了价格保密或者实行严格的会员制等原因&#xff0c;希望小程序能够限制某些人的访问或者设置指定人员才能访问。这种功能在小程序中&#xff0c;怎么支持这些功能呢&#xff1f;下面具体介绍。 一、禁止指定用户访问 禁止指定用户访问&#xff0c;可以通过小程序…

智能汽车十大网络安全攻击场景-《智能汽车网络安全权威指南》

引言 大家都很熟悉OWASP Top 10风险报告&#xff0c;这个报告不但总结了Web应用程序最可能、最常见、最危险的10大安全隐患&#xff0c;还包括了如何消除这些隐患的建议&#xff0c;这个“OWASP Top 10“差不多每隔三年更新一次。目前汽车网络安全攻击威胁隐患繁多&#xff0c…

杰发科技AC7801——keil工程移植到IAR

0、简介 发现AC7801的代码只有keil工程的&#xff0c;IAR和Eclipse的代码只有一个例程&#xff0c;于是在从Keil移植到IAR时候遇到的问题记录下。 正常情况下&#xff0c;直接把keil的usr用户代码移植到iar的文件夹下面&#xff0c;删除原本的文件再添加新加进来的文件即可。…

链表?细!详细知识点总结!

链表 定义&#xff1a;链表是一种递归的数据结构&#xff0c;它或者为空&#xff08;null)&#xff0c;或者是指向一个结点&#xff08;node&#xff09;的引用&#xff0c;该结点含有一个泛型的元素和一个指向另一条链表的引用。 ​ 其实链表就是有序的列表&#xff0c;它在内…

03:2440--UART

目录 一:UART 1:概念 2:工作模式 3:逻辑电平 4:串口结构图 5:时间的计算 二:寄存器 1:简单的UART传输数据 A:GPHCON--配置引脚 B:GPHUP----使能内部上拉​编辑 C: UCON0---设置频率115200 D: ULCON0----数据格式8n1 E:发送数据 A:UTRSTAT0 B:UTXHO--发送数据输…

从0到0.01入门 Webpack| 004.精选 Webpack面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

ref详解(C#)

本质上来说 ref 的就是把 C/C 指针的那一套又拿回来了&#xff0c;而且还封装成一套自己的玩法。 我想设计者的初心把 ref 的功能限制得死死的&#xff0c;可能也考虑到 C# 是一门面向业务开发的语言&#xff0c;讲究的是做项目快狠准&#xff0c;性能反而不是第一要素&#x…

当你准备开始学习 Java 时,确保已完成以下准备工作,安装Java开发环境并验证通过。

当你准备开始学习 Java 时&#xff0c;确保已完成以下准备工作&#xff1a; a. 安装Java开发环境 下载Java Development Kit (JDK)&#xff1a; 访问Oracle官方网站&#xff0c;选择适用于你操作系统的JDK版本&#xff0c;点击下载。 安装JDK&#xff1a; 下载完成后&#xf…

3.1 CPU内部结构与时钟与指令

CPU内部结构 总线一些自定义部件总线图内存指令执行流程:取指令,译码,执行pc做的事内存地址寄存器内存缓存寄存器指令寄存器,译码第一步指令寄存器传递地址到内存地址寄存器指令MOV_A的过程(译码第二步)第一条指令执行完毕第三条指令的执行第四条指令第四条指令不同的执行流程…

基于python+TensorFlow+Django算法模型的车辆车型识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介简介技术栈主要模块1. 数据预处理2. 模型构建3. 模型训练4. 模型集成5. 用户界面 系统工作流程未来改进计划 二、功能三、系统四. 总结 一项目简介 # 车辆车…

深信服实验学习笔记——nmap常用命令

文章目录 1. 主机存活探测2. 常见端口扫描、服务版本探测、服务器版本识别3. 全端口&#xff08;TCP/UDP&#xff09;扫描4. 最详细的端口扫描5. 三种TCP扫描方式 1. 主机存活探测 nmap -sP <靶机IP>-sP代表 2. 常见端口扫描、服务版本探测、服务器版本识别 推荐加上-v参…

DNS/ICMP协议、NAT技术

目录 DNS协议DNS背景域名简介 ICMP协议ICMP功能ping命令traceroute命令 NAT技术NAT技术背景NAT IP转换过程NAPTNAT技术的缺陷NAT和代理服务器 网络协议总结应用层传输层网络层数据链路层 DNS协议 DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;协议&…

基于51单片机的公交自动报站系统

**单片机设计介绍&#xff0c; 基于51单片机的公交自动报站系统 文章目录 一 概要公交自动报站系统概述工作原理应用与优势 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 很高兴为您介绍基于51单片机的公交自动报站系统&#xff1a; 公交自动报…