STM32—串口通讯详解

2023-05-16

串口通讯目录

    • 物理层
    • 协议层
    • USART简介
    • 开发板与上位机的连接
    • 代码讲解:
        • 一.初始化结构体
        • 二.NVIC配置中断优先级
        • 三.USART配置函数讲解
        • 四.传输数据的函数:
            • 1.发送一个字节
            • 2.发送字符串
            • 3.重定向printf函数发送字符串
            • 4.重定向getchar函数接收字符
            • 5.通过中断接收
        • 结语

串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,其通讯协议可分层为协议层和物理层。物理层规定通信协议中具有机械、电子功能的特性,从而确保原始数据在物理媒体的传播;协议层主要规定通讯逻辑,统一双方的数据打包、解包标准。通俗的讲物理层规定我们用嘴巴还是肢体交流,协议层规定我们用中文还是英文交流。下面分析一下串口通讯协议的物理层和协议层。

物理层

1.通讯结构
串口通讯的物理层的主要标准是RS-232标准,其规定了信号的用途、通讯接口及信号的电平标准,其通讯结构如下:
在这里插入图片描述
在设备内部信号是以TTL电平标准传输的,设备之间是通过RS-232电平标准传输的,而且TTL电平需要经过电平转换芯片才能转化为RS-232电平,RS-232电平转TTL电平也是如此。
2.电平标准
根据使用的电平标准不同,串口通讯可分为 RS-232标准 TTL标准,具体标准如下:
在这里插入图片描述
在电子电路中常使用TTL的电平标准,但其抗干扰能力较弱,为了增加串口的通讯距离及抗干扰能力,使用RS-232电平标准在设备之间传输信息,经常使用MA3232芯片对TTL电平及RS-232电平进行相互转换。

协议层

1.数据包
串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备得RXD接口,在协议层中规定了数据包的内容,具体包括起始位、主体数据(8位或9位)、校验位以及停止位,通讯的双方必须将数据包的格式约定一致才能正常收发数据。
在这里插入图片描述

2.波特率
由于异步通信中没有时钟信号,所以接收双方要约定好波特率,即每秒传输的码元个数,以便对信号进行解码,常见的波特率有4800、9600、115200等。STM32中波特率的设置通过串口初始化结构体来实现。
3.起始和停止信号
数据包的首尾分别是起始位和停止位,数据包的起始信号由一个逻辑0的数据位表示,停止位信号可由0.5、1、1.5、2个逻辑1的数据位表示,双方需约定一致。STM32中起始和停止信号的设置也是通过串口初始化结构体来实现。
4.有效数据
有效数据规定了主题数据的长度,一般为8或9位,其在STM32中也是通过串口初始化结构体来实现的。
5.数据校验
在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)、 0 校验(space)、 1 校验(mark)以及无(noparity)。这些也都可以在串口初始化结构体中实现的。

USART简介

USART(通用同步异步收发器)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个UART,它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。USART 在 STM32 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一USART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错哪具体哪里出错等等。
STM32中一共有5个USART,如示:
在这里插入图片描述
USART的USB转串口原理图如下:
在这里插入图片描述
USART1的发送和接收端口是事先连接好的,如果要使用其他USART只需要将相应的发送接收端口按图连接好即可。
USART有多个中断请求事件:
在这里插入图片描述

开发板与上位机的连接

开发板与上位机之间通过USB线连接,所以在上位机上要配置一个USB转串口 的驱动,以便把USB传输过来的电平转换为TTL电平,TTL电平才能与串口调试助手建立联系。一般使用CH341驱动作为win10下的USB转串口,驱动安装成功的情况下接入USB会在计算机的设备管理器的端口中发现串口:
在这里插入图片描述
(win7系统一般选择CH340作为USB转串口驱动。)

代码讲解:

固件库编程的一大好处就是我们可以根据固件库函数来学习外设的相关知识,而且固件库函数的编写都是建立在对底层寄存器操作上的,所以通过讲解代码可以更好理解串口通讯相关知识。

一.初始化结构体

typedef struct {
 uint32_t USART_BaudRate; // 波特率
 uint16_t USART_WordLength; // 字长
 uint16_t USART_StopBits; // 停止位
 uint16_t USART_Parity; // 校验位
 uint16_t USART_Mode; // USART 模式
 uint16_t USART_HardwareFlowControl; // 硬件流控制
 } USART_InitTypeDef;

USART初始化结构体中的相应变量都对应着数据包中的相对内容。

二.NVIC配置中断优先级

我们在串口接收信息时采用了触发中断事件,所以要配置一下串口中断的优先级:

NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* 嵌套向量中断控制器组选择 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /* 配置USART为中断源 */
  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  /* 抢断优先级*/
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /* 子优先级 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /* 使能中断 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  /* 初始化配置NVIC */
  NVIC_Init(&NVIC_InitStructure);
}

