STM32学习----RS232串口通讯

2023-11-02

一、RS232相关概念

       RS ==Recommend Standard ==推荐标准;

        232==标识号,第232号;

        时间:1962年

        地点:美国

        人物:美国电子工业协会 == Electronic Industries Association ==(美国)电子工业协会

        事件:发布了一个串行通信的物理接口结合逻辑电平的规范文件,就是这个232号文件。

        

        现在关于串口通讯的叫法太多,什么RS232通讯、串口通讯、DB9通讯、UART通讯等等,其实这些称呼都跟这个额232号文件有些关系,随便怎么叫吧,理解就行。

        串行通讯,从字面意思理解就行,就是把数据串成一串发出去,比如一个字节8位,高位先发出去,那么发送顺序就是bit7--bit6--bit5--bit4--bit3--bit2--bit1--bit0。

        就某种单片机来说,比如STM32F103,它有好几个UART口,俗称串口,但是它的引脚高电平是3.3V,低电平是0V,正好满足TTL的电平标准,2.4V--5V表示逻辑1,0V--0.4V表示逻辑0。

        但是电压低了传输距离就比较短,为了传输远点,就把TTL电平转换成RS232电平,通过某种电平转换芯片,比如MAX232。RS232电平逻辑是-3V到-15V表示逻辑1,3V到15V表示逻辑0。这相当于把电平扩大,但是也只能传输十几米。

        人们为了传输更远,就用上了差分传输,比如RS422和RS485,用两根线的电压差来表示逻辑1和逻辑0,两根线的压差为2V至6V表示逻辑1,两线的压差为-2V至-6V表示逻辑0,这样就能传输1000米以上。

数据在一根线上传输,那什么时候是开始,什么时候是结束,每位数据的宽度是多少、数据有没有传输错误。那就需要约定一下,不是谁都像孙悟空一样有觉悟,头上敲三下就是让他凌晨3点过来,还是要讲清楚点好。

线顶一个空闲的状态,就是没传输数据的时候,传输线的电平逻辑是1,用单片机TTL的电平标准就是3.3V,高电平;

开始:发出1位逻辑0电平

结束:发出1位逻辑1电平

数据宽度:要定义每一位的宽度是多少,不然你发两位1我却认为是1位1,怎么办,发送和接收的双发要统一度量衡,才不会有误解。这个数据宽度就是用波特率的约定。

数据有没有传错:那就把收到的数据大家数一数,算一算,我给你发100块钱,我还告诉你是100张一块的,那你收到之后,要数一数,是不是100张,是不是100块,都对了,那就表示是我给你的。

传输一个字节数据的示意图

STM32F103单片机USART内部结构图

 这个图太大了,对新人实在是不友好,对老人也不友好,还是需要好好的梳理一下,总共就4块

1、串口引脚:发送和接收数据的外部引脚;

2、波特率发生器:产生波特率,就是为了控制数据每个bit的宽度;

3、发送与接收的控制单元:控制数据怎么发送,怎么接收;

4、发送与接收数据寄存器:单片机的发送的数据在内部怎么产生,接收的数据怎么吸收;

串口数据收发:

1、轮询收发

  发送数据

        1、声明一个UART_HandleTypeDef结构

        2、配置波特率、字符长度、停止位、校验位等

        3、UART 管脚配置:配置管脚位置和时钟

        4、UART初始化

        5、开始发送数据

       用STM32CubeMX生成代码,前面4步都自动生成好了,只需要在第五步调用发送函数就可以

以下是自动生成的配置代码

#include "usart.h"


//声明一个UART句柄结构体,应为使用串口1 ,结构体命名为huart1
UART_HandleTypeDef huart1;


//配置串口波特率、数据长度、停止位、校验位等
//调用HAL_UART_Init函数,再调用HAL_UART_MspInit函数,
//完成UART管脚和时钟的配置,以及串口初始化
void MX_USART1_UART_Init(void)
{
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }

}

//配置UART管脚位置和时钟
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(uartHandle->Instance==USART1)
  {

    __HAL_RCC_USART1_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();

    //串口1使用GPIOA的,PIN9和PIN10
    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* 串口中断配置,轮询模式可以不用配置中断*/
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);

  }
}


