stm32串口发送接收数据(代码片段)

一只小阿大嗷 一只小阿大嗷     2022-12-06     491

关键词:

串口通信

在这里插入图片描述
我用的32是stm32f10x最小系统没有UART4和UART5
USART : 通用同步异步收发器
UART : 通用异步收发器
nRTS : 请求发送
nCTS : 请求接收
区别:USART指单片机的一个IO端口模块,可以根据需要配置成同步模式(SPI,IIC),也可以配置成异步模式(UART).可以理解为USART为SPI,IIC对等的”协议”。 UART则不是一个协议,为一个实体。

串口的结构体

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Fck : 串口的时钟(APB1 36M / APB2 72M )
USARTDIV : 无符号的定点数

115200= 72 * 1000000/16 * USARTDIV

如何配置串口的发送

1.配置时钟: GPIO口的时钟,串口的时钟, 引脚复用的时钟
2.配置GPIO的结构体
3.配置串口的结构体
4.串口的发送

在这里插入图片描述

通过串口向电脑发送ok字符

按照上面的四个步骤进行编写
我们会发现只能一个一个发送字符,比较麻烦,所以后面封装了一个可以发送字符串的函数。
usart.c

#include "usart.h"
#include "stm32f10x.h"

void usart_init(void)

	GPIO_InitTypeDef gpio_init;
	USART_InitTypeDef usartStruct;
	
	//1.ÅäÖÃʱÖÓ£ºGPIO¿ÚµÄʱÖÓ£¬Òý½Å¸´ÓõÄʱÖÓ£¬´®¿ÚµÄʱÖÓ
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	//2.ÅäÖÃGPIOµÄ½á¹¹Ìå
	//2.1 TX
	gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
	gpio_init.GPIO_Pin = GPIO_Pin_9;
	gpio_init.GPIO_Speed = GPIO_Speed_10MHz;
	
	GPIO_Init(GPIOA,&gpio_init);
	
	//2.2 RX
	gpio_init.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	gpio_init.GPIO_Pin = GPIO_Pin_10;
	
	GPIO_Init(GPIOA,&gpio_init);
	
	//3.ÅäÖô®¿ÚµÄ½á¹¹Ìå
	usartStruct.USART_BaudRate = 115200;
	usartStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	usartStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	usartStruct.USART_Parity = USART_Parity_No;
	usartStruct.USART_StopBits = USART_StopBits_1;
	usartStruct.USART_WordLength = USART_WordLength_8b;
	
	USART_Init(USART1,&usartStruct);
	USART_Cmd(USART1, ENABLE );
	


usart.h

#include "stm32f10x.h"

void usart_init(void);

main.c

#include "stm32f10x.h"
#include "led.h"
#include "relay.h"
#include "shake.h"
#include "exti.h"
#include "usart.h"

void delay(uint16_t time)

	uint16_t i =0;
	while(time--)
		i=12000;
		while(i--);
	


int main()

	Led_init();
	Relay_Init();
	Shake_init();
	exti_init();
	usart_init();
	
	while(1)
	
		USART_SendData(USART1,'n');
		//ÏÂÃæUSART_GetFlagStatusΪÁËÅжÏÊý¾Ý¼Ä´æÆ÷ÊÇ·ñΪ¿Õ
		while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
		USART_SendData(USART1,'t');
		while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
		USART_SendData(USART1,'\\n');
		while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
		delay(1000);
	



//这是中断函数,前面做震动感应灯用的,没删。
void EXTI1_IRQHandler(void)

	if (EXTI_GetITStatus( EXTI_Line1 ) != RESET)// ÅжÏÊÇ·ñ·¢ÉúÖжÏ
		GPIO_ResetBits(GPIOA, GPIO_Pin_3);
		delay(1000);
		GPIO_SetBits(GPIOA, GPIO_Pin_3);
	

	EXTI_ClearFlag(EXTI_Line1);
	


在这里插入图片描述

封装发送字符串函数

注意:在封装发送字符串函数时,while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);是为了把数据发送完
usart.c

#include "usart.h"
#include "stm32f10x.h"

