CAN总线协议的理解以及移植stm32代码并使用

什么是CAN总线协议

是一种异步半双工的通讯协议,只有CAN_High与CAN_Low两条信号线。
有两种连接形式:闭环总线(高速)和开环总线(远距离)

他使用的是一种差分信号来传输电信号
所谓差分信号就是两条信号线电平之差,来传输电信号1/0,

该方式优点是抗干扰能力强、可以远距离传输,因为当信号线过长的时候电阻累积过大,使得传输到的电信号不准确,而差分信号是使用两条信号线电平差,两条信号线只要长度相似信号误差都不会很大。

电位差为0时为逻辑1,电位差>=2.0时为逻辑0。

CAN协议的协议层原理

协议层内规定了一个数据位有四个段,分别为:SS段、PTS段、PBS1段、PBS2段
1Tq为1个时基单元
在这里插入图片描述
SS段:是同步段,若通讯节点检测到总线上信号的跳变沿被包含在 SS 段的范围之内,则表示节点与总线的时序是同步的,当节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电平。SS 段的大小固定为 1Tq。

PTS段:是传播时间段,这个时间段是用于补偿网络的物理延时时间。是总线上输入比较器延时和输出驱动器延时总和的两倍。PTS 段的大小可以为 1~8Tq。

PBS1段:PBS1 译为相位缓冲段,补偿SS段的误差,它的时间长度在重新同步的时候可以加长,如下图相位超前,既ss段比预计的时间超期一个时间基准,可以通过PBS1段校准。

PBS2段:这是另一个相位缓冲段,它的时间长度在重新同步时可以缩短,补偿整个数据对齐。
在这里插入图片描述

CAN报文

当节点1与节点2同时发送报文时,总线电平会有优先级,按照ID优先级选择其1
当节点1或节点2发现自身电平和总线电平不同时会停止发送报文,总线显性电平为0,有1和0时总线电平取0

帧种类及用途:

在这里插入图片描述

数据帧的结构

在这里插入图片描述
仲裁段:0为最高优先级,用于总线判断优先级
控制段:

  • RTR位为0表示数据帧(发送数据的),为1表示遥控帧(请求数据的)
  • IDE位为0表示标准格式,为1表示为扩展格式
  • DLE表示本报文的数据有多少个字节,4个数据位,不过只能写入0~8
  • SRR 位 ,只存在于扩展格式,它用于替代标准格式中的 RTR位。由于扩展帧中的 SRR 位为隐性位,RTR 在数据帧为显性位,所以在两个 ID 相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。

CRC 段:为了保证报文的正确传输,CAN 的报文包含了一段 15 位的 CRC 校验码,一旦接收节点算出的CRC 码跟接收到的 CRC 码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。CRC 部分的计算一般由 CAN 控制器硬件完成,出错时的处理则由软件控制最大重发数。在 CRC 校验码之后,有一个 CRC 界定符,它为隐性位,主要作用是把 CRC 校验码与后面的 ACK段间隔起来。

ACK 段:ACK 段包括一个 ACK 槽位,和 ACK 界定符位。类似 I2C 总线,在 ACK 槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在 ACK 槽和帧结束之间由 ACK 界定符间隔开。

STM32的CAN外设

stm32f103c8芯片中带有CAN的控制器,但不带CAN的收发器,所以如果想用最小系统板进行CAN外设实验,需要自己连接CAN的收发器。

在这里插入图片描述

CAN内部框图剖析

有一下五个主要部分

  • CAN控制内核
  • CAN发送邮箱
  • CAN接收fifo
  • 验收筛选器
  • 整体控制逻辑

stm32的CAN外设寄存器

主要使用的功能:

  • DBF调试冻结功能:可设置CAN处于工作状态或者禁止收发状态,静止收发时仍可访问接收FIFO的数据
  • TTCM:生成时间戳,在CAN_RDTxR和CAN_TDTxR中保存
  • ABOM:自动离线管理,在节点检测到它发送错误或者接收错误超过一定值时会自动进入离线状态。
  • AWUM:自动唤醒,如果软件进入CAN外设的低功耗模式,如果使能了该功能,当CAN总线检测到活动时自动换醒。
  • NART:自动重传,报文发送失败会自动重传至成功为止
  • RFLM:锁定模式,使能该模式的话,只有6个接收FIFO如果6个满了还未处理则第7个来时不接入FIFO,否则会覆盖第一个FIFO
  • TXFP:报文发送优先级判断方法:ID优先级/时序优先级

