STM32CubeIDE基础学习-USART串口通信实验(轮询方式)

news2024/9/23 19:27:47

STM32CubeIDE基础学习-USART串口通信实验(轮询方式)


文章目录

  • STM32CubeIDE基础学习-USART串口通信实验(轮询方式)
  • 前言
  • 第1章 硬件介绍
  • 第2章 工程配置
    • 2.1 工程外设配置部分
    • 2.2 生成工程代码部分
  • 第3章 代码编写
    • 3.1 串口发送
      • 3.1.1 发送字符串
      • 3.1.2 sizeof使用
      • 3.1.3 发送十进制数值
      • 3.1.4 发送十六进制数值
    • 3.2 串口接收
  • 第4章 串口函数超时时间参数说明
  • 第5章 添加printf函数支持
    • 5.1 串口重定向
    • 5.2 打印中文
    • 5.3 打印十进制数值
    • 5.4 打印浮点数
  • 第6章 ASCII对照表
  • 第7章 实验现象
  • 总结


前言

在单片机开发时,常常需要进行数据交互,那么可以通过有线或无线的方式进行通信。

有线的常见就是UART串口、RS232、RS485、CAN等。
无线的常见就是无线通信模块了,比如WIFI模块、蓝牙模块、2.4G等。

借助它们就可以实现两个设备之间数据互相交互通信了。

常用的就是串口了,它可以接电脑实现单片机和电脑进行数据通信,在单片机编程时,通常需要借助电脑串口调试查看程序输出情况,进而知道程序的执行过程。

本章将简单使用单片机USART串口和电脑串口调试助手软件实现数据交互通信。
USART:Universal synchronous asynchronous receiver transmitter即通用同步/异步收发器


第1章 硬件介绍

本实验使用的开发板主控芯片是STM32F103C8T6,其核心原理图如下:

在这里插入图片描述

时钟来源使用的是外部高速8M晶振作为高速时钟。

开发板的TTL串口电路比较简单,采用CH340C的串口芯片。该芯片的串口接到了主芯片的串口1上,即PA9、PA10引脚。注意它们的连接关系是需要交叉接的,不然直连是无法正常串口通信的。

在这里插入图片描述

第2章 工程配置

本实验直接采用按键实验的工程作为基础模板,直接拷贝粘贴即可,然后在上面添加串口相关功能配置即可,其它不用修改,就不用再新建工程了。

2.1 工程外设配置部分

第一步:前面的LED、BEEP、KEY、RCC和SWD的相关配置都不用修改,保持默认的配置即可。

第二步:配置串口引脚功能。
按照下图标号步骤进行设置就可以。

在这里插入图片描述

④处的模式选择异步通信,⑥处的参数都可以保持这样默认的参数设置就行,当然,也可以根据自己的需要选择其它的参数,主要后面使用时按照这个配置来选择即可。

第三步:完成后可以看到芯片右边多了个USART1的引脚定义,如下图所示:

在这里插入图片描述

到此,串口轮询功能的配置就完成了,只添加这里串口的配置,其它的都不用修改。

2.2 生成工程代码部分

外设功能配置完成后,点击生成代码按钮就可以生成工程代码了,如下图所示:

在这里插入图片描述

可以看到工程在原有的基础上多了usart.c的文件,里面主要存放了串口的相关代码。

main文件里面多了一个串口初始化函数,如下图所示:

在这里插入图片描述

跳进去该函数之后可以看到串口设置的相关参数如下图所示:

在这里插入图片描述

对比参数配置和CubeMX的配置,如下图所示:

在这里插入图片描述

对比可以看到参数都是一一对应的,说明代码设置是正常的。

注意:这里的Data Direction需要选择接收和发送才行,即支持双向通信传输功能,不然仅选择单方向传输的话,是无法进行双方互相通信的。该发送和接收引脚的代码定义如下图所示:

在这里插入图片描述

到此,检查这些基础初始化代码没有问题之后就可以在工程上添加串口的相关工能代码了。

第3章 代码编写