//相当于还原,还原到配置之前的状态
void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{
  if(uartHandle->Instance==USART1)
  {

    __HAL_RCC_USART1_CLK_DISABLE();

    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);

    HAL_NVIC_DisableIRQ(USART1_IRQn);

  }
}

  在main文件中去完成串口数据发送

        串口发送使用函数

//huart:用哪个串口发送
//pData:被发送的数据指针
//Size:发送的数据个数
//Timeout:超时时间
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

        串口接收使用函数

//huart:用哪个串口接收
//pData:接收的数据存放位置
//Size:接收的数据个数
//Timeout:超时时间
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

收发实验放在一起比较好,本实验是单片机与PC之间进行数据传输:

PC向单片机发送5个数据 0xAA、 0x11 、0x22 、0x33 、0xBB

单片机每次接收5个数据,并判断第一个数据是不是AA,最后一个数据是不是BB;

如果判断正确,就把事先准备好的6个数据发出去;

还要把接收到的数据清空,等待下一次接收新数据。

#include "main.h"
#include "usart.h"
#include "gpio.h"

//将要发送的数据
uint8_t Tx_Buffer[6] = {0x5A, 0x01,0x02,0x03,0x04,0xA5};

//接收的数据存放位置
uint8_t Rx_Buffer[5] = {0};

void SystemClock_Config(void);

int main(void)
{

  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  MX_GPIO_Init();
  MX_USART1_UART_Init();

  while (1)
  {
    //开始接收数据
    if(HAL_UART_Receive(&huart1, Rx_Buffer, 5, 10))
    {
      //如果收到的第一个数据是AA,第五个数据是BB
      //就把要发送的数据发出去
      if((Rx_Buffer[0]==0xAA)&&(Rx_Buffer[4]==0xBB))
      {
        HAL_UART_Transmit(&huart1, Tx_Buffer, 6, 10);
        
        //也可以在收到数据的时候点个灯
        //当然,也可以根据其他的数据来做该做的事
        HAL_GPIO_TogglePin(GPIOA, LED0_Pin);
      }
      
      //把接收到的数据清空,等待下一次接收
      for(uint8_t i=0; i<5;i++)
      {
        Rx_Buffer[i] = 0;
      }
    }
  }
}

2、中断收发

//串口中断发送函数
//huart: 要发送数据的串口
//pData:要发送的数据指针
//Size:要发送的数据个数,
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)


//串口中断接收函数
//huart: 要接收数据的串口
//pData:接收的数据存放位置
//Size:要接收的数据个数
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

针对发送中断函数,把设置的Size个数据发送完之后,才执行中断,就可以执行回调函数了,一般数据发送完,我们也不用做什么事情,回调函数也懒得写,有需求的话就去写吧。

针对接收中断函数,也是接收到Size个数据之后才产生中断,,然后执行回调函数,可以在回调函数中做一些操作,比如判断数据的对错,以及收到数据要做的事情,一般是比较简短的事情,太复杂的事情就不要再回调函数里面做了,可以在回调函数中做个标记,然后再大循环中处理。

以下例程是中断收发数据

1、单片机设置接收中断使能,

2、等待PC发送5个数据0xAA、 0x11 、0x22 、0x33 、0xBB

3、收到5个数据后,串口接收中断触发

4、在接收回调函数中判断第一个数据和最后一个数据是否正确;

5、正确的话就用中断的方式把事先准备好的数据发给PC(本例程是准备6个数据);

6、把前面接收的数据清空,等待下一次接收(当然,接收的数据你想怎么处理就怎么处理)

7、在中断回调函数中,把接收中断重新使能,因为中断执行的过程中把中断使能关闭了。

中断代码

//将要发送的数据
extern uint8_t Tx_Buffer[6];

//接收的数据存放位置
extern uint8_t Rx_Buffer[5];
/**
  * @brief This function handles USART1 global interrupt.
  */