寄存器

工作模式寄存器CAN_BTR

寄存器的31位30位分别控制两个模式在这里插入图片描述
31位:是否静默
30位:是否回环
23-20位:TS2,表示TSS2占用多少个时间单元,TSS2=Tq*(TS2+1)
19-15位:TS1,与上同理
25-24位:SJW,定义每次可活动增减TS1与TS2数据位的最大值(调整时序时最大增减的时间单元个数)
9-0位:BRP,波特率分频器Tq=(BRP+1)*tPCLK

其他寄存器

  • 标识符寄存器CAN_ITxR:存储发送报文的ID、扩展ID,IDE位和RTR位,其中的TMIDxR_TxRQ位置1即可以发送数据
  • 数据长度控制寄存器CAN_TDTxR:存储待发送报文的DLC段
  • 低位数据寄存器CAN_TDLxR:存储发送报文的Date0~Date3
  • 高位数据寄存器CAN_TDHxR:存储发送报文的Date4~Date7

CAN的接收邮箱

每个CAN有两个接收FIFO邮箱,每个邮箱有3级
两个FIFO接收邮箱公用28个筛选器组(f103是14个、f105是28个)
Alt

掩码模式

一个筛选器有两个寄存器,在上图的掩码映射中,写入1就代表ID寄存器中的这一位需要筛选,如果全写入0,即不筛选。

stm32的CAN代码移植使用

在hal_can.h文件中

#define GPIO_CAN_RX_Pin                 GPIO_Pin_8
#define GPIO_CAN_TX_Pin                 GPIO_Pin_9

初始化CAN的GPIO重定义引脚

/****************************************************************************
*@*名称 : hal_CAN_GPIO_Config
*@*功能 : CAN的引脚口(PB8R/9T)
*@*形参 : 无
*@*返回值 : 无
****************************************************************************/
static void hal_CAN_GPIO_Config(void)
{GPIO_InitTypeDef  GPIO_InitStruct_CAN_TX;GPIO_InitTypeDef  GPIO_InitStruct_CAN_RX;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);GPIO_InitStruct_CAN_TX.GPIO_Pin = GPIO_CAN_TX_Pin ;GPIO_InitStruct_CAN_TX.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct_CAN_TX.GPIO_Speed = GPIO_Speed_50MHz;	GPIO_Init(GPIOB,&GPIO_InitStruct_CAN_TX);GPIO_InitStruct_CAN_RX.GPIO_Pin = GPIO_CAN_RX_Pin ;GPIO_InitStruct_CAN_RX.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStruct_CAN_RX.GPIO_Speed = GPIO_Speed_50MHz;	GPIO_Init(GPIOB,&GPIO_InitStruct_CAN_RX);
}

初始化CAN的模式

这里需要提一下,因为核心板没有CAN的接收器,如果要验证功能,要使用回环模式

