stm32f103c8t6的freemodbus移植

news/发布时间2024/5/19 7:03:51
                                                    注意:demo.c 不要加入到程序中来。

1 在main.h文件中加入 #include "stm32f1xx_hal.h" 文件也可以不加

a: 每次重新生成程序时 在主程序main.c中注释掉// MX_USART2_UART_Init();函数,因为在freemodbus中已经调用了该 函数
b: 在uart.c中重写程序void MX_USART2_UART_Init(void)为
void MX_USART2_UART_Init (uint8_t ucPORT, uint32_t ulBaudRate, uint8_t eParity)
{
if(ucPORT != 2)
return ;
huart2.Instance = DEBUG_USART;
huart2.Init.BaudRate = ulBaudRate;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = eParity;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
while(1);
}
}
在uart.h中也要改写void MX_USART2_UART_Init (uint8_t ucPORT, uint32_t ulBaudRate, uint8_t eParity)

2 在main.c中加入#include "mb.h" #include "mbport.h" #include "user_mb_app.h" 三个文件

3 分别加入modbus驱动的c文件,定义h文件的路径

4 在main.c中加入:

define MB_SAMPLE_TEST_SLAVE_ADDR 1

extern UCHAR ucSDiscInBuf[S_DISCRETE_INPUT_NDISCRETES/8] ;

extern UCHAR ucSCoilBuf[S_COIL_NCOILS/8];

extern USHORT usSRegInBuf[S_REG_INPUT_NREGS];

extern USHORT usSRegHoldBuf[S_REG_HOLDING_NREGS];

void Delay(__IO uint32_t nCount)

{
for(; nCount != 0; nCount--);
}
加入:eMBInit( MB_RTU, MB_SAMPLE_TEST_SLAVE_ADDR, MB_MASTER_USARTx, MB_MASTER_USART_BAUDRATE, MB_PAR_NONE);

 加入:eMBEnable();	和eMBPoll(  );在main.c开始加入modbus地址宏定义#define MB_SAMPLE_TEST_SLAVE_ADDR	1								

5 在uart.h中加入

/* USER CODE BEGIN Includes */
//引脚定义
/usart******/

define DEBUG_USART USART2

define DEBUG_USART_CLK_ENABLE() __USART2_CLK_ENABLE();

define RCC_PERIPHCLK_UARTx RCC_PERIPHCLK_USART2

define RCC_UARTxCLKSOURCE_SYSCLK RCC_USART2CLKSOURCE_SYSCLK

define __HAL_RCC_USARTx_CLK_DISABLE __HAL_RCC_USART2_CLK_DISABLE();

define DEBUG_USART_RX_GPIO_PORT GPIOA

define DEBUG_USART_RX_GPIO_CLK_ENABLE() __GPIOA_CLK_ENABLE()

define DEBUG_USART_RX_PIN GPIO_PIN_3

define DEBUG_USART_TX_GPIO_PORT GPIOA

define DEBUG_USART_TX_GPIO_CLK_ENABLE() __GPIOA_CLK_ENABLE()

define DEBUG_USART_TX_PIN GPIO_PIN_2

define DEBUG_USART_IRQHandler USART2_IRQHandler

define DEBUG_USART_IRQ USART2_IRQn

define MB_MASTER_USARTx 2 //使用串口2

define MB_MASTER_USART_BAUDRATE 9600 //波特率

define MB_MASTER_USART_PARITY UART_PARITY_NONE

/usart end/
/
485************************/

/* 如果需要使用串口转485 请打开此宏 */
//#define MODBUS_MASTER_USE_CONTROL_PIN

define MODBUS_MASTER_GPIO_PORT GPIOC

define MODBUS_MASTER_GPIO_PIN GPIO_PIN_2

define MODBUS_MASTER_GPIO_PIN_HIGH GPIO_PIN_SET

define MODBUS_MASTER_GPIO_PIN_LOW GPIO_PIN_RESET

define MODBUS_MASTER_GPIO_CLK_ENABLE() __GPIOC_CLK_ENABLE()