void usart_init(void)

	GPIO_InitTypeDef gpio_init;
	USART_InitTypeDef usartStruct;
	
	//1.ÅäÖÃʱÖÓ£ºGPIO¿ÚµÄʱÖÓ£¬Òý½Å¸´ÓõÄʱÖÓ£¬´®¿ÚµÄʱÖÓ
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	//2.ÅäÖÃGPIOµÄ½á¹¹Ìå
	//2.1 TX
	gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
	gpio_init.GPIO_Pin = GPIO_Pin_9;
	gpio_init.GPIO_Speed = GPIO_Speed_10MHz;
	
	GPIO_Init(GPIOA,&gpio_init);
	
	//2.2 RX
	gpio_init.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	gpio_init.GPIO_Pin = GPIO_Pin_10;
	
	GPIO_Init(GPIOA,&gpio_init);
	
	//3.ÅäÖô®¿ÚµÄ½á¹¹Ìå
	usartStruct.USART_BaudRate = 115200;
	usartStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	usartStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	usartStruct.USART_Parity = USART_Parity_No;
	usartStruct.USART_StopBits = USART_StopBits_1;
	usartStruct.USART_WordLength = USART_WordLength_8b;
	
	USART_Init(USART1,&usartStruct);
	USART_Cmd(USART1, ENABLE );
	


//·â×°ÁËһϷ¢ËÍ×Ö·û
void usartSendByte(USART_TypeDef* USARTx, uint16_t Data)

	USART_SendData(USARTx,Data);
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);



//·¢ËÍ×Ö·û´®
void usartSendStr(USART_TypeDef* USARTx,char *str)

	uint16_t i = 0;
	do
		usartSendByte(USARTx,*(str+i));
		i++;
	while(*(str+i) != '\\0');

	//ÅжÏÊÇ·ñ·¢ËÍÍê
	while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);


usart.h

#include "stm32f10x.h"

void usart_init(void);
void usartSendByte(USART_TypeDef* USARTx, uint16_t Data);
void usartSendStr(USART_TypeDef* USARTx,char *str);

main.c

#include "stm32f10x.h"
#include "led.h"
#include "relay.h"
#include "shake.h"
#include "exti.h"
#include "usart.h"

void delay(uint16_t time)

	uint16_t i =0;
	while(time--)
		i=12000;
		while(i--);
	


int main()

	Led_init();
	Relay_Init();
	Shake_init();
	exti_init();
	usart_init();
	
	while(1)
	
		usartSendStr(USART1,"Finny\\r\\n");
		delay(1000);
	


//这是中断函数,前面做震动感应灯用的,没删。
void EXTI1_IRQHandler(void)

	if (EXTI_GetITStatus( EXTI_Line1 ) != RESET)// ÅжÏÊÇ·ñ·¢ÉúÖжÏ
		GPIO_ResetBits(GPIOA, GPIO_Pin_3);
		delay(1000);
		GPIO_SetBits(GPIOA, GPIO_Pin_3);
	

	EXTI_ClearFlag(EXTI_Line1);
	


在这里插入图片描述

stm32g070rbt6基于stm32cubemx创建串口中断接收数据(代码片段)

STM32G070RBT6基于STM32CubeMX创建串口中断接收数据📌相关篇《利用STM32CubeMX快速创建点灯带调试输出工程案例》📍《【硬件开源电路】STM32G070RBT6开发板》✨这里只演示串口接收中断。不包含配置串口发送以及重映射printf函数... 查看详情

stm32高效串口收发(代码片段)

文章目录串口通讯串口USART中断串口模式配置使用DMA进行连续通信使用DMA进行发送使用DMA进行接收编程接收流程主函数:中断处理函数:初始化(标准库)发送流程开启串口发送完成中断开启DMA发送完成中断DMA发... 查看详情

018_stm32程序移植之_串口接收中文(代码片段)

...数据:0xc4,0xe3,0xba,0xc3(四)我们的目的还是单片机通过串口来进行数据的接收,用CH340短接T和R看看发送“你好”也是会接 查看详情

stm32串口为啥只能接收发送的部分数据

程序BUG,或者接受缓冲的数组变量满了,不过基本上可以确定是程序问题参考技术A这个跟stm32没有关系,跟你的程序有关系。 查看详情

stm32发送数据给上位机用串口调试助手接收为什么只接收到第一个字节数据?

  最近刚好要做一个舵机的状态包反馈,用串口调试助手接收调试。然后发现中断接收数据后,将数据发送给上位机(调试助手)时只接收到了最后一个字节的数据,后来以为数据发送的太快了,然后在每个字节发送完都... 查看详情

stm32f103vet6基于stm32cubemx创建串口中断+dma不定长数据接收(代码片段)