/****************************************************************************
*@*名称 : hal_CAN_Mode_Config
*@*功能 : 定义CAN模块的模式
*@*形参 : 无
*@*返回值 : 无
****************************************************************************/
static void hal_CAN_Mode_Config(void)
{CAN_InitTypeDef	GAN_InitStruct_Mode;RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);/*CAN寄存器初始化*/CAN_DeInit(CAN1);CAN_StructInit(&GAN_InitStruct_Mode);GAN_InitStruct_Mode.CAN_Mode = CAN_Mode_Normal; //普通工作模式,CAN_Mode_LoopBack为回环模式GAN_InitStruct_Mode.CAN_SJW = CAN_SJW_1tq; //可活动时间单元1tqGAN_InitStruct_Mode.CAN_BS1 = CAN_BS1_5tq;GAN_InitStruct_Mode.CAN_BS2 = CAN_BS2_3tq;/*CAN单元初始化*/GAN_InitStruct_Mode.CAN_TTCM=DISABLE;			   //MCR-TTCM  关闭时间触发通信模式使能GAN_InitStruct_Mode.CAN_ABOM=ENABLE;			   //MCR-ABOM  自动离线管理 GAN_InitStruct_Mode.CAN_AWUM=ENABLE;			   //MCR-AWUM  使用自动唤醒模式GAN_InitStruct_Mode.CAN_NART=DISABLE;			   //MCR-NART  禁止报文自动重传	  DISABLE-自动重传GAN_InitStruct_Mode.CAN_RFLM=DISABLE;			   //MCR-RFLM  接收FIFO 锁定模式  DISABLE-溢出时新报文会覆盖原有报文  GAN_InitStruct_Mode.CAN_TXFP=DISABLE;			   //MCR-TXFP  发送FIFO优先级 DISABLE-优先级取决于报文标示符 /* CAN Baudrate = 1 MBps (1MBps已为stm32的CAN最高速率) (CAN 时钟频率为 APB1 = 36 MHz) */GAN_InitStruct_Mode.CAN_Prescaler =4;		   BTR-BRP 波特率分频器  定义了时间单元的时间长度 36/(1+5+3)/4=1 MbpsCAN_Init(CAN1,&GAN_InitStruct_Mode)
}

初始化筛选器

/****************************************************************************
*@*名称 : hal_CAN_Filter_Config
*@*功能 : 初始化CAN模块的过滤器
*@*形参 : 无
*@*返回值 : 无
****************************************************************************/
static void hal_CAN_Filter_Config(void)
{CAN_FilterInitTypeDef GAN_InitStruct_Filter0;CAN_FilterInitTypeDef GAN_InitStruct_Filter1;GAN_InitStruct_Filter0.CAN_FilterActivation = ENABLE;			//使能筛选器GAN_InitStruct_Filter0.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0 ;				//筛选器被关联到FIFO0GAN_InitStruct_Filter0.CAN_FilterIdHigh = (((CAN_TargetID<<3)|CAN_Id_Extended|CAN_RTR_Data))>>16;GAN_InitStruct_Filter0.CAN_FilterIdLow = ((CAN_TargetID<<3)|CAN_Id_Extended|CAN_RTR_Data);GAN_InitStruct_Filter0.CAN_FilterMaskIdHigh = 0xFFFF;			//筛选器高16位每位必须匹配GAN_InitStruct_Filter0.CAN_FilterMaskIdLow= 0xFF00;			//筛选器低16位每位必须匹配GAN_InitStruct_Filter0.CAN_FilterMode = CAN_FilterMode_IdMask;		//工作在掩码模式GAN_InitStruct_Filter0.CAN_FilterNumber = 0;GAN_InitStruct_Filter0.CAN_FilterScale = CAN_FilterScale_32bit;	//筛选器位宽为单个32位。CAN_FilterInit(&GAN_InitStruct_Filter0);/*CAN通信中断使能*/GAN_InitStruct_Filter1.CAN_FilterActivation = ENABLE;			//使能筛选器GAN_InitStruct_Filter1.CAN_FilterFIFOAssignment = CAN_Filter_FIFO1 ;				//筛选器被关联到FIFO1GAN_InitStruct_Filter1.CAN_FilterIdHigh = ((CAN_FIFO1_ID<<3)|CAN_Id_Extended|CAN_RTR_Data)>>16;GAN_InitStruct_Filter1.CAN_FilterIdLow = ((CAN_FIFO1_ID<<3)|CAN_Id_Extended|CAN_RTR_Data);GAN_InitStruct_Filter1.CAN_FilterMaskIdHigh = 0xFFFF;			//筛选器高16位每位必须匹配GAN_InitStruct_Filter1.CAN_FilterMaskIdLow= 0xFF00;			//筛选器低16位每位必须匹配GAN_InitStruct_Filter1.CAN_FilterMode = CAN_FilterMode_IdMask;		//工作在掩码模式GAN_InitStruct_Filter1.CAN_FilterNumber = 2;GAN_InitStruct_Filter1.CAN_FilterScale = CAN_FilterScale_32bit;	//筛选器位宽为单个32位。CAN_FilterInit(&GAN_InitStruct_Filter1);/*CAN通信中断使能*/CAN_ITConfig(CAN1, CAN_IT_FMP1, ENABLE);CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
}