串口使用轮询的方式传输数据的程序是非常的简单的,一个函数就可以完成了,具体使用的函数介绍如下:
串口发送函数原型:
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
这个是串口轮询发送函数,其中第一个参数是串口句柄,第二个是数据,第三个是数据长度,第四个是超时时间。

串口接收函数原型:
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
这个是串口轮询接收函数,其中第一个参数是串口句柄,第二个是数据,第三个是数据长度,第四个是超时时间。

串口调试助手简单介绍:

在这里插入图片描述

从本串口实验开始,接下来和串口相关的电脑串口调试助手软件将采用正点原子提供的ATK-XCOM串口助手进行使用,个人觉得这款串口助手还是比较好用的。

注意
1、这个软件在没有勾选16进制显示的情况下,都是以文本(ASCII)格式显示的。
2、后面提及到发送和接受都是相对单片机和串口助手而言的,单片机串口发送,串口助手接收,串口助手发送,单片机串口接收。

串口助手下载

3.1 串口发送

3.1.1 发送字符串

使用该函数发送一个字符串数据,在代码里面编写如下图所示:

在这里插入图片描述

代码片示例如下:

HAL_UART_Transmit(&huart1, "abcde", 5, 1000);

打印结果如下图所示:
串口助手右边是串口的通信参数,要和程序设置的保持一致才能正常通信,左边是单片机串口发送的内容。如下图所示:

在这里插入图片描述

因为这个函数是写在在while循环外面的,那么只会初始化执行打印一次。
每当按一次复位按键就可以发送一次数据了,且不会回车换行处理。

如果把这个发送函数放到while循环里面的话,则会看到串口一直输出这个字符串了。如下图所示:

在这里插入图片描述

为了使用方便,可以把这个字符串定义成字符数组形式。如下图所示:

在这里插入图片描述

之后把数组名以函数参数传入该串口发送函数即可。如下图所示:

在这里插入图片描述

下载代码后,可以看到串口助手打印abcde内容了,和前面的效果是一样的,只是写法不一样而已。

3.1.2 sizeof使用

串口发送函数有一个参数是数据长度的,它需要编程者传入具体的串口数据长度,但是如果这个数据需要频繁的变动,则这样手动赋值是不方便的,那么可以使用sizeof来计算。

比如定义了一个字符数组,串口发送函数的数据长度参数就不用人为去计算具体的数据长度了,可以用sizeof来自动计算,免得计算错误,用这种方式是非常方便的。如下图所示:

在这里插入图片描述

代码片示例如下:

  /* USER CODE BEGIN 1 */
	char bufchar[] = "abcde";
  /* USER CODE END 1 */

  /* USER CODE BEGIN 2 */
  HAL_UART_Transmit(&huart1, bufchar, sizeof(bufchar), 1000);
  /* USER CODE END 2 */

如果是人为计算的就比较麻烦了,小量的数据还好,当定义的数组长度发生变化且很长的时候,人为手动去计算是不合实际的,所以使用自动计算就省去了这个手动计算的步骤,只要传入数组名即可,这样也保证了数据的准确性。

这样写完代码下载后,可以发现和前面的写法输出的结果是一样的。

注意:当添加了这个sizeof后,当串口助手勾选十六进制显示内容时,可以发现前面的数据和程序是对应得上的,就是在数据后面部分多了一个数据00,如下图所示:

在这里插入图片描述

这个是为什么呢,通过分析,发现原来是sizeof的使用问题导致的。正常它是会多一个结束符的,如果不需要则可以将整个数据长度减去1就可以,写法如下图所示:

在这里插入图片描述

代码片示例如下:

  /* USER CODE BEGIN 2 */
  HAL_UART_Transmit(&huart1, bufchar, sizeof(bufchar)-1, 1000);
  /* USER CODE END 2 */

再次编译下载代码后,就可以发现就没有显示这个数据00了,如下图所示:

在这里插入图片描述

此时可以发现那个00已经没有了,则说明就是这个问题导致的,通过这样操作就可以改善。

在正常使用的情况下,可以不用特殊处理这个减1操作,有特殊需求的话就需要这样操作才行。因为这个串口发送函数的数据传输的长度可以大于或等于实际数据的长度,就不能小于,如果小于的话,只能接收到指定长度的数据了。