中断相关的知识之前详细讲过,此处就不再累赘讲述。
中断知识链接

三.USART配置函数讲解

USART配置函数的主要作用是打开串口与相应的GPIO引脚,配置好相应串口信息与GPIO引脚的工作模式,以便信息的传输与接收。

void DEBUG_USART_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	
	/* 第一步:初始化GPIO */
		// 打开串口GPIO的时钟
	DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
		// 将USART Tx的GPIO配置为推挽复用模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);	
	
	/* 第二步:配置串口的初始化结构体 */
		// 打开串口外设的时钟
	DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
	// 配置串口的工作参数
	// 配置波特率
	USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
	// 配置 针数据字长
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	// 配置停止位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	// 配置校验位
	USART_InitStructure.USART_Parity = USART_Parity_No ;
	// 配置硬件流控制
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	// 配置工作模式,收发一起
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	// 完成串口的初始化配置
	USART_Init(DEBUG_USARTx, &USART_InitStructure);

/*--------------------------------------------------------*/
	// 串口中断优先级配置
	NVIC_Configuration();
	
	// 使能串口接收中断
	USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);
/*--------------------------------------------------------*/
	
	/* 第三步:使能串口 */	
		// 使能串口
	USART_Cmd(DEBUG_USARTx, ENABLE);	
}

第一步:打开了GPIO的时钟,设置发送和接收引脚的信息,将Tx(发送引脚)配置为推挽复用模式用来发送数据,Rx(接收引脚)配置为浮空输入模式用来接收数据。
第二步:首先打开USART1 的时钟,根据USART初始化结构体成员配置相关的信息,之后利用初始化函数将初始化结构体中的信息写入相应寄存器中,然后的话就是引用NVIC_Configuration()函数配置串口中断优先级,打开相应的串口接收中断,中断接收函数的参数如下:
在这里插入图片描述
第三步 :最后相当于打开总电源——使能串口

USART配置函数完成后代表,USART1 的接收和发送准备工作已经准备就绪,接下来就是,串口与上位机之间的信息传递了,信息的发送和接收都有相对于的函数。

四.传输数据的函数:

开发板与上位机之间的数据传输可以有多种方法,下面一一介绍:

1.发送一个字节

USART_SendData(pUSARTx,ch); 函数为基础建立的函数可以向上位机发送一个字节的数据,利用FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG) 读取发送数据寄存器的状态来 等待发送寄存器将数据成功发送。

void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
	/* 发送一个字节数据到USART */
	USART_SendData(pUSARTx,ch);
		
	/* 等待发送数据寄存器为空 */
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
}
2.发送字符串

本质是利用上面的字节发送函数逐位发送字符串中的内容

void USART_SendString(USART_TypeDef * pUSARTx, char *str)
{
	unsigned int   k=0;
	while(*(str+k)!='\0')
	{
		USART_SendData(pUSARTx, *(str+k));
		/* 等待发送数据寄存器为空 */
		while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
		k++;
	}
	while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET);   /* TC:传输完成标志 */
}
3.重定向printf函数发送字符串

关于重定向的知识之前总结过,链接:重定向知识。重定向后的printf()函数功能强大,具有向串口调试助手打印数据的功能,使用方法和c语言时一样,比如printf("欢迎来到小全全的串口实验\n");就可以将“欢迎来到小全全的串口实验”这句话发送到上位机中,而且换行符“\n”还具有换行作用。

/* 重定向printf函数 */
int fputc(int ch, FILE *f)
{
	USART_SendData( DEBUG_USARTx,  (uint8_t) ch);
	/* 等待发送完毕 */
	while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET); 
	return ch;
}
4.重定向getchar函数接收字符

具体操作与重定向后的printf函数类似,比如可以通过如下代码向上位机发送已经接收到的数据

x=getchar();
printf("接收到的字符是:%c\n",x);

重定义如下:

///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
		/* 等待串口输入数据 */
		while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);

		return (int)USART_ReceiveData(DEBUG_USARTx);
}

在使用此函数作为接收数据时记得关闭串口得接收中断!!!

5.通过中断接收

stm32f10x_it.c中编写USART1中断源相对应得中断函数,利用了固件库函数中的
USART_ReceiveData(DEBUG_USARTx);接收函数
USART_SendData(DEBUG_USARTx, x);发送函数
USART_GetITStatus(DEBUG_USARTx, USART_IT_RXNE);判断标志位函数

/* #define  DEBUG_USART_IRQn         USART1_IRQn 
   #define  DEBUG_USART_IRQHandler   USART1_IRQHandler */