void USART1_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart1);
}


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if(huart->Instance == USART1)
  {
    //只要串口接收中断产生了让灯改变一下亮灭的状态
    HAL_GPIO_TogglePin(GPIOA, LED0_Pin);
    
    //判断接收到的数据是否正确,本例程只判断首尾的数据
    if((Rx_Buffer[0]==0xAA)&&(Rx_Buffer[4]==0xBB))
    {
      //收到的数据正确,就把事先准备好的数据发出去
      HAL_UART_Transmit_IT(&huart1, Tx_Buffer, 5);
    }
    
    //把收到的数据清空,准备下一次接收
    for(uint8_t i=0; i<5;i++)
    {
      Rx_Buffer[i] = 0;
    }
  }
  
  //因为中断函数执行完之后,就把中断关闭了,需要重新开启中断
  HAL_UART_Receive_IT(&huart1, Rx_Buffer, 5);
}

main文件代码

#include "main.h"
#include "usart.h"
#include "gpio.h"

//将要发送的数据
uint8_t Tx_Buffer[6] = {0x5A, 0x01,0x02,0x03,0xA5};

//接收的数据存放位置
uint8_t Rx_Buffer[5] = {0};

void SystemClock_Config(void);

int main(void)
{

  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  MX_GPIO_Init();
  MX_USART1_UART_Init();
  
  //使能接收中断
  HAL_UART_Receive_IT(&huart1, Rx_Buffer, 5);

  while (1)
  { 
    //什么都不做
  }
}

中断跟捕猎有点像

        你设置好陷阱,等待猎物的到来,没有猎物的时候,陷阱是不会被触发的;当陷阱被触发之后,你就可以去把里面的猎物取出来了,猎物怎么处理是你的事,是放大自然,还是大孜然;当然了,此时你的陷阱已经被破坏了,如果你还要捕猎,那就把你的陷阱重新弄好。

        这种HAL库里面弄好的中断收发函数有个不好的地方,主要在串口接收,你要收到设定数量的数据才开始触发中断,比如设置收到5个数据才执行中断,第一次PC先给单片机发送4个数据,跟设定的5个数据相比,没达到触发中断的条件,那就继续等着。第二次PC接着又发送3个数据,这时候问题出现了,单片机怎么处理,当然是在第二次的数据还没发送完,只发送一个的时候,这时触发条件成熟了(达到5个数据),单片机开始中断,去处理数据。如果PC的两次发送时间间隔很久怎么办,凉拌,什么都不办了。这肯定是不行的。就像你的陷阱是想逮住5只猎物,但是只逮住了4只,然后再也没有猎物来,你就永远不能去取你的猎物,或者后面又来了3只,一共7只了,你拿走5只,还留两只等下次凑数,那这个猎人脑子肯定是有问题。

        解决这个问题的办法也是有,猎物逮一个收一个,就是来回跑有点累。代码演示一下。

1、每次接收到一个数据就中断;数据存在Rx_Data;

2、中断回调函数里面,把Rx_Data的数据转存到Rx_Buffer数组;

3、一共收到5个数据之后,就把收到的数据发出去,数据个数计数也清零,重新开始。

//串口收到的数据给Rx_Data
extern uint8_t Rx_Data;

//串口接收数据缓存,Rx_Data就是个二道贩子,最终数据还是放在Rx_Buffer
extern uint8_t Rx_Buffer[5];

//接收数据计数
uint8_t Rx_Count = 0;
/**
  * @brief This function handles USART1 global interrupt.
  */
void USART1_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart1);
}


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

  if(huart->Instance == USART1)
  {
    //只要串口接收中断产生了让灯改变一下亮灭的状态
    HAL_GPIO_TogglePin(GPIOA, LED0_Pin);
    
    //把串口收到的数据转存在Rx_Buffer里
    Rx_Buffer[Rx_Count++] = Rx_Data;
 
    //把收到的数据清空,准备下一次接收
    Rx_Data = 0;
    
    //判断是不是收到了5个数据
    if(Rx_Count ==5 )
    {
      //收到了5个数据,就把收到的数据发出去
      HAL_UART_Transmit_IT(&huart1, Rx_Buffer, 5);
      
      //收到5个数据之后,再重新计数
      Rx_Count = 0;
    }
  }
  
  //因为中断函数执行完之后,就把中断关闭了,需要重新开启中断
  HAL_UART_Receive_IT(&huart1, &Rx_Data, 1);
}

        上面每次收一个数据就中断的情况,在数据少的时候用用还可以,在大项目里面,数据多的话,最好还是别用,不然单片机就一直在中断了,不要干别的事情了。就好比你在干几个亿的项目,隔几秒钟就有人来汇报一下,你是什么心态。

        那肯定有解决方案的,为了解决大量的数据传送,不要想着轮询的方式了,轮询是最傻瓜的工作方式,在控制上想都别想,问题太多,简单项目用用还可以,比如打印信息。那可不可以等数据都发送完了,通讯线空下来的时候给我个中断,通知我来处理数据。就像你在跟客户讨论需求的时候,你不会客户提一个需求你就去干,再接等客户提下一个需求,再继续干,那人就废了,让客户一口气把需求提完,等客户安静下来,我再来处理那一堆的需求。STM32单片机就可以这样。