这里就不演示这个小于实际长度的例子了,可以发前面bufchar[] = “abcde”;字符数组,长度传入3,则可以发现打印出来的是abc,后面的de将不会显示出来。

3.1.3 发送十进制数值

这个串口发送函数除了可以发送字符串,还可以发送十进制数字。如下图所示:

在这里插入图片描述

定义一个数组缓冲区,里面存放多个十进制数值数据。

串口发送函数传入该数组后,如下图所示:

在这里插入图片描述

串口助手打印结果如下图所示:

在这里插入图片描述

可以在串口助手看到单片机串口发过来的数据,明明程序发送的是十进制的数字,但为什么串口助手会显示的是符号而不是对应的十进制数字呢?

在前面章节已经介绍了这款串口助手是以ASCII字符形式显示内容的,所以串口助手打印出来看到的是其十进制的字符形式的内容,当勾选了十六进制显示后,可以对比ASCII表,也可以发现代码的十进制转换为十六进制后和串口助手的十六进制是对应得上的。

对比下面ASCII表:(详细ASCIIC表,看第6章)

在这里插入图片描述

查表以后,可以看到32的十进制对应字符是空格,31是叹号,后面的查看表格以此类推即可。

勾选十六进制显示后的效果如下图所示:

在这里插入图片描述

如果代码发送的十进制数不是在32至126区间内的数,则串口助手会显示乱码或者一个框框等特殊的符号,说明该数字不是可显示的ASCII字符

3.1.4 发送十六进制数值

使用串口发送函数发送十六进制数,定义如下图:

在这里插入图片描述

定义一个数组缓冲区,里面存放4个十六进制数据。

串口发送函数传入该数组后,如下图所示:

在这里插入图片描述

串口助手使用ASCII形式显示,会显示十六进制对应的ASCII字符,打印结果如下图所示:

在这里插入图片描述

勾选使用十六进制形式显示如下图所示:

在这里插入图片描述

该数组的十六进制数据和ASCII码字符对照表如下:

在这里插入图片描述

整合代码如下图所示:

在这里插入图片描述

在这里插入图片描述

代码片示例如下:

  /* USER CODE BEGIN 1 */
	uint8_t bufchar[] = "abcde";
	uint8_t buffer[] = {32, 33, 34, 35, 36};
	uint8_t hexbuf[] = {0x23, 0x24, 0x25, 0x26};
  /* USER CODE END 1 */

  /* USER CODE BEGIN 2 */
  HAL_UART_Transmit(&huart1, bufchar, sizeof(bufchar)-1, 1000);
  HAL_UART_Transmit(&huart1, buffer, sizeof(buffer), 1000);
  HAL_UART_Transmit(&huart1, hexbuf, sizeof(hexbuf), 1000);
  /* USER CODE END 2 */

到此,使用串口简单数据发送方式就演示到这里,接下来就可以完成自己的串口功能了。

3.2 串口接收

前面学习了串口发送函数,现在来学习串口接收函数,它们是很类似的,函数的参数一样,用法也一样。接下来简单介绍一下这个串口接收函数的使用。

串口要接收内容,那么首先定义一个数据接收缓冲区,用来存放接收的数据,如下图所示:

在这里插入图片描述

这里接收不用赋初值也行,指定长度即可,当然局部变量是建议赋初值为0的。

调用串口接收函数,传入相关参数如下图所示:

在这里插入图片描述

编译下载代码后,可以在串口调试助手数据发送区输入发送5字节数据内容,可以看到S处的数值是5则说明发送了5字节数据。

注意不要勾选⑤处的发送新行选项,否则数据会多一个回车换行符占,它们占2字节数据长度。如下图所示:

在这里插入图片描述

由于代码只写了数据接收函数,并没有写数据发送函数,所以串口助手接收区是看不了显示内容的,为了要看到内容,则需要在代码添加串口发送函数才行,如下图所示:

在这里插入图片描述

把串口助手发送的内容原原本本的回显在串口助手接收区进行显示如下图所示:

在这里插入图片描述