/***********************485 end*************************************/

加入以上文件

6 修改stm32f1xx_it.c文件增加以下三个文件

           extern void prvvUARTTxReadyISR(void);extern void prvvUARTRxISR(void);extern void prvvTIMERExpiredISR( void );

7 在stm32f1xx_it.c文件中;函数void USART2_IRQHandler(void)中增加:(选择是发送中断还是接收中断)

      if(__HAL_UART_GET_IT_SOURCE(&huart2, UART_IT_RXNE)!= RESET) {prvvUARTRxISR();		}if(__HAL_UART_GET_IT_SOURCE(&huart2, UART_IT_TXE)!= RESET) {prvvUARTTxReadyISR();	}HAL_NVIC_ClearPendingIRQ(USART2_IRQn);HAL_UART_IRQHandler(&huart2);

8 在stm32f1xx_it.c文件中;增加一个函数:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{
/* NOTE : This function Should not be modified, when the callback is needed,

                 the __HAL_TIM_PeriodElapsedCallback could be implemented in the user file

*/
prvvTIMERExpiredISR( );
}

//以上是modbus在使用Hall库时的移置说明//
//
以下是关于定时器的使用说明**********//

在主程序中加入 HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)此函数在stm32f1xx_hal_time.c中存在
以中断的方式启动定时器

在主程序主循环中加入:__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,pluse_wide );改变脉冲的宽度  

在定时器tim3的中断函数void TIM3_IRQHandler(void)中加入 pluse_wide++;定时改变脉冲宽度

       tim.c中htim4.Init.Prescaler = 3200;(初始化为20kHZ)  然后htim4.Init.Period = 35;(3.5时间溢出)  开发板与ttl转485的链接ttl转485的RX端链接到开发板的A3(开发板的接收端)   TX端接A2(开发板发送端)A+接T/R+    B-接T/R-#define PRO_CMD_LEN        5;uint8_t     rxBufPos=0;uint8_t     proBuffer[10]="#s456;\n";//定义要发送的数据uint8_t    rxBuffer[10]uint8_t       rxCompleted=RESET;