这里我打开了两个接收FIFO
打开两个接收FIFO时需要注意:
该筛选器关联到的FIFO:GAN_InitStruct_Filter1.CAN_FilterFIFOAssignment
筛选器编号:GAN_InitStruct_Filter1.CAN_FilterNumber
这里不要配置好了一个,另一个就直接复制结构体导致错误了。

筛选器掩码配置要注意:因为低3位是配置RTR的标志位,高29位才是掩码ID配置,所以一开始将掩码ID左移3位,然后在或上IDE 位标志“宏 CAN_ID_EXT”以及RTR 位标
“宏 CAN_RTR_DATA”然后再赋值入筛选器的高八位和低八位

GAN_InitStruct_Filter0.CAN_FilterIdHigh = (((CAN_TargetID<<3)|CAN_Id_Extended|CAN_RTR_Data))>>16;
GAN_InitStruct_Filter0.CAN_FilterIdLow = ((CAN_TargetID<<3)|CAN_Id_Extended|CAN_RTR_Data);
GAN_InitStruct_Filter0.CAN_FilterMaskIdHigh = 0xFFFF; //筛选器高16位每位必须匹配
GAN_InitStruct_Filter0.CAN_FilterMaskIdLow= 0xFF00; //筛选器低16位每位必须匹配

初始化CAN的外设中断NVIC

/****************************************************************************
*@*名称 : hal_CAN_NVIC_Config
*@*功能 : 初始化CAN模块的中断
*@*形参 : 无
*@*返回值 : 无
****************************************************************************/
static void hal_CAN_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure;/* Configure one bit for preemption priority */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/*中断设置*/NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;	   //CAN1 RX0中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;		   //抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;			   //子优先级为0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/*中断设置*/NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn;	   //CAN1 RX0中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;		   //抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			   //子优先级为1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}

这里要注意,想要打开两个FIFO的中断是有区别的
FIFO0的中断通道名称是:USB_LP_CAN1_RX0_IRQn
FIFO1的中断通道名称是:CAN1_RX1_IRQn

FIFO0的中断函数名称是:void USB_LP_CAN1_RX0_IRQHandler(void)
FIFO1的中断函数名称是:void CAN1_RX1_IRQHandler(void)

CAN发送函数

/****************************************************************************
*@*名称 : CAN_SetMsg
*@*功能 : 配置CAN的发送信箱进行发送
*@*形参 : CanTxMsg型的结构体地址,发送的拓展ID,发送的数据存放地址
*@*返回值 : 无
****************************************************************************/
void CAN_SetMsg(CanTxMsg *TxMessage,uint32_t EXT_ID ,uint8_t* Data)
{	  uint8_t ubCounter = 0;//TxMessage.StdId=0x00;						 TxMessage->ExtId=EXT_ID;					 //使用的扩展IDTxMessage->IDE=CAN_ID_EXT;					 //扩展模式TxMessage->RTR=CAN_RTR_DATA;				 //发送的是数据TxMessage->DLC=8;							 //数据长度为8字节/*设置要发送的数据0-7*/for (ubCounter = 0; ubCounter < 8; ubCounter++){TxMessage->Data[ubCounter] = Data[ubCounter];}CAN_Transmit(CAN1, TxMessage);//将TMIDxR_TxRQ标志位置1,发送CAN发送邮箱的报文发送出去
}

接收中断函数编写

/****************************************************************************
*@*名称 : USB_LP_CAN1_RX0_IRQHandler
*@*功能 : CAN模块的FIFO0接收中断函数
*@*形参 : 无
*@*返回值 : 无
****************************************************************************/
void USB_LP_CAN1_RX0_IRQHandler(void)
{/*从邮箱中读出报文*/CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);/* 比较ID是否为0x1111 */ if((RxMessage.ExtId >= 0x1110) && (RxMessage.IDE==CAN_ID_EXT) && (RxMessage.DLC==8) ){CAN_flag = 1; 					       //接收成功  }else{CAN_flag = 0; 					   //接收失败}
}

