嵌入式实验—STM32串口通信

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


实验任务: 一.
了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。

二. 串口传输文件的实验。将两台笔记本电脑,借助
USB/TTL转RS232模块和杜邦线,建立起串口连接。然后用串口助手等工具软件(如sscom,带文件传输功能)将一台笔记本上的一个大文件(图片、视频和压缩包软件)传输到另外一台电脑。

(1)预估文件大小、波特率和传输时间三者之间的关系,并对比实际传输时间。 (2)如果只接TX–RX, RX–TX
这样两根线,不接电源线或者不接GND地线,文件传输是否还能正常工作?请解释原因。

三. 安装 stm32CubeMX,配合Keil,使用HAL库(或标准库)方式,设置USART1
波特率为115200,1位停止位,无校验位,完成下列任务:

(1)STM32系统给上位机(win11)连续发送“hello
windows!”,win11采用“串口助手”工具接收。如果STM32的连续发送之间不加延时语句,观察win11端是否出现接收数据丢失的现象。

(2)在完成以上任务基础,继续扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello
windows!”;发送一个字符“*”后,stm32继续发送;

四. 学习STM32中断、DMA通信原理和编程方法。使用stm32tubemx和HAL库分别完成以下编程练习:

(1) 采用串口中断方式重做上面任务二(2)的串口通信实验。

(2)STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据。 五.
在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察任务三(1)串口输出波形,并分析时序状态正确与否,计算波特率实际为多少。

一.串口通信的基本原理

1. 串口协议和RS-232标准

(1)串口通信
串口通讯 (Serial Communication)是一种设备间非常常用的串行通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 通讯协议,我们以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。

名称组成部分
物理层具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输
协议层规定通讯逻辑,统一收发双方的数据打包、解包标准。

(2)RS-232标准
RS-232是现在主流的串行通信接口之一。由于RS232接口标准出现较早,难免有不足之处,主要有以下四点:
1)接口的信号电平值较高,易损坏接口电路的芯片。RS232接口任何一条信号线的电压均为负逻辑关系。即:逻辑“1”为-3— -15V;逻辑“0”:+3— +15V ,噪声容限为2V。即要求接收器能识别高于+3V的信号作为逻辑“0”,低于-3V的信号作为逻辑“1”,TTL电平为5V为逻辑正,0为逻辑负 。与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接。
2)传输速率较低,在异步传输时,比特率为20Kbps;因此在51CPLD开发板中,综合程序波特率只能采用19200,也是这个原因。
3)接口使用一根信号线和一根信号返回线与地线构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。
4)传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在15米左右。

2. RS232电平与TTL电平的区别

RS232电平和TTL电平是两种不同的电压信号标准,它们在电压级别、通信速率、传输距离等方面存在差异。以下是它们的主要区别:

(1)电压级别:
1)RS232电平:RS232是一种串行通信协议,其电压电平较高,正电压通常在+3V到+15V之间,负电压在-3V到-15V之间。RS232电平信号通常用于长距离通信。
2)TTL电平:TTL(晶体管-晶体管逻辑)电平是一种数字电路标准,其电压电平较低,高电平(逻辑1)通常在2V到5V之间,低电平(逻辑0)在0V到0.8V之间。TTL电平信号通常用于短距离通信。

(2)通信速率:
1)RS232电平:由于电压电平较高,RS232电平的通信速率相对较低,通常在300波特到115.2千波特之间。
2)TTL电平:TTL电平的通信速率可以更高,因为它的电压变化更快,可以支持高达几兆波特的速率。

(3)传输距离:
1)RS232电平:由于电压较高,RS232电平信号可以传输较远的距离,通常可达15米以上。
2)TTL电平:TTL电平信号由于电压较低,传输距离较短,通常在几米以内。

(4)驱动能力:
1)RS232电平:RS232电平可以驱动多个设备,因为它的电压较高,可以提供足够的电流。
2)TTL电平:TTL电平的驱动能力较弱,通常只能驱动一个或少数几个设备。