void DEBUG_USART_IRQHandler(void)
{
	uint16_t  x;
	/* 判断是否收到中断信号 */
	if(USART_GetITStatus(DEBUG_USARTx, USART_IT_RXNE) == SET)
	{
		x = USART_ReceiveData(DEBUG_USARTx);
		USART_SendData(DEBUG_USARTx, x);
	}

}

结语

以固件库函数编程的思路讲解,未能顾及到众多寄存器的讲解,我认为进行固件库编程本身就是学习操作寄存器的过程,很多时候我们不需要知道如何操作寄存器,只要了解如何操作固件库函数即可。(吹爆固件库编程)

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

STM32—串口通讯详解 的相关文章

  • 在没有 IDE 的情况下如何使用 CMSIS?

    我正在使用 STM32F103C8T6 并想使用 CMSIS 这本质上只是寄存器定义 没有代码 让我的生活更轻松 同时仍保持在较低水平 问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用 所有文档似乎都与特定于供应商的 I
  • GCC - 如何停止链接 malloc?

    我正在努力将我的代码缩减到最小的骨架大小 我使用的是只有 32k 闪存的 STM32F0 需要很大一部分闪存用于数据存储 我的代码已经有大约 20k 闪存大小 其中一些是由于使用了 STM32 HAL 函数 我可以在以后需要时对其进行解释和
  • STM32 F072上的软件如何跳转到bootloader(DFU模式)?

    STM32应用笔记2606对此进行了讨论 但没有简单的代码示例 该答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行了测试 这个答案使用 STM32标准外设库 仅此而已 请注意 验证您是否成功进入引导加载程序模式
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • STM32 GPIO工作原理详解

    STM32 GPIO介绍 1 STM32引脚说明 GPIO是通用输入 输出端口的简称 是STM32可控制的引脚 GPIO的引脚与外部硬件设备连接 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 以STM32F103ZET6芯片为例
  • [屏驱相关]【SWM166-SPI-Y1.28C1测评】+ 有点惊艳的开箱

    耳闻华芯微特许久了 看到论坛得评测活动赶紧上了末班车 毕竟对有屏幕得板子也是很喜欢得 京东快递小哥客客气气 微笑着把快递给了我 好评 直接拆了包 在此之前没看过视频号 所以这个圆盘盘得模具还是有点惊喜的 正面照如下 开机有灯光秀 还有动画
  • [MM32硬件]搭建灵动微MM32G0001A6T的简易开发环境

    作为学习单片机的经典 自然是通过GPIO点亮LED 或者是响应按钮的外部中断例程 这我们看看SOP8封装的芯片MM32G0001A6T得引脚 除了VDD和GND固定外 我们可以使用PA14 PA1 PA13 PA15 PA2 PA3这六个G
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

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

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一