这里需要注意一下
前面硬件介绍了串口线是需要交叉的,这里做串口通信就可以很好体现出来了。
当单片机串口作为发送端,那么电脑串口调试助手则作为接收端,单片机发送的内容将显示在电脑串口助手的数据接收区内。

当电脑串口助手作为发送端,那么单片机串口则作为接收端,单片机接收电脑串口助手的数据存放在接收数据缓冲区内。

这就说明它们的通信过程是一个交叉的收发过程。

第4章 串口函数超时时间参数说明

HAL库的串口发送和接收函数的最后一个参数是一个等待超时时间的参数,下面来举例学习说明一下该参数的使用。

比如前面的串口发送和接收函数的该参数都传入了1000,则说明超时时间是1000ms,会用这1000ms来等待判断是否接收完数据,如果在这个时间内还没接收到指定长度的数据,则一直在死等接收,若超时了还没接收完,则会跳过这个串口接收进行执行后面的功能代码。示例代码如下图所示:

在这里插入图片描述

代码片示例如下:

/* USER CODE BEGIN WHILE */
	while (1)
	{
		  HAL_UART_Receive(&huart1, rx_buf, sizeof(rx_buf), 1000);
		  HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_GPIO_PIN);
		  HAL_UART_Transmit(&huart1, rx_buf, sizeof(rx_buf), 1000);
    }
/* USER CODE END WHILE */

函数参数传入1000,在下面添加一个LED翻转功能代码,用来验证这个超时时间的执行情况。

通过原理分析,只要1000ms的时间到了,无论是接收到数据还是没接收到全部数据,则都会跳过串口接收进入执行下面的LED翻转代码。

HAL库提供了一个死等超时时间的宏,该宏定义在stm32f1xx_hal_def.h文件里面,如下图所示:

在这里插入图片描述

这个宏的数值非常大,是阻塞的,把这个宏作为参数传入函数里面,当串口在这个时间内一直都没有接收到指定长度的数据,则会一直在死等接收,不会执行后面的LED翻转代码,如下图所示:

在这里插入图片描述

代码片示例如下:

/* USER CODE BEGIN WHILE */
	while (1)
	{
		  HAL_UART_Receive(&huart1, rx_buf, sizeof(rx_buf), HAL_MAX_DELAY);
		  HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_GPIO_PIN);
		  HAL_UART_Transmit(&huart1, rx_buf, sizeof(rx_buf), 1000);
    }
/* USER CODE END WHILE */

串口调试助手的数据情况如下:

在这里插入图片描述

举例说明
在前面定义了数据接收缓冲区的长度是5,则说明一次接收完整的数据是5字节,当我一次发送ddd时,即3字节数据,并不够5字节,则此时电脑串口调试助手是无法正常显示接收的内容,那么它会一直在阻塞死等,继续接收完整5字节数据才行。

当第二次再发送3个ddd时,则一共发送了6字节的数据,测试可以看到串口助手可以显示接收到5个d了,说明成功接收到了指定的5个字节数据,电脑串口助手也可以正常显示了该5字节的内容,就直接退出串口接收函数进入执行下面的LED翻转功能代码。

这里可以发现我一共发了6个d,而串口助手只显示5个,那么后面一个d去哪里了呢?通过实验测试,发现这个d将会留到下一次发送数据里面了,即插入到了下一次的数据中。该验证如下:

例如先发送2次ddd,串口助手显示接收到5个d,后面再发2次ccc,则后面5字节内容里面就带有一个d四个c了,如下图所示:

在这里插入图片描述

可知,一共发了6个d和6个c,共12个字节内容,而串口指定接收是10字节长度内容。

通过分析,可以看到串口助手接收到了6个完整的d和4个c,说明有一个d被放到了后面的接收数据了。

通过这个简单的串口收发验证,很好的说明了串口数据处理时需要严谨,不然可能会导致数据发送错乱情况、数据丢失等情况。

如果定义了指定数据的长度,为了避免出错,就按照规定来处理才行,以免数据出错。这个问题有需求的情况下则需要着重考虑。

第5章 添加printf函数支持