(5)抗干扰能力:
1)RS232电平:由于电压较高,RS232电平信号在长距离传输时更容易受到干扰。
2)TTL电平:TTL电平信号由于电压较低,抗干扰能力相对较强,尤其是在短距离传输时。

(6)接口类型:
1)RS232电平:RS232通常使用DB9或DB25等类型的接口。
2)TTL电平:TTL电平通常使用简单的针脚或排针接口。

(7)应用场景:
1)RS232电平:常用于计算机与外部设备(如调制解调器、鼠标、打印机等)之间的通信。
2)TTL电平:常用于微控制器、FPGA等数字电路之间的通信。## 3. "USB/TTL转232"模块

3.了解"USB/TTL转232"模块

这里以CH340芯片模块为例
(1)CH340芯片模块
CH340芯片实物图:
在这里插入图片描述
在这里插入图片描述
CH340芯片模块是一款多功能的USB转串口转换器,它支持全速USB接口,兼容USB 2.0,能够仿真标准串口,提供硬件全双工串口通信,内置收发缓冲区,并支持多种MODEM联络信号。此外,它还能通过外部电平转换器件提供RS232、RS485、RS422等接口,部分型号支持红外线通讯,并且软件兼容CH341,支持5V和3.3V电源电压,内置时钟和EEPROM配置,适用于多种封装形式,且具备USB挂起功能以节约功耗。

CH340的工作原理
CH340芯片模块通过USB接口接收计算机或其他USB主机设备的数据,将其转换为串行格式并通过内置的UART模块处理,同时进行必要的电平转换以适配不同的串行通信标准,如RS232、RS485等。它支持MODEM联络信号以控制数据流和指示通信状态,内置固件处理USB协议和数据缓冲,确保数据正确传输,并通过计算机端的驱动程序仿真标准串口,使得现有的串口应用程序能够无需修改即与CH340通信,从而实现USB与串行设备间的无缝数据交换。
(2)USB转RS-232
USB转RS-232转换的基本原理:

1)接口转换:
USB接口传输的是差分信号,而RS-232使用的是单端信号。USB转RS-232转换器(如CH340芯片模块)内部包含必要的电路,将USB的差分信号转换为RS-232的单端信号。

2)电平转换:
USB信号的电压水平(通常是3.3V或5V)需要转换为RS-232的电压水平(通常是-15V至+15V)。转换器内部的电路负责将USB的逻辑电平转换为RS-232的电平。

3)数据格式转换:
USB使用数据包传输,而RS-232是面向字符的异步传输。转换器需要将USB的数据包转换为RS-232的字符流,并处理起始位、数据位、奇偶校验位和停止位。

4)驱动程序:
在计算机端,需要安装适当的驱动程序来识别USB转RS-232转换器,并将其仿真为标准的COM端口。这样,计算机上的串口通信软件就可以通过这个虚拟的COM端口与RS-232设备通信。

5)通信控制:
RS-232通信还涉及到控制信号,如请求发送(RTS)、数据终端就绪(DTR)等。USB转RS-232转换器能够处理这些控制信号,确保数据正确、可靠地传输。

USB转串口电路板与单片机的接线图,VCC接线是为了单片机供电,USB转串口的RXD引脚与单片机的TXD引脚相连,USB转串口的TXD引脚与单片机的RXD引脚相连,两者的GND引脚直接相连。
在这里插入图片描述

二.串口通信实验——文件传输

1.电路连接

2.文件传输

三.串口通信实验——STM32系统给上位机发送“hello windows!”

1.HAL库配置

创建文件
使用STM32CubeMx创建新工程,点击左上角的File文件选择“New Project”
在这里插入图片描述
在弹出的界面中,下拉列表输入芯片名称“STM32F103C8T6”,右下角选中后,点击“Start Project”
在这里插入图片描述
配置“RCC”
RCC中, HSE选中"Crystal/Ceramic Resonator"项,LSE选择Disable(默认),界面如下:
在这里插入图片描述

