基于hal库的简单串口通信

基于hal库的简单串口通信

实验工具

stm32f103c8t6,usb to ttl,stm32cubemx

一.完成"hello windows!"的输出

1.配置stm32cubemx

(1)新建并选择对应芯片

(2)配置RCC

在这里插入图片描述


(3)配置SYS

在这里插入图片描述


(3)配置USART1

在这里插入图片描述


(4)配置clock configuriation

在这里插入图片描述


(5)完成基本工程设置

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


(6)创建工程

2.代码编写

找到main函数的while循环位置,添加以下代码:

 char data[]="hello windows!\t\n";
  	HAL_UART_Transmit(&huart1, (uint8_t *)data, 15, 0xffff);
  	HAL_Delay(1000);

3.运行调试

在这里插入图片描述

4.烧录

在这里插入图片描述

5.结果

在这里插入图片描述

6.观察波形

(1)debug设置

在这里插入图片描述


(2)setup设置

在这里插入图片描述


(3)波形图

在这里插入图片描述

二.完成串口的输出暂停于继续

1.配置stm32cubemx

(1)选择合适的芯片

(2)配置RCC

在这里插入图片描述


(3)配置SYS

在这里插入图片描述


(4)配置USART1

在这里插入图片描述


(5)配置NVIC

在这里插入图片描述


(6)配置clock configuriation

在这里插入图片描述


(7)完成基本项目配置

在这里插入图片描述


在这里插入图片描述

(8)创建项目

2.代码编写

(1)先定义全局变量来进行后面的使用,

char c;//指令 #:停止  *:开始
char message[]="hello windows!\n";//输出信息
char tips[]="CommandError\n";//提示1
char tips1[]="Start.....\n";//提示2
char tips2[]="Stop......\n";//提示3
int flag=0;//标志
(2)要完成对串口的输出中断必须在main.c中重写中断处理函数,
```c
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{	
	//当输入的指令为s时,发送提示并改变flag
	if(c=='#'){
		flag=0;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF); 
	}	
	//当输入的指令为t时,发送提示并改变flag
	else if(c=='*'){
		flag=1;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF); 
	}	
	//当输入不存在指令时,发送提示并改变flag
	else {
		flag=0;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF); 
	}
	//重新设置中断
		HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);  
}

(3)在mian函数的while循环前添加串口接收函数,

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

(4)最后再加入之前的串口输出代码但要加上if识别语句,

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

(5)完整代码,

#include "main.h"
#include "usart.h"
#include "gpio.h"
#include <string.h>
void SystemClock_Config(void);
char c;//指令 #:停止  *:开始
char message[]="hello windows!\n";//输出信息
char tips[]="CommandError\n";//提示1
char tips1[]="Start.....\n";//提示2
char tips2[]="Stop......\n";//提示3
int flag=0;//标志 
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时,发送提示并改变flag
	if(c=='#'){
		flag=0;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF); 
	}	
	//当输入的指令为t时,发送提示并改变flag
	else if(c=='*'){
		flag=1;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF); 
	}	
	//当输入不存在指令时,发送提示并改变flag
	else {
		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.运行调试

在这里插入图片描述

4.烧录

在这里插入图片描述

5.结果

(1)发送区输入*开始发送"hello windows!“

在这里插入图片描述


(2)发送区发送#停止发送"hello windows!”

在这里插入图片描述

三.总结

这次实验让我掌握了串口通信的具体方法,更深入的了解了串口中断函数的使用,但对这种方法还不够熟悉。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值