// 串口接收完成中断回调函数

          void HAL_UART_RxCpltCallback(UART_HandleTypeDef* uartHandle){ if(uartHandle->Instance==USART1)rxCompleted=SET ;//中断接收完成__HAL_UART_ENABLE_IT(uartHandle,UART_IT_IDLE);//开启串口空闲中断}

void on_UART_IDLE(UART_HandleTypeDef *huart)//检测idle中断事件并处理
{
if(__HAL_UART_GET_IT_SOURCE(huart,UART_IT_IDLE)==RESET)//判断IDLE中断是否开启
return;
__HAL_UART_CLEAR_IDLEFLAG(huart); //清除中断空闲标志位
__HAL_UART_DISABLE_IT(huart,UART_IT_IDLE); //禁止idle事件中断
if( rxCompleted) //已定义了rxcompleted为uint8_t已经接收了一个字节
{
unsigned char ch = rxBuffer[0];

                     if( rxBuffer[0]=="#")                            //如果是起始位rxBufPos=0;                             //存储位置复位if(rxBufPos<PRO_CMD_LEN )          //如果存储缓冲区小于设定长度{proBuffer[rxBufPos]=ch;rxBufPos++;if(ch==";")                                //如果接收到   ;{HAL_UART_Transmit(huart,proBuffer,sizeof (proBuffer),200);HAL_Delay(100);  //加入其他的处理指令}}rxCompleted=RESET;HAL_UART_Receive_IT(huart,rxBuffer,PRO_CMD_LEN);//再次接收//将RX_CMD_LEN设置为1,调用HAL_UART_Receive_IT(huart,rxBuffer,RX_CMD_LEN)//  这样每接收一个字符会开启一次中断。在HAL_UART_RxCpltCallback()里开启IDLE事件中断//就会执行   void on_UART_IDLE(UART_HandleTypeDef *huart)函数      }}

                           使用定时器1输出PWM波说明HAL_TIM_Base_Start(&htim1);//启动定时器HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);//启动PWM输出__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0X0037);//修改CCR值,即改变脉冲宽度 

( htim3.Init.Prescaler = 1440; htim3.Init.Period = 10; sConfigOC.Pulse = 7; 频率为72000000/1440x10 有10个脉冲为1周期其中有7个脉冲为高电平 )

HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1n);//定义互补通道要增加  #define TIM_CHANNEL_1n  0x00000002U  的宏定义                #define TIM_CHANNEL_1                      0x00000000U#define TIM_CHANNEL_1n       0x00000002U     #define TIM_CHANNEL_2          0x00000004U#define TIM_CHANNEL_2n       0x00000006U     #define TIM_CHANNEL_3          0x00000008U#define TIM_CHANNEL_3n       0x0000000AU     #define TIM_CHANNEL_4          0x0000000CU#define TIM_CHANNEL_4n       0x0000000EU     #define TIM_CHANNEL_ALL        0x00000018U//定义互补通道使用基础定时器TIM4进行定时说明HAL_GPIO_TogglePin( GPIOC, GPIO_PIN_13);在主程序中加入      HAL_TIM_Base_Start_IT(&htim4);//以中断方式启动定时器 或者加入以下4个宏函数:

vMBPortTimersEnable( )
{
__HAL_TIM_CLEAR_IT(&htim4,TIM_IT_UPDATE);
__HAL_TIM_ENABLE_IT(&htim4,TIM_IT_UPDATE);
__HAL_TIM_SET_COUNTER(&htim4,0);
__HAL_TIM_ENABLE(&htim4); //使能定时器
}

    vMBPortTimersDisable(  ){/* 关闭定时器 */__HAL_TIM_DISABLE(&htim4);__HAL_TIM_SET_COUNTER(&htim4,0);__HAL_TIM_DISABLE_IT(&htim4,TIM_IT_UPDATE);__HAL_TIM_CLEAR_IT(&htim4,TIM_IT_UPDATE);

}

这个函数处理TIM3全局中断 void TIM3_IRQHandler(void)

        在tim.c中加入   void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){HAL_GPIO_TogglePin( GPIOC, GPIO_PIN_13);}切换pc13的状态

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//在stm32fxx_hal_tim.c中是弱函数存在,必须重写

                                 } 或者在   it.c中加入也可以    void TIM4_IRQHandler(void){/* USER CODE BEGIN TIM4_IRQn 0 */HAL_GPIO_TogglePin( GPIOC, GPIO_PIN_13);/* USER CODE END TIM4_IRQn 0 */HAL_TIM_IRQHandler(&htim4);}//基础定时器只需要选择内部时针关于串口数据传输所有的串口ISR都是调用HAL_UART_IRQHandler();这个处理函数,这个函数是中断处理通用函数这个函数会判断产生中断的事件的类型,清除事件中断的标志位,调用中断事件类型的中断回调函数注意:demo.c 不要加入到程序中来。

1 在main.h文件中加入 #include "stm32f1xx_hal.h" 文件也可以不加

a: 每次重新生成程序时 在主程序main.c中注释掉// MX_USART2_UART_Init();函数,因为在freemodbus中已经调用了该 函数
b: 在uart.c中重写程序void MX_USART2_UART_Init(void)为
void MX_USART2_UART_Init (uint8_t ucPORT, uint32_t ulBaudRate, uint8_t eParity)
{
if(ucPORT != 2)
return ;
huart2.Instance = DEBUG_USART;
huart2.Init.BaudRate = ulBaudRate;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = eParity;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
while(1);
}
}
在uart.h中也要改写void MX_USART2_UART_Init (uint8_t ucPORT, uint32_t ulBaudRate, uint8_t eParity)

2 在main.c中加入#include "mb.h" #include "mbport.h" #include "user_mb_app.h" 三个文件

3 分别加入modbus驱动的c文件,定义h文件的路径

4 在main.c中加入:

define MB_SAMPLE_TEST_SLAVE_ADDR 1

extern UCHAR ucSDiscInBuf[S_DISCRETE_INPUT_NDISCRETES/8] ;

extern UCHAR ucSCoilBuf[S_COIL_NCOILS/8];

extern USHORT usSRegInBuf[S_REG_INPUT_NREGS];

extern USHORT usSRegHoldBuf[S_REG_HOLDING_NREGS];

void Delay(__IO uint32_t nCount)

{
for(; nCount != 0; nCount--);
}
加入:eMBInit( MB_RTU, MB_SAMPLE_TEST_SLAVE_ADDR, MB_MASTER_USARTx, MB_MASTER_USART_BAUDRATE, MB_PAR_NONE);

 加入:eMBEnable();	和eMBPoll(  );在main.c开始加入modbus地址宏定义#define MB_SAMPLE_TEST_SLAVE_ADDR	1								

5 在uart.h中加入

/* USER CODE BEGIN Includes */
//引脚定义
/usart******/

define DEBUG_USART USART2

define DEBUG_USART_CLK_ENABLE() __USART2_CLK_ENABLE();

define RCC_PERIPHCLK_UARTx RCC_PERIPHCLK_USART2

define RCC_UARTxCLKSOURCE_SYSCLK RCC_USART2CLKSOURCE_SYSCLK

define __HAL_RCC_USARTx_CLK_DISABLE __HAL_RCC_USART2_CLK_DISABLE();

define DEBUG_USART_RX_GPIO_PORT GPIOA

define DEBUG_USART_RX_GPIO_CLK_ENABLE() __GPIOA_CLK_ENABLE()

define DEBUG_USART_RX_PIN GPIO_PIN_3

define DEBUG_USART_TX_GPIO_PORT GPIOA

define DEBUG_USART_TX_GPIO_CLK_ENABLE() __GPIOA_CLK_ENABLE()

define DEBUG_USART_TX_PIN GPIO_PIN_2

define DEBUG_USART_IRQHandler USART2_IRQHandler

define DEBUG_USART_IRQ USART2_IRQn

define MB_MASTER_USARTx 2 //使用串口2

define MB_MASTER_USART_BAUDRATE 9600 //波特率

define MB_MASTER_USART_PARITY UART_PARITY_NONE

/usart end/
/
485************************/

/* 如果需要使用串口转485 请打开此宏 */
//#define MODBUS_MASTER_USE_CONTROL_PIN

define MODBUS_MASTER_GPIO_PORT GPIOC

define MODBUS_MASTER_GPIO_PIN GPIO_PIN_2

define MODBUS_MASTER_GPIO_PIN_HIGH GPIO_PIN_SET

define MODBUS_MASTER_GPIO_PIN_LOW GPIO_PIN_RESET

define MODBUS_MASTER_GPIO_CLK_ENABLE() __GPIOC_CLK_ENABLE()

/***********************485 end*************************************/

加入以上文件

6 修改stm32f1xx_it.c文件增加以下三个文件

           extern void prvvUARTTxReadyISR(void);extern void prvvUARTRxISR(void);extern void prvvTIMERExpiredISR( void );

7 在stm32f1xx_it.c文件中;函数void USART2_IRQHandler(void)中增加:(选择是发送中断还是接收中断)

      if(__HAL_UART_GET_IT_SOURCE(&huart2, UART_IT_RXNE)!= RESET) {prvvUARTRxISR();		}if(__HAL_UART_GET_IT_SOURCE(&huart2, UART_IT_TXE)!= RESET) {prvvUARTTxReadyISR();	}HAL_NVIC_ClearPendingIRQ(USART2_IRQn);HAL_UART_IRQHandler(&huart2);

8 在stm32f1xx_it.c文件中;增加一个函数:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{
/* NOTE : This function Should not be modified, when the callback is needed,

                 the __HAL_TIM_PeriodElapsedCallback could be implemented in the user file

*/
prvvTIMERExpiredISR( );
}