配置“SYS”
下拉Debug模式 ,选中"Serial Wire"Timebase Source选择“SysTick”,界面如下:

在这里插入图片描述USART1配置
选择USART1进行传输,将串口设置为异步工作模式:
参数设置波特率为115200 Bits/s,传输数据长度为8 Bit,奇偶检验无,停止位1(按默认就行,有其他需求自行修改)
在这里插入图片描述
时钟配置
点击Clock Configuration 选择HSE和PLLCLK

我们的开发板配备了一个8MHz的外部晶振,我们将其频率值设定为8。在时钟源选择上,我们选择了LSE作为通道。对于PLLM,我们选择了不进行分频,即设置为/1。在倍频系数N的设置上,我们选择了9倍,以使系统时钟频率达到72MHz,这是通过PLLCLK实现的。系统时钟最终被设定为72MHz。对于APB1,我们选择了分频系数为/2,因此PCLK1的频率为36MHz;而对于APB2,我们选择了不分频,即分频系数为/1,使得PCLK2的频率保持在72MHz。如下图修改:
在这里插入图片描述
Project Manager设置

注意文件名不能含有中文

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.keil5工程代码完善

2.1 发送“hello windows!”

先用keil打开工程后,找到main.c文件,在while(1)中添加如下代码内容

 while (1)
  {
    /* USER CODE END WHILE */
		
		 HAL_UART_Transmit(&huart1, (uint8_t *)"Hello Windows!\r\n", 16, 0xFFFF); // 发送数据,长度为16
        HAL_Delay(1000); // 延迟1000ms
 
    /* USER CODE BEGIN 3 */
  }

2.2 上位机控制发送“hello windows!”

当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送。
main.c代码为:

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

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

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
char rcData = 0; // 初始化接收数据变量
uint8_t flag = 1; // 控制发送的标记,初始为1表示开始发送
char tips[] = "CommandError\r\n"; // 提示信息,以回车换行符结束
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{	
    // 首先检查是否有接收到的数据
    HAL_StatusTypeDef receiveStatus = HAL_UART_Receive(&huart1, (uint8_t *)&rcData, 1, 0);
    if (receiveStatus == HAL_OK)
    {
        // 检查接收到的数据
        if (rcData == '#')
        {
            // 如果接收到'#'
            flag = 0; // 停止发送 "hello windows"
        }
        else if (rcData == '*')
        {
            // 如果接收到'*'
            flag = 1; // 继续发送 "hello windows"
        }
        else 
        {
            // 如果接收到其他字符,发送错误提示
            HAL_UART_Transmit(&huart1, (uint8_t *)tips, strlen(tips), 0xFFFF); 
        }
    }

    // 如果flag为1,即继续发送状态,则发送 "Hello Windows!"
    if (flag)
    {
        HAL_UART_Transmit(&huart1, (uint8_t *)"Hello Windows!\r\n", 16, 0xFFFF); // 发送数据,长度为16
        HAL_Delay(1000); // 延迟1000ms
    }
}
/* USER CODE END WHILE */


  /* USER CODE END 3 */
}

在这里插入图片描述

再进行编译,确认是否可以成功编译:

在这里插入图片描述

3.实物电路连接

3.1 程序烧录

首先先判断自己是选择的什么方式烧录程序(串口、STLINK)这里博主使用的是STLINK烧入程序:
接线原理图如下:
在这里插入图片描述使用杜邦线把STM32单片机的SWD四针下载接口接到STLINK对应接口上,实物理论接线图如下图所示:
在这里插入图片描述

实物图如下:

3.2 串口接入

在进行微控制器(MCU)与串口转换模块的连接时,应遵循以下接线规则以确保数据能够正确传输:

1)将MCU的发送引脚(TX)连接至串口转换模块的接收引脚(RX)。这样,当MCU发送数据时,串口转换模块能够接收这些数据。

2)将MCU的接收引脚(RX)连接至串口转换模块的发送引脚(TX)。这样,当串口转换模块发送数据时,MCU能够接收这些数据。