在写代码时,如果想在串口助手看打印信息,直接用这个串口发送函数并不是很方便的,那么就可以使用库提供的printf函数,使用这个函数打印调试信息在串口助手查看就很方便了,而且这个函数支持的功能也非常的强大,只要会熟悉使用C语言的转义字符基本没有什么问题。

当安装完该软件,第一次使用printf时,写如下图这样的printf语句代码后,可以发现是会有警告的。如下图所示:

在这里插入图片描述

警告如下图所示:

在这里插入图片描述

编译下载代码到开发板后,发现串口助手并不会正常打印这个信息。则说明这样直接写是不行的,还需要在工程添加支持才行。

5.1 串口重定向

库给我们提供了一个打印输出一个字符的函数,如下图所示:

在这里插入图片描述

打开这个syscalls.c文件就可以找到这个putchar函数,相信学习过C语言的朋友都应该比较熟悉这个函数了。

那么我们想要成功使用printf函数的支持,就需要拷贝这个函数,重定向一下串口发送函数就可以了,如下图所示:

在这里插入图片描述

建议把这个putchar函数拷贝到usart.c里面进行编写,方便管理串口代码。

代码片示例如下:

/* USER CODE BEGIN 0 */
int __io_putchar(int ch)
{
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
	return ch;
}
/* USER CODE END 0 */

注意:
1、串口发送函数的数据参数ch,前面参数是int类型,如果直接传入ch,则会有警告的,需要强制转换一下数据类型才行。
2、调用串口轮询发送函数,其实这里是发送一个字符内容的,可以直接将数据长度传入1即可,没有必要用sizeof了,当然,这样写也没有问题。
3、在main里面文件里面添加引入stdio.h头文件。

按照前面的步骤添加完代码之后就可以使用printf了,如下图所示:

在这里插入图片描述

编译也不会报警了,如下图所示。

在这里插入图片描述

编译下载到开发板后,效果打印效果如下图所示:

在这里插入图片描述

可以看到串口助手正常打印内容了,这样简单写的代码会把这些内容显示在一起的,如果需要美观一些,可以在后面增加回车换行符即可。

代码片示例如下:

  /* USER CODE BEGIN WHILE */
	while (1)
	{
		printf("123\r\n");
    	/* USER CODE END WHILE */
    }
  /* USER CODE END 3 */

添加了回车之后就可以看到在独立行显示内容了,就不会都显示在一起了,如下图所示:

在这里插入图片描述

5.2 打印中文

如果需要用printf来打印汉字,也是可以的,前提是要先将环境的编码格式改为GBK才行,因为默认是UTF-8格式的,不然在串口调试助手看到的汉字就会是乱码显示的。

具体的设置方法前面的软件使用教程已经描述过了,这里就不重复展开描述。添加代码如下图所示:

在这里插入图片描述

虽然是正常打印了,但是发现是一串很长的内容没有空格,那么为了美观,可以给数据加一个回车换行符再打印,并且在后面加一个延时,效果如下图所示:

在这里插入图片描述

5.3 打印十进制数值

printf函数除了可以打印字符串,还可以格式打印其它的数值,比如打印十进制、十六进制、浮点数等等,只要懂得使用C语言的转义字符就可以了。

用printf打印十进制数据,如下图所示:

在这里插入图片描述

先定义一个变量,并赋初值为0。

在while循环里面让该变量自增,使用printf打印输出,如下图所示:

在这里插入图片描述

代码片示例如下:

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
	while (1)
	{
		num++;
		printf("串口打印内容:%d\r\n", num);
		HAL_Delay(500);
  		/* USER CODE END WHILE */
  	 }

串口助手打印内容如下图所示:

在这里插入图片描述

可以看到前面的汉字是固定的,后面的数值不断在自增,主要是%d的作用。

5.4 打印浮点数

如果需要用printf来打印浮点数,需要在软件设置支持输出才行。右键工程,点击Properties,或者点击选中工程按快捷键Alt+Enter,设置如下图所示:

在这里插入图片描述

勾选Use float with printf from newlib-nano选项即可,然后点击Apply应用。

添加代码如下:

在这里插入图片描述

定义一个浮点数变量并赋初值。

代码编写如下图所示:

在这里插入图片描述

串口助手打印入下图所示:

在这里插入图片描述

代码片示例如下:

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
	while (1)
	{
		num++;
		printf("串口打印内容:%d\r\n", num);
		HAL_Delay(500);
  		/* USER CODE END WHILE */
  	 }

第6章 ASCII对照表

ASCII表可以在网上查找,很多的,找到一个适合的进行使用即可。
在这里插入图片描述

第7章 实验现象

具体的实验现象,看相关章节内容即可。


总结

使用轮询的方式实现串口的数据收发是比较简单的,缺点是比较耗费CPU,在简单的应用场合或者用来测试还是比较方便的,使用简单。

发送的数据方式有很多种,这个就要熟练掌握C语言的知识了,这里只是简单列举了部分的使用,还有很多没有一一列举出来举例,有兴趣的可以自己实践下。

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

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

相关文章

KIOXIA铠侠CM7系列E3.S双端口NVMe2.0 PCIe5.0 SSD KCM71RJE7T68

KIOXIA 铠侠推出的CM7-R E3.S企业级NVMe读密集型企业级固态硬盘,采用PCIe 5.0和NVMe 2.0技术,性能出色,最高可达2,700K IOPS(随机读取)和310K IOPS(随机写入)1 DWPD的耐用性和高达15.36 TB的存储…

xmes前端问题,给form表单赋值后,再次从表单拿不到该值

xmes前端,给form表单赋值后,再次从表单拿不到该值,但页面可以展示 赋值 this.$[frm-main].$$([namefilm_num]).value filmNum ; 获取表单的值,这里拿不到之前赋的值 const reqData this.$[frm-main].serializeMyForm(); 原因&…

基于tcp协议的网络通信(将服务端守护进程化)

目录 守护进程化 引入 介绍 如何实现 思路 接口 -- setsid 注意点 实现代码 daemon.hpp log.hpp 运行情况 前情提要 -- 前后台任务介绍(区别命令),sessionsid介绍,session退出后的情况(nuhup,终端进程控制组),任务进程组概念,任务与进程组的关系,-bash介绍-CSDN博客…

深入了解服务器硬件:从基础知识到实际应用

在当今数字化的社会中,服务器扮演着至关重要的角色,它们是支撑互联网、云计算、大数据等技术发展的基石。而理解服务器硬件的基础知识对于从事IT领域的人员来说至关重要。本文将从服务器硬件的基础知识出发,介绍服务器硬件的组成、作用及其在…

Rust使用feature特性和条件编译,以及常用feature使用说明

Cargo Feature 是非常强大的机制,可以为大家提供条件编译和可选依赖的高级特性,可以为你省下不少的代码量来判断操作系统和条件编译等功能。rust官方条件编译文档:Conditional compilation - The Rust Reference features特性 Featuure 可以…

基于nodejs+vue电子产品销售系统设计与实现python-flask-django-php

该系统采用了nodejs技术、express框架,连接MySQL数据库,具有较高的信息传输速率与较强的数据处理能力。包含管理员和用户两个层级的用户角色,系统管理员可以对个人中心、用户管理、产品类别管理、电子产品管理、留言板管理、系统管理、订单管…

【开发篇】七、mybatis的foreach遍历,SQL拼接导致内存溢出

文章目录 1、背景2、快照文件分析3、本地环境复现4、结论5、解决方式 1、背景 文章微服务升级,新增了一个传入文章id的List,判断有多少id是存在的接口,第二天高峰期内存溢出。 2、快照文件分析 打开直方图,发现线程对象占用排第…

11.测试教程-自动化测试selenium-3

文章目录 1.unittest框架解析2.批量执行脚本2.1构建测试套件2.2用例的执行顺序2.3忽略用例执行 3.unittest断言4.HTML报告生成5.异常捕捉与错误截图6.数据驱动 大家好,我是晓星航。今天为大家带来的是 自动化测试selenium第三节 相关的讲解!&#x1f600…

强!不用写一行代码!Python最强自动化神器!