STM32F103VET6基于STM32CubeMX创建串口中断+DMA不定长数据接收✨STM32CubeMX工程配置过程演示:📍此工程参考《STM32CubeMX|STM32使用HAL库DMA+空闲中断实现串口不定长数据接收》📓DMA参数介绍🎉DMA传输方式🌿传输... 查看详情

用stm32串口1发送0504011af10000040008在串口二只接收011af1000004其他的

用stm32串口1发送0504011AF10000040008在串口二只接收011AF1000004其他的都丢掉,该怎么弄,最好有程序,谢谢大神~接收的数据的顺序是不是不会变,如果顺序不变的话,那就当接收到第三个数据的时候开始存储参考技术A中断发送还是... 查看详情

stm32cubemxhal库串口+dma数据发送不定长度数据接收

参考资料:1、STHAL库官网资料         2、https://blog.csdn.net/u014470361/article/details/79206352#comments 一、STM32CubeMX配置外部时钟注意在进行外部时钟配置时,即“HighSpeedClock”和“LowS 查看详情

stm32串口发送数组cpu可以工作吗

参考技术A可以。STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷,用STM32F103的串口1,并配置成空闲中断模式且使能DMA接收,并同时设置接收缓冲区和初始化DMA。那么初始化完成之后,当外部给单片机发送数据的时候,假设这... 查看详情

stm32——dma接收和发送的实现

最近写程序,需要一段一段数据的接收,再通过其他串口发送出去。老司机们建议用DMA通信,以节约CPU资源。然后,我听了,发现挺好用的。特此,把自己写的代码贴上了。DMA发送接收的步骤如下:1.初始化。a.IO时钟+串口时钟+D... 查看详情

stm32f103(二十五)完美解决usart发送接收floatu16u32数据(代码片段)

...RT)STM32F103(二十四)一篇博客精通《485通信》USART发送、接收float、u16、u32数据前言一、注意事项二、代码讲解1、所有函数的合影2、三个基础函数3、思想(数据转换与发送࿰ 查看详情

基于stm32的串口收发讲解(标准库)(代码片段)

基于STM32的串口收发详解介绍USART中断串口状态实例需求分析串口初始化串口发送串口接收重定向printf和scanf效果后续介绍串口(UART通用异步收发器,TTL)通讯是一种设备间的串行全双工通讯方式。由于UART是异步传输&... 查看详情

65stm32f0系列串口dma循环接收实验记录(代码片段)

1.引言        最近因为中断冲突问题,导致串口接收数据时随机丢失一两个字节。无奈串口的中断优先级不能是最高的,所以中断冲突问题明显存在,因此需要串口使用DMA方式来接收数据,从而规避串口接收... 查看详情

stm32串口通讯程序

STM32F103ZET,我用USART3接收外部串口信号,通过USART2发送接收到的数据,再用USART1接收发出去的数据,问题是USART接收传回来的数据时接收中断始终触发不到,接收不到数据,示波器和PC机串口工具证实是有数据发出的,求高人指... 查看详情

stm32l151ll库串口发送丢数据解决办法(代码片段)

发送使用系统函数#definePUTCHAR_PROTOTYPEintfputc(intch,FILE*f) PUTCHAR_PROTOTYPE LL_USART_TransmitData8(USART1,ch);returnch;发送位置  数据丢的一塌糊涂在发送后加一行while((USART1->SR&0X40)==0);等待数据发送完一个字节后, 查看详情

stm32之模拟串口设计(代码片段)

...: 公司PCB制成板降成本,选择的MCU比项目需求少一个串口,为满足制成板成本和项目对串口需求,选择模拟一路串口。二、硬件电路:  三、设计实现:工具&软件:STM32F030R8   KEIL5   STM32CubeMX1... 查看详情

基于stm32的串口收发讲解(标准库)(代码片段)

基于STM32的串口收发详解介绍USART中断串口状态实例需求分析串口初始化串口发送串口接收重定向printf和scanf效果后续介绍串口(UART通用异步收发器,TTL)通讯是一种设备间的串行全双工通讯方式。由于UART是异步传输&... 查看详情

stm32|串口空闲中断接收不定长数据(dma方式)(代码片段)

...烩】,回复1024,即可免费获取!在使用STM32的串口接收数据的时候,我们常常会使用接收中断的方式来接收数据,常用的是RXNE。这里分享另一种接收数据的方式——IDLE中断(PS:本文的例子运行在STM32F... 查看详情