3)将MCU的地线(GND)与串口转换模块的地线(GND)相连。这一连接确保了两者之间有共同的电位参考点,对于电路的正常工作和信号的准确传输至关重要。

请确保在连接过程中,所有的连接都是正确无误的,以避免可能的硬件损坏或通信错误。

STM32芯片上的串口RX为PA10,TX为PA9:
在这里插入图片描述

具体连接:
PA10 RX—>串口 TX
PA9 TX —>串口 RX
实物图如下:
在这里插入图片描述

4. 完成实验

4.1 发送“hello windows!”实现

使用STLINK将代码烧录到STM32以后,使用用串口将STM32连接电脑,波特率与单片机一致,设置为115200,停止位为1,数据位为8,打开时间戳,可以发现大约1s,电脑接收一次“hello windows!”。
注意:之前如果你是串口烧录MCU的boot0置1,boot1置0。进行串口通信时记得改回来BOOT0置0,BOOT1置1(博主就是之前用的串口烧代码忘记改发现一直接收不到串口通信)
在这里插入图片描述

将主函数的HAL_Delay(1000); 注释掉,去掉延时,接收情况如下:

在这里插入图片描述出现了数据丢失
可能的原因:
串口缓冲区溢出:如果STM32发送数据的速度超过了PC端串口处理的速度,PC端的串口缓冲区可能会溢出,导致数据丢失。(从串口助手也可以看出没有延时一下发送了好几条“hello windows!”)

4.2 上位机控制发送“hello windows!”实现

当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送。实现情况如下:

串口

从视频看到当我输入一个“ * ”,虽然按我们的要求stm32继续发送“hello windows!”但是出现"了一个CommandError"
原因可能是因为在接收到#或*字符并改变flag的状态后,程序仍然在循环中执行了发送"Hello Windows!"的代码块。这可能是因为HAL_UART_Receive函数在等待接收数据时,如果超时(这里是1000毫秒),它将返回错误状态,这可能导致程序误入错误处理逻辑。

5. 使用Keil观察串口输出波形

设置Debeg
在这里插入图片描述
在这里插入图片描述
点击调试
在这里插入图片描述
选择逻辑分析仪
在这里插入图片描述
使用keil逻辑分析仪,配置要观察的引脚:
在这里插入图片描述然后观察输出波形:

在这里插入图片描述

四.串口通信实验——STM32中断与DMA

1.STM32串口中断

1.1 STM32CubeMX配置

在前面配置STM32cubx的基础配置串口中断,打开中断就可以:
前面的配置快速回顾:
点击左上角的File文件选择“New Project”,创建工程
在这里插入图片描述
在弹出的界面中,下拉列表输入芯片名称“STM32F103C8T6”,右下角选中后,点击“Start Project”
在这里插入图片描述
SYS配置
在这里插入图片描述

RCC配置
在这里插入图片描述
配置USART1
选择USART1进行传输,将串口设置为异步工作模式,

在这里插入图片描述
时钟配置
点击Clock Configuration 选择HSE和PLLCLK

我们的开发板配备了一个8MHz的外部晶振,我们将其频率值设定为8。在时钟源选择上,我们选择了LSE作为通道。对于PLLM,我们选择了不进行分频,即设置为/1。在倍频系数N的设置上,我们选择了9倍,以使系统时钟频率达到72MHz,这是通过PLLCLK实现的。系统时钟最终被设定为72MHz。对于APB1,我们选择了分频系数为/2,因此PCLK1的频率为36MHz;而对于APB2,我们选择了不分频,即分频系数为/1,使得PCLK2的频率保持在72MHz。如下图修改:
在这里插入图片描述Project Manager设置

注意文件名不能含有中文

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 完善keil5工程

这里使用串口中断的方式写代码,当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送。
代码设计如下:
头文件

#include "main.h"
#include "usart.h"
#include "gpio.h"
#include <string.h>