//huart:那个串口收数据
//pData:收到的数据存在哪里
//Size:收多少个数据
HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

测试例程

1、PC给单片机发送10个数据,随便哪10个;

2、单片机通过空闲中断的方式接收;

3、接收到之后把数据拷贝出来;

4、把数据通过中断发出去

//将要发送的数据
extern uint8_t Tx_Buffer[6];

//接收的数据存放位置
extern uint8_t Rx_Buffer[20];

uint8_t RX_BUFFER[20];
/**
  * @brief This function handles USART1 global interrupt.
  */
void USART1_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart1);
}

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
  //if((huart->Instance == USART1)&&(Size==10))
  if(huart->Instance == USART1)
  {
    //只要串口接收中断产生了让灯改变一下亮灭的状态
    HAL_GPIO_TogglePin(GPIOA, LED0_Pin);
    
    //把串口收到的数据转到RX_BUFFER里
    memcpy(RX_BUFFER,Rx_Buffer,sizeof(Rx_Buffer) );
    //收到的数据正确,就把事先准备好的数据发出去
    HAL_UART_Transmit_IT(&huart1, RX_BUFFER, 10);

    
    //把收到的数据清空,准备下一次接收
    for(uint8_t i=0; i<20;i++)
    {
      Rx_Buffer[i] = 0;
    }
  }
  
  //因为中断函数执行完之后,就把中断关闭了,需要重新开启中断
  HAL_UARTEx_ReceiveToIdle_IT(&huart1, Rx_Buffer, 10);
}