//以上是modbus在使用Hall库时的移置说明//
//
以下是关于定时器的使用说明**********//

在主程序中加入 HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)此函数在stm32f1xx_hal_time.c中存在
以中断的方式启动定时器

在主程序主循环中加入:__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,pluse_wide );改变脉冲的宽度  

在定时器tim3的中断函数void TIM3_IRQHandler(void)中加入 pluse_wide++;定时改变脉冲宽度

       tim.c中htim4.Init.Prescaler = 3200;(初始化为20kHZ)  然后htim4.Init.Period = 35;(3.5时间溢出)  开发板与ttl转485的链接ttl转485的RX端链接到开发板的A3(开发板的接收端)   TX端接A2(开发板发送端)A+接T/R+    B-接T/R-#define PRO_CMD_LEN        5;uint8_t     rxBufPos=0;uint8_t     proBuffer[10]="#s456;\n";//定义要发送的数据uint8_t    rxBuffer[10]uint8_t       rxCompleted=RESET;

// 串口接收完成中断回调函数

          void HAL_UART_RxCpltCallback(UART_HandleTypeDef* uartHandle){ if(uartHandle->Instance==USART1)rxCompleted=SET ;//中断接收完成__HAL_UART_ENABLE_IT(uartHandle,UART_IT_IDLE);//开启串口空闲中断}

void on_UART_IDLE(UART_HandleTypeDef *huart)//检测idle中断事件并处理
{
if(__HAL_UART_GET_IT_SOURCE(huart,UART_IT_IDLE)==RESET)//判断IDLE中断是否开启
return;
__HAL_UART_CLEAR_IDLEFLAG(huart); //清除中断空闲标志位
__HAL_UART_DISABLE_IT(huart,UART_IT_IDLE); //禁止idle事件中断
if( rxCompleted) //已定义了rxcompleted为uint8_t已经接收了一个字节
{
unsigned char ch = rxBuffer[0];

                     if( rxBuffer[0]=="#")                            //如果是起始位rxBufPos=0;                             //存储位置复位if(rxBufPos<PRO_CMD_LEN )          //如果存储缓冲区小于设定长度{proBuffer[rxBufPos]=ch;rxBufPos++;if(ch==";")                                //如果接收到   ;{HAL_UART_Transmit(huart,proBuffer,sizeof (proBuffer),200);HAL_Delay(100);  //加入其他的处理指令}}rxCompleted=RESET;HAL_UART_Receive_IT(huart,rxBuffer,PRO_CMD_LEN);//再次接收//将RX_CMD_LEN设置为1,调用HAL_UART_Receive_IT(huart,rxBuffer,RX_CMD_LEN)//  这样每接收一个字符会开启一次中断。在HAL_UART_RxCpltCallback()里开启IDLE事件中断//就会执行   void on_UART_IDLE(UART_HandleTypeDef *huart)函数      }}

                           使用定时器1输出PWM波说明HAL_TIM_Base_Start(&htim1);//启动定时器HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);//启动PWM输出__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0X0037);//修改CCR值,即改变脉冲宽度 

( htim3.Init.Prescaler = 1440; htim3.Init.Period = 10; sConfigOC.Pulse = 7; 频率为72000000/1440x10 有10个脉冲为1周期其中有7个脉冲为高电平 )

HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1n);//定义互补通道要增加  #define TIM_CHANNEL_1n  0x00000002U  的宏定义                #define TIM_CHANNEL_1                      0x00000000U#define TIM_CHANNEL_1n       0x00000002U     #define TIM_CHANNEL_2          0x00000004U#define TIM_CHANNEL_2n       0x00000006U     #define TIM_CHANNEL_3          0x00000008U#define TIM_CHANNEL_3n       0x0000000AU     #define TIM_CHANNEL_4          0x0000000CU#define TIM_CHANNEL_4n       0x0000000EU     #define TIM_CHANNEL_ALL        0x00000018U//定义互补通道使用基础定时器TIM4进行定时说明HAL_GPIO_TogglePin( GPIOC, GPIO_PIN_13);在主程序中加入      HAL_TIM_Base_Start_IT(&htim4);//以中断方式启动定时器 或者加入以下4个宏函数:

vMBPortTimersEnable( )
{
__HAL_TIM_CLEAR_IT(&htim4,TIM_IT_UPDATE);
__HAL_TIM_ENABLE_IT(&htim4,TIM_IT_UPDATE);
__HAL_TIM_SET_COUNTER(&htim4,0);
__HAL_TIM_ENABLE(&htim4); //使能定时器
}

    vMBPortTimersDisable(  ){/* 关闭定时器 */__HAL_TIM_DISABLE(&htim4);__HAL_TIM_SET_COUNTER(&htim4,0);__HAL_TIM_DISABLE_IT(&htim4,TIM_IT_UPDATE);__HAL_TIM_CLEAR_IT(&htim4,TIM_IT_UPDATE);

}

这个函数处理TIM3全局中断 void TIM3_IRQHandler(void)

        在tim.c中加入   void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){HAL_GPIO_TogglePin( GPIOC, GPIO_PIN_13);}切换pc13的状态

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//在stm32fxx_hal_tim.c中是弱函数存在,必须重写

                                 } 或者在   it.c中加入也可以    void TIM4_IRQHandler(void){/* USER CODE BEGIN TIM4_IRQn 0 */HAL_GPIO_TogglePin( GPIOC, GPIO_PIN_13);/* USER CODE END TIM4_IRQn 0 */HAL_TIM_IRQHandler(&htim4);}//基础定时器只需要选择内部时针关于串口数据传输所有的串口ISR都是调用HAL_UART_IRQHandler();这个处理函数,这个函数是中断处理通用函数这个函数会判断产生中断的事件的类型,清除事件中断的标志位,调用中断事件类型的中断回调函数

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

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