总结

在以上函数中我打开了两个接收FIFO,希望能一次性接收6个CAN的报文,但在实际实验中,连续发送6个报文,只能接收3个成功。
查了好久的原因还是没有解决该问题,如果有大佬知道为什么,希望能帮我解惑。

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

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

相关文章

接口--抽象方法

回答问题&#xff1a; 1.接口是什么&#xff1f; 2.接口中可以包含什么内容&#xff1f; 3.如何定义接口格式&#xff1f; 4.接口定义抽象方法格式&#xff1f; Code //接口是公共规范标准&#xff0c;类似于“模具” //如何定义接口格式&#xff1f;/** public interface 接…

CSS 对齐、组合选择符、伪类、伪元素、导航栏

一、CSS 对齐&#xff1a; 1&#xff09;、元素居中对齐&#xff1a; 水平居中对齐一个元素&#xff0c;可以使用margin&#xff1a;auto&#xff0c;设置到元素的宽度将防止它溢出到容器的边缘。元素通过指定宽度&#xff0c;并将两边的空外边距平均分配。示例&#xff1a; …

【前端】Jquery UI +PHP 实现表格拖动排序

目的&#xff1a;使用jquery ui库实现对表格拖拽排序&#xff0c;并且把排序保存到数据库中 效果如下 一、准备工作&#xff1a; 1、下载jquery ui库&#xff0c;可以直接引用线上路径 <link rel"stylesheet" href"https://code.jquery.com/ui/1.12.1/them…

IS-LM模型:从失衡到均衡的模拟

IS-LM模型&#xff1a;从失衡到均衡的模拟 文章目录 IS-LM模型&#xff1a;从失衡到均衡的模拟[toc] 1 I S − L M 1 IS-LM 1IS−LM模型2 数值模拟2.1 长期均衡解2.2 政府部门引入2.3 价格水平影响2.4 随机扰动因素 1 I S − L M 1 IS-LM 1IS−LM模型 I S − L M IS-LM IS−LM是…

如何在CPU上进行高效大语言模型推理

大语言模型&#xff08;LLMs&#xff09;已经在广泛的任务中展示出了令人瞩目的表现和巨大的发展潜力。然而&#xff0c;由于这些模型的参数量异常庞大&#xff0c;使得它们的部署变得相当具有挑战性&#xff0c;这不仅需要有足够大的内存空间&#xff0c;还需要有高速的内存传…

无需标注海量数据,目标检测新范式OVD

当前大火的多模态GPT-4在视觉能力上只具备目标识别的能力&#xff0c;还无法完成更高难度的目标检测任务。而识别出图像或视频中物体的类别、位置和大小信息&#xff0c;是现实生产中众多人工智能应用的关键&#xff0c;例如自动驾驶中的行人车辆识别、安防监控应用中的人脸锁定…

智慧工地源码 手册文档 app 数据大屏、硬件对接、萤石云

智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR、AR等技术相结合&#xff0c;为工程项目管理提供先进技术手段&#xff0c;构建工地现场智能监控和控制体系&#xff0c;弥补传统方法在监管中的缺陷&#xff0c;最终实现项目对人、机、料、法、环的全方…

ZZ308 物联网应用与服务赛题第E套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 &#xff08;E卷&#xff09; 赛位号&#xff1a;______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等&#xff1b; 2.竞赛任务中所使用的…

文件包含漏洞培训

CTF介绍 MISC(Miscellaneous)类型,即安全杂项,题目或涉及流量分析、电子取证、人肉搜索、数据分析等等。CRYPTO(Cryptography)类型,即密码学,题目考察各种加解密技术,包括古典加密技术、现代加密技术甚至出题者自创加密技术。PWN类型,PWN在黑客俚语中代表着攻破、取得权限…

21 移动网络的前世今生

