文章目录

  • 一、stm32接收到字符“s”/“t”时停止/持续发送“hello windows!”
    • 1.STM32CubeMX工程创建
    • 2.程序编写
    • 3.程序编译及hex文件创建
    • 4.电路连接
    • 5.程序烧录
    • 6.串口调试
    • 7.运行结果
  • 二、stm32接收到字符串“stop stm32!”/“go stm32!”时停止/持续发送“hello windows!”
    • 1.STM32CubeMX工程创建
    • 2.程序编写
    • 3.程序编译及hex文件创建
    • 4.电路连接
    • 5.程序烧录
    • 6.串口调试
    • 7.运行结果
  • 三、总结
  • 四、参考链接

一、stm32接收到字符“s”/“t”时停止/持续发送“hello windows!”

1.STM32CubeMX工程创建

(1)打开STM32CubeMX主界面,点击“ACCESS TO MCU SELECTOR”,创建新项目

(2)在“Commerical Part Number”里面选择自己需要的芯片,点击信息栏中的具体芯片信息选中,再点击“Start Project”

(3)先点击System Core将其展开,再点击RCC,将HSE设置为Crystal/Ceramic Resonator

(4)点击SYS,将Debug设置为Serial Wire

(5)先点击Connectivity将其展开,再点击USART1,将Mode设置为Asynchronous

(6)点击NVIC,勾选USART1 global interrupt

(7)勾选PLLCLK和HSE,将晶振频率设置为最大值72MHz

(8)点击Project Manager→Project,配置好自己的项目名和项目存放路径,然后将Application Structure设置为Basic,将IDE设置为MDK-ARM

(9)点击Code Generate界面,选择生成初始化文件.c/.h,之后再点击GENERATE CODE即可成功创建工程

2.程序编写

(1)在点击GENERATE CODE之后弹出来的界面点击Open Project即可跳转到Keil5进行程序编写


(2)打开main.c文件
在main函数前定义全局变量

char c;//指令 0:停止  1:开始
char message[]="hello windows!\n";//输出信息
char tips[]="CommandError\n";//提示1
char tips1[]="Start.....\n";//提示2
char tips2[]="Stop......\n";//提示3
int flag=0;//标志 0:停止发送 1.开始发送

在main函数中设置接收中断
函数说明
◉函数原型

 HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

◉功能

功能:串口中断接收,以中断方式接收指定长度数据。
大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。
接收到数据时,会触发串口中断。
再然后,串口中断函数处理,直到接收到指定长度数据
而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)

◉参数

UART_HandleTypeDef *huart UATR的别名
huart1 *pData 接收到的数据存放地址
Size 接收的字节数

HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);

main函数中的while循环里面添加传输代码

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

在main函数下面重写中断处理函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{//当输入的指令为0时,发送提示并改变flagif(c=='s'){flag=0;HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF); }//当输入的指令为1时,发送提示并改变flagelse if(c=='t'){flag=1;HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF); }//当输入不存在指令时,发送提示并改变flagelse {flag=0;HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF); }//重新设置中断HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
}

main函数全部代码如下:

#include "main.h"
#include "usart.h"
#include "gpio.h"
#include <string.h>
void SystemClock_Config(void);
char c;//指令 s:停止  t:开始
char message[]="hello windows!\n";//输出信息
char tips[]="CommandError\n";//提示1
char tips1[]="Start.....\n";//提示2
char tips2[]="Stop......\n";//提示3
int flag=0;//标志 s:停止发送 t:开始发送
int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();//设置接受中断HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);   //当flag为1时,每秒发送一次信息//当flag为0时,停止while (1){if(flag==1){//发送信息HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF);          //延时HAL_Delay(1000);}}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{   //当输入的指令为s时,发送提示并改变flagif(c=='s'){flag=0;HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF); }    //当输入的指令为t时,发送提示并改变flagelse if(c=='t'){flag=1;HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF); }   //当输入不存在指令时,发送提示并改变flagelse {flag=0;HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF); }//重新设置中断HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
}
/* USER CODE END 4 */
/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){Error_Handler();}
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}

3.程序编译及hex文件创建

点击Rebuild编译程序,若没有错误即可成功创建hex文件

4.电路连接

USB转TTL STM32F103C8T6
GND GND
3v3 3v3
TXD A10
RXD A9

5.程序烧录

置BOOT0为0,BOOT1为1
(1)打开mcuisp,选择串口为COM5,并选择生成的hex文件

(2)点击读器件信息,若显示一切正常则进行下一步

(3)点击开始编程,若显示一切正常则说明烧录成功

6.串口调试

打开野火串口调试助手,将波特率设置为115200,数据位设置为8,停止位设置为1,校验位设置为None,然后点击打开串口

7.运行结果

(1)在发送区输入t,然后按Ctrl+Enter键发送,接收区会显示提示CommandError和Start…,并持续发送hello windows!

(2)点击清空重填,在发送区输入s,然后按Ctrl+Enter键发送,接收区会显示提示Stop…,并停止发送hello windows!