其中strlen函数是用来计算字符串长度的在这里插入图片描述
标准库函数,它的定义在<string.h>头文件中。为了避免警告,需要代码文件顶部包含这个头文件
在main函数前定义全局变量


/* USER CODE BEGIN 0 */
char c; // 用于存储接收到的字符
char message[] = "Hello Windows!\n"; // 要发送的消息
char tips[] = "CommandError\n"; // 错误提示
char tips1[] = "TM Start\n"; // 开始提示
char tips2[] = "TM Stop\n"; // 停止提示
volatile uint8_t flag = 1; // 控制发送的标志位,1表示发送,0表示暂停
/* USER CODE END 0 */

TM是博主名字简写不要在意。
main函数

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

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

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		// 主循环中不需要再次调用 HAL_UART_Receive_IT
    // HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);

    if (flag == 1)
    {
        // 发送信息
        HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message), 0xFFFF);
        // 延时
        HAL_Delay(1000);
    }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

中断处理函数

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    // 根据接收到的字符更新flag的状态
    if (c == '#')
    {
        flag = 0; // 暂停发送
        HAL_UART_Transmit(&huart1, (uint8_t *)tips2, strlen(tips2), 0xFFFF);
    }
    else if (c == '*')
    {
        flag = 1; // 继续发送
        HAL_UART_Transmit(&huart1, (uint8_t *)tips1, strlen(tips1), 0xFFFF);
    }
    else
    {
        // 发送错误提示
        HAL_UART_Transmit(&huart1, (uint8_t *)tips, strlen(tips), 0xFFFF);
    }

    // 重新设置中断,等待下一次接收
    HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
}
/* USER CODE END 4 */

再进行编译,确认是否可以成功编译:

在这里插入图片描述

1.3 结果实现

串口通信

2. STM32采用串口DMA方式

2.1 DMA原理

DMA(Direct Memory Access,直接内存访问)是一种硬件特性,它允许某些硬件子系统(如磁盘控制器或图形卡)直接访问系统的内存,而无需CPU的介入。这样,CPU可以同时执行其他任务,提高了系统的整体效率和性能。以下是DMA的基本原理:

1) 初始化:CPU初始化DMA传输,设置DMA控制器的寄存器,指定数据传输的源地址、目标地址、传输的数据量以及其他必要的参数。

2) 传输控制:一旦DMA传输被初始化,DMA控制器接管数据传输的控制权。这意味着CPU可以释放资源去执行其他任务。

3)数据传输:DMA控制器直接在内存和外设之间移动数据。这个过程不需要CPU的干预,因此CPU可以并行处理其他任务。

4)中断通知:当DMA传输完成时,DMA控制器可以发送一个中断信号给CPU,通知它传输已经完成。这样,CPU可以执行后续的处理,比如更新应用程序的状态或者准备下一次DMA传输。

5)错误处理:如果DMA传输过程中发生错误,DMA控制器也可以通过中断通知CPU,以便进行错误处理。

DMA的优点包括:

  • 提高性能:通过减少CPU的负担,DMA可以提高系统的整体性能。
  • 实时性:DMA允许外设以它们自己的速度与内存交换数据,这对于需要快速响应的实时系统非常重要。
  • CPU利用率:CPU可以更有效地利用,因为它可以在等待DMA传输完成的同时执行其他任务。

DMA广泛应用于需要高速数据传输的场合,如磁盘I/O、网络通信、音频和视频处理等。在嵌入式系统和微控制器中,DMA也常用于减轻CPU的负担,尤其是在处理高速或大量的数据传输时。

在这里插入图片描述

2.2 STM32CubeMX配置

创建工程、芯片选择、配置SYS、配置RCC与前面一致,这里我就不再重复了

配置USART
使能中断
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
然后就是时钟配置和文件生成,与前文一致,这里也不再重复。

2.3 完善keil5工程