相关文章

《代码随想录》-1.数组理论基础

特点: 1.内存空间-连续存放 ——> 增删元素麻烦 2.数据-相同类型 3.下标从0开始 注意:数组的元素采用覆盖的形式 二维数组在内存的空间地址: 1.C++中二维数组在地址空间上是连续的2.Java中二维数组每一行的头节点的地址是没有规则的

[转]ptp(precision time protocol)时钟同步

一、介绍1:什么是ptpPTP(Precision Time Protocol) 是一个通过网络同步时钟的一个协议。当硬件支持时,PTP 精度能达到亚微秒,比 NTP(Network Time Protocol)精度更高。 2:ptp应用场景1)数据中心数据中心需要NTP/PTP同步,以确保集群的时域运行。同步对于虚拟机计算是必不…

Camunda 流程执行错误处理ERROR BOUNDARY EVENT

ERROR BOUNDARY EVENT:在任务发生异常时候会触发走,在代码中必须显式抛出throw new BpmnError("error.....");public void execute(DelegateExecution delegateExecution) throws Exception {System.out.println("进来了>>>>>>>>>…

关于diffusion model一些统计和数学的基础知识

likelihood-based models,通过(近似)最大似然直接学习分布的probability density(或mass)函数。典型的基于似然的模型包括自回归模型、归一化流模型、基于能量的模型(EBMs)和变分自编码器(VAEs)。 概率质量函数(Probability Mass Function,PMF):概率质量函数用于描述离散随…

AutoCAD C# 两不平行直线倒圆弧算法

参考的博客:https://www.cnblogs.com/JJBox/p/14300098.html 下面是计算示例主要计算代码:var peo = new PromptEntityOptions("选择直线1"){AllowNone = false,AllowObjectOnLockedLayer = false};peo.SetRejectMessage("请选择直线Line");peo.AddAllow…

2. 基础配置

1. 配置文件格式 1.1 配置文件自动提示功能消失解决方案 ​​ 1.2 SpringBoot配置文件加载顺序(了解) application.properties > application.yml > application.yaml 1.3 注意事项 SpringBoot核心配置文件名为application SpringBoot内置属性过多,且所有属性集中…