二、stm32接收到字符串“stop stm32!”/“go stm32!”时停止/持续发送“hello windows!”

1.STM32CubeMX工程创建

(1)打开STM32CubeMX主界面,点击“ACCESS TO MCU SELECTOR”,创建新项目

(2)在“Commerical Part Number”里面选择自己需要的芯片,点击信息栏中的具体芯片信息选中,再点击“Start Project”

(3)先点击System Core将其展开,再点击RCC,将HSE设置为Crystal/Ceramic Resonator

(4)点击SYS,将Debug设置为Serial Wire

5)先点击Connectivity将其展开,再点击USART1,将Mode设置为Asynchronous

(6)点击NVIC,勾选USART1 global interrupt

(7)点击Clock Configuration勾选PLLCLK和HSE,将晶振频率设置为最大值72MHz

(8)点击Project Manager→Project,配置好自己的项目名和项目存放路径,然后将Application Structure设置为Basic,将IDE设置为MDK-ARM

(9)点击Code Generate界面,选择生成初始化文件.c/.h,之后再点击GENERATE CODE即可成功创建工程

2.程序编写

(1)在点击GENERATE CODE之后弹出来的界面点击Open Project即可跳转到Keil5进行程序编写


(2)打开main.c文件
在main函数前定义全局变量

char c;//指令 0:停止  1:开始
char message[]="hello windows!\n";//输出信息
char tips[]="CommandError\n";//提示1
char tips1[]="Start.....\n";//提示2
char tips2[]="Stop......\n";//提示3
int flag=0;//标志 0:停止发送 1.开始发送

在main函数中设置接收中断
函数说明
◉函数原型

 HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

◉功能

功能:串口中断接收,以中断方式接收指定长度数据。
大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。
接收到数据时,会触发串口中断。
再然后,串口中断函数处理,直到接收到指定长度数据
而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)

◉参数

UART_HandleTypeDef *huart UATR的别名
huart1 *pData 接收到的数据存放地址
Size 接收的字节数

HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);

main函数中的while循环里面添加传输代码

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

在main函数下面重写中断处理函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{//当输入的指令为0时,发送提示并改变flagif(c=='s'){flag=0;HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF); }//当输入的指令为1时,发送提示并改变flagelse if(c=='t'){flag=1;HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF); }//当输入不存在指令时,发送提示并改变flagelse {flag=0;HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF); }//重新设置中断HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
}

main函数全部代码如下:

#include "main.h"
#include "usart.h"
#include "gpio.h"
#include <string.h>
void SystemClock_Config(void);
char c;//指令 s:停止  t:开始
char message[]="hello windows!\n";//输出信息
char tips[]="CommandError\n";//提示1
char tips1[]="Start.....\n";//提示2
char tips2[]="Stop......\n";//提示3
int flag=0;//标志 s:停止发送 t:开始发送
int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();//设置接受中断HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);   //当flag为1时,每秒发送一次信息//当flag为0时,停止while (1){if(flag==1){//发送信息HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF);          //延时HAL_Delay(1000);}}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{   //当输入的指令为s时,发送提示并改变flagif(c=='s'){flag=0;HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF); }    //当输入的指令为t时,发送提示并改变flagelse if(c=='t'){flag=1;HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF); }   //当输入不存在指令时,发送提示并改变flagelse {flag=0;HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF); }//重新设置中断HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
}
/* USER CODE END 4 */
/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){Error_Handler();}
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}

3.程序编译及hex文件创建

点击Rebuild编译程序,若没有错误即可成功创建hex文件

4.电路连接

USB转TTL STM32F103C8T6
GND GND
3v3 3v3
TXD A10
RXD A9

5.程序烧录

置BOOT0为0,BOOT1为1
(1)打开mcuisp,选择串口为COM5,并选择生成的hex文件

(2)点击读器件信息,若显示一切正常则进行下一步

(3)点击开始编程,若显示一切正常则说明烧录成功

6.串口调试

打开野火串口调试助手,将波特率设置为115200,数据位设置为8,停止位设置为1,校验位设置为None,然后点击打开串口

7.运行结果

(1)在发送区输入go stm32!,然后按Ctrl+Enter键发送,接收区会显示提示Start…,并持续发送hello windows!

(2)点击清空重填,在发送区输入stop stm32!,然后按Ctrl+Enter键发送,接收区会显示提示Stop…,并停止发送hello windows!

三、总结

做实验stm32接收到字符“s”/“t”时停止/持续发送“hello windows!”需要采用一个全局标量做信号灯,做实验stm32接收到字符串“stop stm32!”/“go stm32!”时停止/持续发送“hello windows!”要将接收到的连续字符保存到一个字符数组里,进行判别匹配。写一个接收字符串的函数,不然就会出错。通过本次实验,我知道了实现串口通信的多种方式,也对嵌入式有了更深入的了解,不过需要学习的仍然有很多。

四、参考链接

https://blog.csdn.net/qq_47281915/article/details/121053903?spm=1001.2014.3001.5506