随机推荐

  • java 通过onvif抓取海康摄像头图片

    java 通过onvif抓取海康摄像头图片 文章目录 java 通过onvif抓取海康摄像头图片前言一 把onvif jar放到自己的maven仓库二 pom文件引入jar包三 测试代码四 运行中的变量五 参考链接地址 前言 网上也有类似的
  • java常见面试题(二)

    java基础二 11 抽象类必须要有抽象方法吗 xff1f 不需要 xff0c 抽象类不一定非要有抽象方法 示例代码 xff1a abstract class Cat public static void sayHi System out
  • 2022高教社杯全国大学生数学建模竞赛B题解析(更新完结)

    2022高教社杯全国大学生数学建模竞赛B题解析 xff08 更新完结 xff09 题目解析前言问题一1 11 21 3问题二 题目 B 题 无人机遂行编队飞行中的纯方位无源定位 无人机集群在遂行编队飞行时 xff0c 为避免外界干扰 xff
  • c++的引用和指针原来是这种关系

    c 43 43 的引用和指针原来是这种关系 关于引用引用的概念 xff1a 引用的三种情况 xff1a 当引用作为返回值的时候 xff1a 引用和指针的区别 xff1a 关于引用 引用的概念 xff1a 引用不是新定义一个变量 xff0c
  • java面试题汇总一(会持续更新)

    不积跬步无以至千里 xff0c 这里会不断收集和更新Java基础相关的面试题 xff0c 目前已收集100题 1 什么是B S架构 xff1f 什么是C S架构 B S Browser Server xff0c 浏览器 服务器程序 C S
  • 【STM32】创建stm32工程中,各个文件夹及部分文件作用

    USER xff1a 存放工程文件 主函数文件 main c 以及其他包括system stm32f10x c等 CORE xff1a 用来存放核心文件和启动文件 OBJ xff1a 是用来存放编译过程文件以及hex 文件 STM32F10
  • Qt4.8类继承关系图(全网最全)

    一 概述 在学习Qt的时候快速的查询了解类的继承关系对我们的学习会有很大的帮助 xff0c 而网上流传的多是较老版本的 xff0c 并且是jpg格式 xff0c 不便于学习使用 xff0c 所以我就花了一些时间整理了这一套Qt类继承图 xf
  • Qt5.9类继承关系图(全网最全)

    一 概述 在学习Qt的时候快速的查询了解类的继承关系对我们的学习会有很大的帮助 xff0c 而网上流传的多是较老版本的 xff0c 并且是jpg格式 xff0c 不便于学习使用 xff0c 所以我就花了一些时间整理了这一套Qt类继承图 xf
  • Qt5.15类继承关系图(全网最全)

    一 概述 在学习Qt的时候快速的查询了解类的继承关系对我们的学习会有很大的帮助 xff0c 而网上流传的多是较老版本的 xff0c 并且是jpg格式 xff0c 不便于学习使用 xff0c 所以我就花了一些时间整理了这一套Qt类继承图 xf
  • Qt6.3类继承关系图(全网最全)

    一 概述 在学习Qt的时候快速的查询了解类的继承关系对我们的学习会有很大的帮助 xff0c 而网上流传的多是较老版本的 xff0c 并且是jpg格式 xff0c 不便于学习使用 xff0c 所以我就花了一些时间整理了这一套Qt类继承图 xf
  • DSPF28335 SCI FIFO串口通讯

    在工作过程中 xff0c 通过串口进行上位机与控制器之间进行数据的传输 xff0c 标准的串口通讯容易造成数据的丢失和内存堆满的现象 xff0c 便使用SCI中的FIFO对数据进行中断处理 一 串口通信基本知识 F28335 处理器共有 3
  • 树莓派4B:控制步进电机

    记录一下驱动两相四线步进电机的过程 文章目录 准备阶段接线阶段树莓派python程序 准备阶段 准备以下物品 xff0c 淘宝都可以买到 57步进电机 xff08 两相四线 xff09 电源开关 xff08 220v转24v xff0c 3
  • 2019全国大学生电子设计竞赛(电赛)回忆录

    我给大家整理了历年电赛的题目和材料清单 xff0c 大家可以对比着看 关注微信公众号 Opencv视觉实践 xff0c 回复 电赛资料 领取 电赛是我一进大学就听学长们无数此提起的一场四天三夜的盛会 xff0c 我也自大一开始便期待着 xf
  • 【网络】HTTP中的GET方法和POST方法

    1 GET方法 xff1a 获取资源 GET方法用来请求访问已被URL识别的资源 指定的资源经服务器端接续后返回内容 也就是说 xff0c 如果请求的资源是文本 xff0c 那就保持原样返回 xff1b 如果像是CGI xff08 Conm
  • 类的6个默认成员函数

    类的成员函数 1 构造函数2 析构函数3 拷贝构造函数4 深浅拷贝5 运算符重载赋值运算符重载的特性 xff1a 1 构造函数 xff08 构造函数的调用发生在对象的创建过程中 xff0c 所以会牵扯到this指针传对象的地址问题 另外创建
  • 通过onvif抓取海康摄像头图片,以及解决海康摄像头抓取图片需要验证问题,实现摄像头一段时间换一个地方的同时抓取一张图片。

    1 实现海康摄像头的图片的抓取 思路 xff1a 1 首先获取图片的url xff0c 2通过java实现图片的下载 1 使用onvif获取图片的url 首先获取OnvifDevice的对象 OnvifDevice od 61 new On
  • 超详细电烙铁如何使用?

    电烙铁是电子硬件工程师的一个必备工具了 它主要用来焊接一些电子元器件到PCB主板上 xff0c 用来做一些维修 xff0c 验证 xff0c 分析等等 那这么一个家伙要如何使用呢 xff1f 首先来看一个电烙铁的基本外观 xff1a 它一般
  • Makefile和cmake学习

    一 Makefile 一 什么是Makefile 1 Makefile 可以简单的认为是一个工程文件的编译规则 xff0c 描述了整个工程的编译和链接等规则 其中包含了那些文件需要编译 xff0c 那些文件不需要编译 xff0c 那些文件需
  • Ros下编译某功能包时出现很多“未定义的引用”的解决方法(本人版本是ubuntu18.04)

    问题描述 xff1a 在工作空间下编译某功能包时出现 在函数 中未被定义等问题 xff0c 如图所示 解决方案 xff1a 第一步 xff1a 查看自己的gcc版本和g 43 43 版本是否一致 xff0c 打开终端输入以下命令 gcc v
  • STM32—串口通讯详解

    串口通讯目录 物理层协议层USART简介开发板与上位机的连接代码讲解 xff1a 一 初始化结构体二 NVIC配置中断优先级三 USART配置函数讲解四 传输数据的函数 xff1a 1 发送一个字节2 发送字符串3 重定向printf函数发