1、Playwright介绍 Playwright是一个由Microsoft开发的开源自动化测试工具,它可以用于测试Web应用程序。Playwright支持多种浏览器,包括Chrome、Firefox和WebKit,同时也支持多种编程语言,如JavaScript、TypeScript、Python和C#。…

2014年认证杯SPSSPRO杯数学建模B题(第一阶段)位图的处理算法全过程文档及程序

2014年认证杯SPSSPRO杯数学建模 B题 位图的处理算法 原题再现: 图形(或图像)在计算机里主要有两种存储和表示方法。矢量图是使用点、直线或多边形等基于数学方程的几何对象来描述图形,位图则使用像素来描述图像。一般来说&#…

【Chrome控制台】application的使用

首先打开调试面板「windows:F12;mac:commandoptioni」,找到Application选项卡。 如下两区域与pwa相关,也就是渐进式web应用程序。 使用前端数据库如websql或IndexDB,可以在如下选项中查看。 数据库详情要到Storage中…

nysm:一款针对红队审计的隐蔽型后渗透安全测试容器

关于nysm nysm是一款针对红队审计的隐蔽型后渗透安全测试容器,该工具主要针对的是eBPF,能够帮助广大红队研究人员在后渗透测试场景下保持eBPF的隐蔽性。 功能特性 随着基于eBPF的安全工具越来越受社区欢迎,nysm也应运而生。该工具能保持各种…

Gitee码云最有价值开源项目之一:CRMEB开源商城系统,全平台、全功能的电商解决方案

一、引言 随着电子商务的快速发展,开源电商系统在行业中扮演着越来越重要的角色。CRMEB开源商城系统作为其中的佼佼者,凭借其强大的功能、卓越的性能和极高的易用性,成为了许多开发者和商家的首选。本文将对CRMEB开源商城系统进行深入的探讨…

Kimi是什么?免费Kimi chat介绍

1. Kimi是什么? Kimi是由月之暗面科技有限公司(Moonshot AI)开发的人工智能助手,专注于提供高质量的对话和信息处理服务。 月之暗面公司创立于2023年3月,创始团队核心成员参与了Google Gemini、Google Bard、盘古NLP、…

java算法第32天 | 贪心算法 part02 ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

122.买卖股票的最佳时机II 本题中理解利润拆分是关键点! 不要整块的去看,而是把整体利润拆为每天的利润。假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。 相当于(prices[3] - prices[2]) (prices[…

迷宫(一)(DFS BFS)

//新生训练 #include <bits/stdc.h> using namespace std; int n, m; bool f; char mp[15][15]; int vis[15][15]; int dir[4][2] {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; bool in(int x, int y) {return 0 < x && x < n && 0 < y && y …

美人鱼图像双目配准-Mermaid

前言&#xff1a; 我在进行一项双目测距的项目&#xff0c;已经通过matlab 进行了相机标定&#xff0c;如果手动选择左右图像里的相同物体&#xff0c;是可以给出可接受距离的。 但是现在我希望能够让左视图的坐标点和右视图的坐标点进行匹配&#xff08;如下图&#xff09; …

Windows 安装 Java JDK 17 (源码方式安装)【图文详细教程】

这里我选择安装的 Java JDK 的版本为 17 Java JDK 下载 这里选择下载压缩包形式的 Java JDK&#xff0c;下载完成后&#xff0c;我们只需要对压缩包进行解压&#xff0c;然后再配置系统环境变量就可以了下载网址&#xff1a;https://www.oracle.com/cn/java/technologies/down…

【C语言】linux内核pci_enable_device函数和_PCI_NOP宏

pci_enable_device 一、注释 static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags) {struct pci_dev *bridge;int err;int i, bars 0;/** 此时电源状态可能是未知的&#xff0c;可能是由于新启动或者设备移除调用。* 因此获取当前的电源状态&…

电脑总是自动删除下载或解压后的文件

电脑总是自动删除下载或解压后的文件 前言&#xff1a; 最近navicat15 破解时候&#xff0c;下载安装包和破解包&#xff0c;破解包在解压后自动删除&#xff0c;要不然就是文件包含病毒电脑自动关闭打开功能。 解决方案&#xff1a; 注意&#xff1a;注意电脑重启或者重新打…