采用串口中断方式实现串口通信:停止/持续发送“hello windows!”相关推荐

  1. 使用串口中断方式实现串口通信

    文章目录 一. 实验环境 二.实验目标 三.串口中断方式特点 四.HAL配置串口通信 五.开发板引脚连接 六.程序代码 (1)接收单个字符控制串口发送 (2)接收多个字符控制串口发送 七.总结 一. ...

  2. 采用串口中断方式实现串口通信

    文章目录 前言 一.中断介绍 1.中断方式 2.中断优先级 3.中断向量 二.利用STM32CubeMX配置项目 三.在keil配置代码 四.实际效果 五.总结 六.参考资料 前言 一.中断介绍 1. ...

  3. 串口中断方式与DMA方式通信

    文章目录 一.串口中断介绍 1.串口发送/接收函数 2.串口中断函数 3.串口查询函数 二.中断方式串口通信 1.题目要求 2.工程建立 3.代码编写 4.烧录与结果演示 三.DMA介绍 1.DMA简 ...

  4. 【嵌入式系统开发13】采用串口中断方式完成单字符接受与字符串接受

    本文目的是主要介绍通过STM32F103C8T6接收到字符"s"时,停止持续发送"hello windows!"; 当接收到字符"t"时,持 ...

  5. 使用51单片机采用中断方式进行串口通信的学习记录:

    使用51单片机进行串口通信的学习记录之中断方式: 1.51单片机采用中断方式的串口通信过程及程序分析: 所谓中断方式,就是串口收/发标志位出发中断后,在中断中执行既定操作,可通过函数调用来实现. 接收 ...

  6. HAL库中断方式实现串口通信操作

    文章目录 一.实验工具 二.CubeMX配置项目 1.引脚配置 2.RCC设置 3.SYS设置 4.USART设置 5.NVIC设置 6.创建项目 三.keil中配置代码 1.main函数前定义全局变 ...

  7. stm32中断方式的串口通信——上位机控制串口收发

    文章目录 前言 一.什么是串口通信 二.什么是中断--STM32 1.中断的概念 2.STM32下NVIC的介绍 3.中断优先级的介绍 4.外部中断的介绍 三.串口通信keil工程文件 1.新建工程模 ...

  8. 【STM32】基于STM32F407中断方式实现串口通信

    目录 一.中断介绍 二.中断方式实现串口通信 1. 新建工程 2. 工程设置 3.代码编写 4. 烧录验证 三.总结 四.参考 一.中断介绍 具体介绍参考文章: [STM32]基于STM32F407的 ...

  9. STM32之中断方式实现串口通信

    中断方式实现串口通信 一.创建项目 二.编写代码 三.运行 四.总结 一.创建项目 创建一个STM32f103c8的STM32CubeMX项目: SYS设置: RCC设置: 时钟树设置,输入72后回车 ...

最新文章

  1. yii2框架原生的结合框架使用的图片上传
  2. 华中农业大学苏汉东课题组诚聘博士后-
  3. 生成模型和判别模型的区别
  4. SQLServer基础:Apply关键字用法介绍
  5. JDK8 lambda的会话指南–术语表
  6. linux2.6内核Makefile详解
  7. html中两个图片叠放,CSS实现图片叠放(勾选图标)
  8. Android 小项目之--数据存储【Files】(附源码)
  9. 有望年底登场!小米12系列即将备案:骁龙895+2亿像素!
  10. thymeleaf中的条件判断用法
  11. linux7网卡启动的过程,linux网络启动
  12. 获取httpservletrequest所有参数的名称和值
  13. AD19---彻底解决原理图转PCB时,出现failed to add class member及Unknown Pin的问题
  14. 易鲸捷首架刘明:Trafodion值得放入工具箱,因为有以下优点
  15. cad2020打印样式放在哪个文件夹_打印机故障:打印一直出现乱码,什么原因?...
  16. HTML深海骑兵制作,深海迷航代码独眼巨人号护盾发生器 | 手游网游页游攻略大全...
  17. 穷查理宝典:查理·芒格智慧箴言录
  18. bat 脚本(批处理)操作注册表
  19. A股各概念板块龙头股大全
  20. linux网卡team0,team

热门文章

  1. linux启动tomcat报错The APR based Apache Tomcat Native library which allows optimal performance in ......
  2. 开源一个千万级多组Raft库 - Dragonboat
  3. php xml接口调用
  4. B站、抖音上那些4K、60帧视频是如何修复的?
  5. ubuntu中插入u盘可读不可写问题解决方法
  6. C语言实现二叉查找树的元素删除功能
  7. 鸿蒙系统研发投入多少,鸿蒙系统研发投入4000至5000人,已经在华为手机上测试完成...
  8. 计算机语言简约发展史
  9. CentOS 6.8 64bit 环境 初始化 MySQL 5.7.17成功示例(验证时间2017-01-08)
  10. 《计算机电路基础》平时作业,计算机电路基础1平时作业.doc