1、移动网络的发展历程 发展过程就是&#xff1a;2G,3G,4G,5G的过程&#xff0c;用2G看txt&#xff0c;用3G看jpg&#xff0c;用4G看avi。 2、2G网络 手机本来是用来打电话的&#xff0c;不是用来上网的&#xff0c;所以原来在2G时代&#xff0c;上网使用的不是IP网络&#…

关于视频封装格式和视频编码格式的简介

文章目录 简介视频封装格式&#xff08;Video Container Format&#xff09;视频编码格式&#xff08;Video Compression Format&#xff09;两者关系总结webm 格式简介webm视频编码格式webm音频编码格式webm总结 简介 视频封装格式&#xff08;Video Container Format&#x…

sql学习

因为之前sql学的太烂了&#xff0c;想整理一下 一.什么是 SQL&#xff1f; SQL 是用于访问和处理数据库的标准的计算机语言。 SQL 指结构化查询语言SQL 使我们有能力访问数据库SQL 是一种 标准计算机语言 二.SQL 能做什么&#xff1f; SQL 面向数据库执行查询SQL 可从数据库…

2020 ICPC 澳门(G,J,I)详解

链接&#xff1a;The 2020 ICPC Asia Macau Regional Contest G Game on Sequence 题意 给定长度为 n n n 数组 a i a_i ai​&#xff0c;A与G博弈&#xff0c;G先手&#xff0c;给定初始位置 k k k&#xff0c;若当前在 i i i 点转移到 j j j&#xff0c;满足 i <…

【编程语言发展史】SQL的发展历史

目录 目录 SQL概述 SQL发展历史 SQL特点 SQL基本语句 SQL是结构化查询语言(Structure Query Language)的缩写&#xff0c;它是使用关系模型的数据库应用语言&#xff0c;由IBM在70年代开发出来&#xff0c;作为IBM关系数据库原型System R的原型关系语言&#xff0c;实现了…

MySQL -- 用户管理

MySQL – 用户管理 文章目录 MySQL -- 用户管理一、用户1.用户信息2.创建用户3.删除用户4.远端登录MySQL5.修改用户密码6.数据库的权限 一、用户 1.用户信息 MySQL中的用户&#xff0c;都存储在系统数据库mysql的user表中&#xff1a; host&#xff1a; 表示这个用户可以从…

关于Alibaba Cloud Toolkit 下载配置以及后端自动部署

idea中File-Settings-Plugins 搜索Alibaba Cloud Toolkit点击下载&#xff0c;下载完成重启 1、点击 Tools-Alibaba Cloud-Deploy to Host 部署到主机 2、配置服务器ip、jar包启动命令、服务器jar存放位置 3、设置服务器ip用户名密码&#xff0c;点击测试连接情况 4、配置脚本…

微信支付测试用例设计怎么设计?

功能测试用例&#xff1a; 测试支付流程是否正常&#xff0c;包括选择支付方式&#xff0c;输入金额&#xff0c;确认支付&#xff0c;输入密码&#xff0c;支付成功等步骤 测试不同的支付方式&#xff0c;如微信零钱&#xff0c;银行卡&#xff0c;信用卡等 测试不同的支付场…

《第三期(先导课)》之《Python 开发环境搭建》

文章目录 《第 1 节 初始Python》《第 6 节 pip包管理工具》 《第 1 节 初始Python》 。。。 《第 6 节 pip包管理工具》 pip是Python的包管理工具,用于安装、升级和管理Python包。 pip是Python标准库之外的一个第三方工具,可以从Python Package Index(PyPI)下载和安装各种P…

自动化实战 - 测试个人博客系统

前言 本篇使用Selenium3Junit5对个人博客进行自动化测试&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录 前言一.web自动化测试用例二.测试准备1.注册界面自动化测试测试过程中遇到的Bug: 2.登录界面自动…

【遍历二叉树的非递归算法,二叉树的层次遍历】

文章目录 遍历二叉树的非递归算法二叉树的层次遍历 遍历二叉树的非递归算法 先序遍历序列建立二叉树的二叉链表 中序遍历非递归算法 二叉树中序遍历的非递归算法的关键&#xff1a;在中序遍历过某个结点的整个左子树后&#xff0c;如何找到该结点的根以及右子树。 基本思想&a…