蓝桥杯物联网竞赛_STM32L071_5_串口接收发送数据

2023-11-29 02:44

本文主要是介绍蓝桥杯物联网竞赛_STM32L071_5_串口接收发送数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

理论:

串口采取异步通信,即不依赖时钟节拍来接收或发送数据,而是采用互相约定的波特率传输数据。

波特率与单位时间传输的比特数有关,波特率越大传输的数据越多
传输一个比特花费的时间T = 1 / 比特率

接受和发送数据的时候需要接受端和发送端:
在这里插入图片描述
UART传输数据是一位一位的向接收端传输,为了知道何时传输,又或者为了保证传输数据的完整正确性,规定了传输协议

在这里插入图片描述
分别为开始、数据、校验、停止,其中校验位可要可不要

传输样例:

在这里插入图片描述
停止位取二进制数0,数据位一般有8位刚好能装下一个字符,一般的停止位是1位取值为1,校验一般不要

开发板原理图:

在这里插入图片描述

可以出开发板有两组收发引脚,但其实真正有效的只有一组即PA2和PA3,下面详细说一下:

在这里插入图片描述
上述是开发板中控制下载调试器部分的芯片,其一般作用就是将程序或固件加载到微处理器或微控制器,朴素的讲调试器主要作用就是将电脑代码导入到开发板的芯片中
在这里插入图片描述

也就是说下载调试器能连接电脑STM32L071要想能与电脑上的串口小助手通信,那就必须TX,RX能与电脑相连,所以下载调试器中的芯片GD32F350C8T6上的PA9、PA10就必须先发送或者接收STM32L071传来的数据,其真正的作用是一个连接作用,即将STM32L071与电脑间接相连

而STM32L071的另外一组引脚没有与下载调试器相连所以也就没有作用

STM32L071的TX,RX与GD32F350C8T6引脚连接的部分:
在这里插入图片描述

而SET由开发板SELECT按键控制其高低电平,高低电平能使其接通1、4引脚或3、4引脚


CubMX配置:

在这里插入图片描述
Asynchronous: 异步通信


Keil配置:

Function.c和Function.h文件:

#include "Function.h"
#include "i2c.h"
#include "oled.h"
#include "usart.h"void OLED_Write(unsigned char type, unsigned char data){ // 写函数unsigned char Write_data[2];Write_data[0] = type;Write_data[1] = data;HAL_I2C_Master_Transmit(&hi2c3, 0x78, Write_data, 2, 0xff);
}void Function_OledEnable(unsigned char ms){ // Oled使能HAL_GPIO_WritePin(OLED_POWER_GPIO_Port, OLED_POWER_Pin, GPIO_PIN_RESET);HAL_Delay(ms);OLED_Init();
}void Function_SendInfromation(const char * data, uint16_t len){ // 发送信息HAL_UART_Transmit(&huart2, data, len, 0xff);
}void Function_ReceiveInfromation(char * data, uint16_t len){ // 接受信息HAL_UART_Receive(&huart2, data, len, 0xff);
}
#ifndef __FUNCTION__
#define __FUNCTION__
#include <stdint.h>void OLED_Write(unsigned char type, unsigned char data);
void Function_OledEnable(unsigned char ms);
void Function_ReceiveInfromation(char * data, uint16_t len);
void Function_SendInfromation(const char * data, uint16_t len);
#endif

main.c

#include "main.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"
#include "Function.h"
#include "oled.h"
#include <string.h>
void SystemClock_Config(void);int main(void)
{char a[] = {4, 5, 6};char flag = 1;char b[] = {0, 0, 0};HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_I2C3_Init();MX_USART2_UART_Init();Function_OledEnable(50);while (1){OLED_ShowString(0, 0, "i am wining", 16);if(flag <= 2){flag ++;HAL_Delay(5000);Function_SendInfromation(a, strlen(a));HAL_Delay(5000);}OLED_ShowString(0, 2, "Receive:", 16);Function_ReceiveInfromation(b, 3);if(b[0] == '@'){OLED_ShowString(64, 2, b, 16);b[0] = '1';			}}
}void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};/** Configure the main internal regulator output voltage*/__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);/** 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_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;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_PLLCLK;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_1) != HAL_OK){Error_Handler();}PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_I2C3;PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;PeriphClkInit.I2c3ClockSelection = RCC_I2C3CLKSOURCE_PCLK1;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != 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 */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

效果:

在这里插入图片描述

程序启动后等10s钟后发送数据:

在这里插入图片描述

拓展:

HAL_UART_TransmitHAL_UART_Receive,在传输与接收数据的时候,都会对做一些检查,例如指针数据长度是否有效,收发是否有效,如果不合格就会返回错误,如果合格就会进入忙碌状态即利用while函数一直对数据进行转发,或者收取。

在接受数据的时候,如果未能及时接收,那么后到的数据回应超时未接收报错,然后终止操作,这就是为什么在主函数有程序抢占cpu时不能即时接收数据,最后显示的数据只有一个字符。

这种情况可以用中断串口通信解决。

这篇关于蓝桥杯物联网竞赛_STM32L071_5_串口接收发送数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/431157

相关文章

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

SpringBoot接收JSON类型的参数方式

《SpringBoot接收JSON类型的参数方式》:本文主要介绍SpringBoot接收JSON类型的参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、jsON二、代码准备三、Apifox操作总结一、JSON在学习前端技术时,我们有讲到过JSON,而在

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

详解Spring Boot接收参数的19种方式

《详解SpringBoot接收参数的19种方式》SpringBoot提供了多种注解来接收不同类型的参数,本文给大家介绍SpringBoot接收参数的19种方式,感兴趣的朋友跟随小编一起看看吧... 目录SpringBoot接受参数相关@PathVariable注解@RequestHeader注解@Reque

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

SpringBoot中Get请求和POST请求接收参数示例详解

《SpringBoot中Get请求和POST请求接收参数示例详解》文章详细介绍了SpringBoot中Get请求和POST请求的参数接收方式,包括方法形参接收参数、实体类接收参数、HttpServle... 目录1、Get请求1.1 方法形参接收参数 这种方式一般适用参数比较少的情况,并且前后端参数名称必须

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

Android中如何实现adb向应用发送特定指令并接收返回

1 ADB发送命令给应用 1.1 发送自定义广播给系统或应用 adb shell am broadcast 是 Android Debug Bridge (ADB) 中用于向 Android 系统发送广播的命令。通过这个命令,开发者可以发送自定义广播给系统或应用,触发应用中的广播接收器(BroadcastReceiver)。广播机制是 Android 的一种组件通信方式,应用可以监听广播来执行