采用串口中断方式实现串口通信:停止/持续发送“hello windows!”
文章目录
- 一、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!”相关推荐
- 使用串口中断方式实现串口通信
文章目录 一. 实验环境 二.实验目标 三.串口中断方式特点 四.HAL配置串口通信 五.开发板引脚连接 六.程序代码 (1)接收单个字符控制串口发送 (2)接收多个字符控制串口发送 七.总结 一. ...
- 采用串口中断方式实现串口通信
文章目录 前言 一.中断介绍 1.中断方式 2.中断优先级 3.中断向量 二.利用STM32CubeMX配置项目 三.在keil配置代码 四.实际效果 五.总结 六.参考资料 前言 一.中断介绍 1. ...
- 串口中断方式与DMA方式通信
文章目录 一.串口中断介绍 1.串口发送/接收函数 2.串口中断函数 3.串口查询函数 二.中断方式串口通信 1.题目要求 2.工程建立 3.代码编写 4.烧录与结果演示 三.DMA介绍 1.DMA简 ...
- 【嵌入式系统开发13】采用串口中断方式完成单字符接受与字符串接受
本文目的是主要介绍通过STM32F103C8T6接收到字符"s"时,停止持续发送"hello windows!"; 当接收到字符"t"时,持 ...
- 使用51单片机采用中断方式进行串口通信的学习记录:
使用51单片机进行串口通信的学习记录之中断方式: 1.51单片机采用中断方式的串口通信过程及程序分析: 所谓中断方式,就是串口收/发标志位出发中断后,在中断中执行既定操作,可通过函数调用来实现. 接收 ...
- HAL库中断方式实现串口通信操作
文章目录 一.实验工具 二.CubeMX配置项目 1.引脚配置 2.RCC设置 3.SYS设置 4.USART设置 5.NVIC设置 6.创建项目 三.keil中配置代码 1.main函数前定义全局变 ...
- stm32中断方式的串口通信——上位机控制串口收发
文章目录 前言 一.什么是串口通信 二.什么是中断--STM32 1.中断的概念 2.STM32下NVIC的介绍 3.中断优先级的介绍 4.外部中断的介绍 三.串口通信keil工程文件 1.新建工程模 ...
- 【STM32】基于STM32F407中断方式实现串口通信
目录 一.中断介绍 二.中断方式实现串口通信 1. 新建工程 2. 工程设置 3.代码编写 4. 烧录验证 三.总结 四.参考 一.中断介绍 具体介绍参考文章: [STM32]基于STM32F407的 ...
- STM32之中断方式实现串口通信
中断方式实现串口通信 一.创建项目 二.编写代码 三.运行 四.总结 一.创建项目 创建一个STM32f103c8的STM32CubeMX项目: SYS设置: RCC设置: 时钟树设置,输入72后回车 ...
最新文章
- yii2框架原生的结合框架使用的图片上传
- 华中农业大学苏汉东课题组诚聘博士后-
- 生成模型和判别模型的区别
- SQLServer基础:Apply关键字用法介绍
- JDK8 lambda的会话指南–术语表
- linux2.6内核Makefile详解
- html中两个图片叠放,CSS实现图片叠放(勾选图标)
- Android 小项目之--数据存储【Files】(附源码)
- 有望年底登场!小米12系列即将备案:骁龙895+2亿像素!
- thymeleaf中的条件判断用法
- linux7网卡启动的过程,linux网络启动
- 获取httpservletrequest所有参数的名称和值
- AD19---彻底解决原理图转PCB时,出现failed to add class member及Unknown Pin的问题
- 易鲸捷首架刘明:Trafodion值得放入工具箱,因为有以下优点
- cad2020打印样式放在哪个文件夹_打印机故障:打印一直出现乱码,什么原因?...
- HTML深海骑兵制作,深海迷航代码独眼巨人号护盾发生器 | 手游网游页游攻略大全...
- 穷查理宝典:查理·芒格智慧箴言录
- bat 脚本(批处理)操作注册表
- A股各概念板块龙头股大全
- linux网卡team0,team
热门文章
- linux启动tomcat报错The APR based Apache Tomcat Native library which allows optimal performance in ......
- 开源一个千万级多组Raft库 - Dragonboat
- php xml接口调用
- B站、抖音上那些4K、60帧视频是如何修复的?
- ubuntu中插入u盘可读不可写问题解决方法
- C语言实现二叉查找树的元素删除功能
- 鸿蒙系统研发投入多少,鸿蒙系统研发投入4000至5000人,已经在华为手机上测试完成...
- 计算机语言简约发展史
- CentOS 6.8 64bit 环境 初始化 MySQL 5.7.17成功示例(验证时间2017-01-08)
- 《计算机电路基础》平时作业,计算机电路基础1平时作业.doc