打开keil工程,然后找到main.c函数:
在while(1)循环完整函数如下:

 while (1)
  {
	  uint8_t data[] = "Hello world!\r\n";
      HAL_UART_Transmit_DMA(&huart1,(uint8_t *)data,30);
      HAL_Delay(1000);   

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

在这里插入图片描述
并判断是否编译成功

2.3 结果实现

在这里插入图片描述
可以观察到收到了串口向上位机连续发送的数据

五. github上传代码

这一次我是通过下载GitHub Desktop进行上传,GitHub是国外的网站,经常网络不稳定,每次都要加载很久,所以我选择使用下载应用直接上传。
在这里插入图片描述
该软件的下载按照汉化过程我是参考的下面这个博客:
https://blog.youkuaiyun.com/qq_46365857/article/details/112581517
下载安装过程我不再重复。我这里直接上传我的工程到github仓库里

双击GitHub Desktop

这里的创建存储库就是指在代码托管平台(如GitHub、GitLab等)上新建一个项目空间的过程。在创建存储库时,你需要指定存储库的名称、描述、访问权限等信息。创建存储库后,就可以将代码上传至该存储库,并与其他开发者分享协作,这也是我们实验所要求的,如下:
在这里插入图片描述
点击新建存储库之后,这里我们需要给仓库中输入一些相应的信息,这里我将之前写的一个项目作为本地路径上传上去,然后点击新建存储库即可:

在这里插入图片描述

然后点击右上角的发布存储库按钮,将本地创建的存储库推送到远程仓库上:
在这里插入图片描述
弹出的弹框如下操作:

让仓库成为公共仓库,任何人都能访问到在这里插入图片描述
打开github之后,就可以看见创建的仓库已经在网页上有了:
在这里插入图片描述

(这是博主之前添加的库 如果是新添加的仓库只有框起来的文件)

然后就可以上传内容推送到远程仓库
把我们需要上传的代码项目的文件复制放到仓库当中去

然后在左下角输入本次提交的记录内容,写完之后然后点击commit到main分支即可

下来页面跳转到历史页面,此次是本次要推送到远程仓库的内容,直接点击上面菜单的推送origin即可:

在这里插入图片描述
回到“更改” 点击在浏览器中查看储蓄库
在这里插入图片描述
进入GitHub官网发现自己仓库里已经有了自己发送的文件了。

在这里插入图片描述

总结

在本次实验中,我们探索了通过串口传输文件的过程,即将一个大型文件(如图片、视频或压缩包)从一台笔记本电脑传输到另一台电脑。我们发现,实际传输时间超出了预期,这可能是由于传输过程中的延迟或错误导致的。为了确保文件传输的稳定性,我们必须正确连接电源线和GND地线,因为这是串口通信正常进行的基础。

实验中,我们采用了三种不同的方法来控制上位机通过串口发送数据:传统的串口通信、中断驱动的串口通信以及DMA(直接内存访问)驱动的串口通信。这三种方法都能实现数据的发送,但在STM32CubeMX配置和代码逻辑上存在一些差异。尽管如此,它们的基本原理和操作逻辑是相似的。

为了更深入地理解串口通信,我们利用了Keil软件的逻辑分析仪功能,观察了串口输出的波形。这种直观的波形展示帮助我们更好地理解了数据在串口传输过程中的表现。

在代码管理方面,我们尝试使用GitHub来上传和共享代码。虽然GitHub是一个强大的工具,但网络问题有时会影响我们的使用体验。所以这一次我换了个方式上次GitHub,通过APP直接上传减少了代码输入,因为网络问题而导致半天没有上传成功的问题很少出现了,这一次我换了个仓库和上一次的不一样,我已经统一把以前的代码文件都已经成功上传我新建的仓库。

通过这次实验,我对串口通信有了更深刻的认识。在实际操作中解决问题的过程,让我意识到自己在串口应用方面的技能还有待提高。这次实验不仅巩固了我对串口通信基础知识的理解,也激发了我将所学知识应用于小项目和日常生活中的兴趣。我期待在未来能够更加熟练地运用串口技术,创造出更多实用的应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值