还有DMA收发数据,放在DMA专题那边说。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32学习----RS232串口通讯 的相关文章

  • 24分+的医药顶刊带你学习表观组学解析超级热点“肿瘤耐药”的机制

    对癌症患者采用治疗干预时获得性耐药是转移性癌症复发的主要原因 此前 获得性耐药发展的研究主要集中在识别耐药肿瘤中常见的基因突变 越来越多的证据表明 在永久性获得性耐药出现之前 癌症中存在一种表观遗传调控的可逆耐药状态 这种可逆状态可能会导致
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • 小学二三年级入门信奥赛,如何从Scratch进入C++的学习

    小学生几年级适宜开始学习C 这是讨论的比较热烈 也是比较热门的话题 小学生适宜几年级开始学C 小学生适宜几年级开始学C CSDN博客 simple happiness 信息学规划 北京二年级学生图形化过二级想往信奥靠拢如何准备 信息学规划
  • 学习STM32正点原子好吗?

    今日话题 学习STM32正点原子好吗 正点原子的教程内容简单明了 代码也清晰直接 使初学者能够轻松理解其功能和使用方法 尤其对于需要快速完成大学作业等任务的大学生来说 可以直接借鉴并稍作修改 便可满足需求 正点原子提供的资料通俗易懂 适合用
  • 【OpenCV学习笔记02】- 图像入门

    内容 这里介绍了图像处理的入门操作 你将学习如何读取图像 如何显示图像以及如何将其保存回去 你将学习以下功能 cv imread cv imshow cv imwrite 简单使用OpenCV 读取图像 使用 cv imread 函数读取图
  • The Planets:Venus

    靶场下载 The Planets Venus VulnHub 信息收集 arp scan l Interface eth0 type EN10MB MAC 00 0c 29 43 7c b1 IPv4 192 168 1 60 Starti
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • 【CTF必看】从零开始的CTF学习路线(超详细),让你从小白进阶成大神!

    最近很多朋友在后台私信我 问应该怎么入门CTF 个人认为入门CTF之前大家应该先了解到底 什么是CTF 而你 学CTF的目的又到底是什么 其次便是最好具备相应的编程能力 若是完全不具备这些能力极有可能直接被劝退 毕竟比赛的时候动不动写个脚本
  • 【计算机毕业设计】精品课程在线学习系统

    如今社会上各行各业 都喜欢用自己行业的专属软件工作 互联网发展到这个时候 人们已经发现离不开了互联网 新技术的产生 往往能解决一些老技术的弊端问题 因为传统精品课程学习信息管理难度大 容错率低 管理人员处理数据费工费时 所以专门为解决这个难
  • 2024年金三银四网络安全考试试题

    2023年金三银四网络安全考试试题 1 关于数据使用说法错误的是 A 在知识分享 案例中如涉及客户网络数据 应取敏感化 不得直接使用 B 在公开场合 公共媒体等谈论 传播或发布客户网络中的数据 需获得客户书面授权或取敏感化 公开渠道获得的除
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • 为什么这么多人自学黑客,但没过多久就放弃了(掌握正确的网络安全学习路线很重要)

    网络安全是一个 不断发展和演变 的领域 以下是一个 网络安全学习路线规划 旨在帮助初学者快速入门和提高自己的技能 基础知识 网络安全的 基础知识 包括 网络结构 操作系统 编程语言 等方面的知识 学习这些基础知识对理解网络安全的原理和技术至
  • 【js学习之路】遍历数组api之 `filter `和 `map`的区别

    一 前言 数组是我们在项目中经常使用的数据类型 今天我们主要简述作用于遍历数组的api filter 和 map 的区别 二 filter和map的共同点 首先 我们主要阐述一下 filter 和 map 的共同点 api的参数都是回调函数
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • GCC 变量映射和 MISRA-C

    我主要知道两种使用 GCC 声明内存映射寄存器的方法 有许多变体 使用双字段 每个外设的数据结构等 要么使用初始化为正确地址的指针 例如volatile uint32 t pMyRegister uint32 t 0xDEADBEEFUL
  • STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟

    我在用STM32F407VGT6 with CubeMX 因此 我从通用定时器开始 但我被预分频值和周期值所困扰 基本上我想每隔一段时间生成一个定时器中断n 其中 n 1 2 3 ms 并执行一些任务 计算周期和预分频值的公式有很多变化 公

随机推荐

  • RFID智能汽车制造管理系统解决方案

    RFID智能汽车制造管理系统解决方案 1 项目背景 1 1 行业背景 在汽车行业快速发展竞争日益激励的背景下 各个汽车制造商都在追求管理系统的优化 已从开始的只追求最终结果的最优 发展到目前要求使制造汽车的每个环节都达到最优的目的 这就给管
  • 图像处理之卷积模式及C++实现

    1 卷积的三种模式 深度学习框架中通常会实现三种不同的卷积模式 分别是 SAME VALID FULL 这三种模式的核心区别在于卷积核进行卷积操作的移动区域不同 进而导致输出的尺寸不同 我们以一个例子来看这三种模式的区别 输入图片的尺寸是5
  • 服务器iis如何开启tlsv1.2协议,利用IIS Crypto V3.2开启IIS服务器TLS1.2的具体操作流程...

    今天客户给我反馈了一个在网站安装SSL证书后 网站https显示异常的问题 就是在谷歌浏览器下 会提示 您的连接存在安全隐患 访问被阻止 如下 如果继续强制浏览 会提示 你与此网站之间建立的连接并非完全安全 攻击者可能能够看到您正在此网站上
  • Command Prompt 常用命令

    一 CD Change Directory 改变现在指向的文件夹 1 去到最根的目录 cd 例如去到C盘 2 去某一文件夹 例如去C盘的logs文件夹 cd windows logs 3 返回上一级文件夹 cd 二 指向去另一个盘 指向另一
  • 解决PCCAD出现的致命错误Unhandled Access Violation ....

    最近公司电脑貌似很多的员工在打开pccad里面的TK的时候出现如下的界面 于是就开始认为是office的问题 在卸载了office之后 问题是解决了 不过总不能不叫员工使用office软件吧 于是乎不得不又装上了office 但是不是off
  • AD20-DRC检查

    点击下图中的红圈内选项 就会出现 第一个红圈可不勾选 可以不创建报告文件 第二个红圈中的填的稍微大一点 接下来就是 红圈中是安全间距检查 勾选可以检查板子中的安全间距 之后点击左下角的运行DRC 就行了 板子中有错误的话就会报错 有错改错就
  • adopt_lock 和 defer_lock 的区别

    c 中 lock guard 通过 raii 机制实现了自动上锁和解锁互斥量 基本用法为 static std mutex io mutex std lock guard
  • IDEA如何添加多Git源

    一 添加多Git源 选择IDEA顶部VCS菜单 再选择Git 点击Remotes 然后弹窗中点击 号添加 再弹窗中输入名字和git的地址 最后点击OK 另外一个Git源就加进来了 二 如何添加新的Git源的远程分支 选择IDEA顶部VCS菜
  • java搜索文本内容_JAVA 搜索文本文件中的关键字

    原文链接 http blog net blog abel article details 40858245 用JAVA实现对文本文件中的关键字进行搜索 依据每一行 得到每一行中出现关键词的个数 使用java io LineNumberRea
  • 如何理解js中基本数据类型的值不可变

    js的数据类型 在讲解我们要说明的问题之前 需要知道js有哪些数据类型 js有两种数据类型 基本数据类型和引用数据类型 基本数据类型 number string boolean undefined null symbol 在 Java 中
  • 入门学习-Python-小甲鱼学习资料-Day010-列表:一个打了激素的数组1

    标题 根据视频自己练习 Append 和 extend Appen 添加单个元素 extend添加多个元素 但是要以数组形式 Insert 插入元素的时候可以定义插入的位置 注意 是从0开始计数 从0开始才是python的默认 标题 课后练
  • java简单五子棋源代码

    package com renyou import java awt Color import java awt Dimension import java awt FlowLayout import java awt Graphics i
  • 与ln的指数转化公式_指数函数与对数函数的转换

    有时对数运算比指数运算来得方便 因此以指数形式出现的式子 可利用取对数的方法 把指数运算转化为对数运算 用高等数学计算的老旧的纹理古文纸 解题技巧 转化的思想是一个重要的数学思想 对数式与指数式有着密切的关系 在解决有关问题时 经常进行着两
  • Hive 调优总结

    1 通常 可以通过设置属性hive map aggr值为true来提高聚合的性能 hive map aggr true 这个设置会触发在map阶段的 顶级 聚合过程 非顶级的聚合过程将会在执行一个GROUP BY后进行 不过这个设置将需要更
  • Mybatis-Plus(一)

    Mybatis Plus 一 最近在项目当中学习到了一种新的构建sql查询的技术 mybatis plus 相交与之前使用的example即先创建一个example对象 再根据这个对象创建一个criteria对象来说 这种方式更为简洁方便
  • HTTP基本概念

    文章目录 一 概念 二 请求消息数据格式 一 概念 Hyper Text Transfer Protocol 超文本传输协议 传输协议 定义了 客户端和服务器端通信时 发送数据的格式 特点 基于TCP IP的高级协议 默认端口号 80 基于
  • 2023面试题记录

    1 js怎么判断对象为空 判断对象是否为空的一个简单方法是检查对象的所有可枚举属性 如果一个对象没有可枚举属性 那么我们可以认为它是空的 你可以使用 Object keys 函数来获取对象的所有可枚举属性 然后检查得到的数组的长度 如果长度
  • C++socket编程(三):3.4 listen监听

    1 在端口成功绑定了之后 我们并没有开始真正接收用户的连接信息 2 所以我们应该用到listen函数开始进行监听 收到信息才看是接收数据 linux中我们可以用如下命令进行连接测试 telnet ip 端口号 那么我的linux中命令就是
  • C语言预处理详解

    目录 一 预定义符号 二 define 1 define 定义标识符 2 define定义宏 3 define的替换规则 4 和 lt 4 1 gt 的使用 lt 4 2 gt 的作用 5 带副作用的宏参数 6 宏和函数的对比 7 命名约定
  • STM32学习----RS232串口通讯

    一 RS232相关概念 RS Recommend Standard 推荐标准 232 标识号 第232号 时间 1962年 地点 美国 人物 美国电子工业协会 Electronic Industries Association 美国 电子工