stm32串口发送字符、字符串(标准库)

这篇具有很好参考价值的文章主要介绍了stm32串口发送字符、字符串(标准库)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一 芯片概述 

二 代码编写

2.1 以串口2为例配置初始化代码

2.2 发送自定义长度的字符串

2.3 发送单个字符

2.4 自定义printf函数

三 完整代码

3.1 usart2.c

3.2 usart2.h

3.3 while(1)


一 芯片概述 

本文以stm32f103c8t6系列芯片为例,使用自定义函数发送串口数据。

二 代码编写

2.1 以串口2为例配置初始化代码

PA2为TX引脚,PA3为RX引脚

void usart2_init(u32 bound)
	{
	//GPIO端口设置
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//使能USART2,GPIOA时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
	//USART2_TX   GPIOA.2
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2

	//USART2_RX	  GPIOA.3初始化
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3  

	//Usart2 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器

	//USART 初始化设置

	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式

	USART_Init(USART2, &USART_InitStructure); //初始化串口2
	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
	USART_ITConfig(USART2,USART_IT_IDLE,ENABLE);
	USART_Cmd(USART2, ENABLE);                    //使能串口2
	
}

2.2 发送自定义长度的字符串

第一个变量是发送的数据,第二个变量为发送的数据的长度

void usart2_send(unsigned char *data,unsigned char len)
{
		unsigned char t;
		for(t=0;t<len;t++)
        {	
		    while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
            USART_SendData(USART2,data[t]); 				
        }
}

例:

usart2_send((uint8_t*)"xiaoliCL\r\n",12);

使用效果:

一直发送字符串“xiaoliCL\r\n”

stm串口通信如何如何传输字符串,stm32,单片机,嵌入式硬件

2.3 发送单个字符

void usart2_SendByte(char dat)
{
	USART_SendData(USART2, (unsigned char) dat);
	while (!(USART2->SR & USART_FLAG_TXE));
}

例:

usart2_SendByte('a');

使用效果:

一直发送字符 'a'

stm串口通信如何如何传输字符串,stm32,单片机,嵌入式硬件

2.4 自定义printf函数

#define USART2_MAX_RECV_LEN		600					//最大接收缓存字节数 
u8 USART2_RX_BUF[USART2_MAX_RECV_LEN];
void u2_printf(char* fmt,...)  
{  
	u16 i,j;
	va_list ap;
	va_start(ap,fmt);
	vsprintf((char*)USART2_TX_BUF,fmt,ap);
	va_end(ap);
	i=strlen((const char*)USART2_TX_BUF);//此次发送数据的长度
	for(j=0;j<i;j++)//循环发送数据
	{
	  while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);  //等待上次传输完成 
	  USART_SendData(USART2,(uint8_t)USART2_TX_BUF[j]); 	 //发送数据到串口2
	}	
}

使用方法和printf一样,例:

u2_printf("xiaoliCL2\r\n");

使用效果:

stm串口通信如何如何传输字符串,stm32,单片机,嵌入式硬件

三 完整代码

3.1 usart2.c

#include "sys.h"
#include "usart2.h"	
#include "delay.h"
#include "stdarg.h"	 	 
#include "stdio.h"	 	 
#include "string.h"	 
#include "user_peripheral.h"	

#if USART2_Pre

u8  Uart2Buff;
u8  USART2_TX_BUF[USART2_MAX_SEND_LEN]; 			//发送缓冲,最大USART2_MAX_SEND_LEN字节


void usart2_init(u32 bound)
	{
	//GPIO端口设置
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//使能USART2,GPIOA时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
	//USART2_TX   GPIOA.2
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2

	//USART2_RX	  GPIOA.3初始化
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3  

	//Usart2 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器

	//USART 初始化设置

	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式

	USART_Init(USART2, &USART_InitStructure); //初始化串口2
	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
	USART_ITConfig(USART2,USART_IT_IDLE,ENABLE);
	USART_Cmd(USART2, ENABLE);                    //使能串口2
	
}
 
void usart2_send(unsigned char *data,unsigned char len)
{
		unsigned char t;
		for(t=0;t<len;t++)
        {	
						 while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
            USART_SendData(USART2,data[t]); 				
        }
}
 
void usart2_SendByte(char dat)
{
	USART_SendData(USART2, (unsigned char) dat);
	while (!(USART2->SR & USART_FLAG_TXE));
}

void USART2_IRQHandler(void)                	//串口2中断服务程序
	{
		 
	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
		{
		Uart2Buff=USART_ReceiveData(USART2);	//读取接收
		 
		}
 	  		 
} 
	
#define USART2_MAX_RECV_LEN		600					//最大接收缓存字节数 
u8 USART2_RX_BUF[USART2_MAX_RECV_LEN];
void u2_printf(char* fmt,...)  
{  
	u16 i,j;
	va_list ap;
	va_start(ap,fmt);
	vsprintf((char*)USART2_TX_BUF,fmt,ap);
	va_end(ap);
	i=strlen((const char*)USART2_TX_BUF);//此次发送数据的长度
	for(j=0;j<i;j++)//循环发送数据
	{
	  while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);  //等待上次传输完成 
		USART_SendData(USART2,(uint8_t)USART2_TX_BUF[j]); 	 //发送数据到串口2
	}	
}


#endif

 

3.2 usart2.h

#ifndef __USART2_H
#define __USART2_H
#include "sys.h" 


#define USART2_MAX_SEND_LEN		600					//最大发送缓存字节数
void usart2_send(unsigned char *data,unsigned char len);
void usart2_init(u32 bound);				//串口2初始化 
void u2_printf(char* fmt,...);
void usart2_SendByte(char dat);
#endif

3.3 while(1)

串口发送:文章来源地址https://www.toymoban.com/news/detail-852424.html

 	while(1)
	{ 
//		usart2_send((uint8_t*)"xiaoliCL\r\n",12);
//		u2_printf("xiaoliCL2\r\n");
//	    usart2_SendByte('a');
		delay_ms(1000);
	}	

到了这里,关于stm32串口发送字符、字符串(标准库)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA零基础学习之旅#14】串口发送字符串

    🎉欢迎来到FPGA专栏~串口发送字符串 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 🥝 发送Hello: 🥝 发送数字字符并自

    2024年02月08日
    浏览(44)
  • FPGA初步学习之串口发送模块【单字节和字符串的发送】

    UART 在发送或接收过程中的一帧数据由4部分组成,起始位、数据位、奇偶校验位和停止位,如图所示。其中,起始位标志着一帧数据的开始,停止位标志着一帧数据的结束,数据位是一帧数据中的有效数据。 通常用的串口数据帧格式是:8位数据位,无校验位,1位停止位。

    2024年02月14日
    浏览(45)
  • CC2530基础实验:(6)串口通讯-发送与接收字符串

    目录 前言 一、实验相关电路图 二、实验相关理论与寄存器 1.并行通信与串行通信 2.URAT 3.同步通信与异步通信 4.外设I/O 5.CC2530 的串口通信模块 6.相关寄存器 三、源码分析 1.发送字符串  2.接收字符串 本实验用于学习CC2530芯片: 发送与接收字符串的串口配置与使用 观察串口

    2023年04月14日
    浏览(80)
  • 51单片机UART串口通信实现接收PC的字符串

            基本思路是触发串口接收中断之后,在串口中断服务函数中处理接收到的字节并将其连接成字符串存入全局变量中。 隐含的额外工作有: 1.区分是发送中断还是接收中断,两者都会进入同一个中断服务子函数; 2.判断已接收到了句末,暂停接收,并通过标志位告知

    2023年04月20日
    浏览(96)
  • STM32标准库开发——串口发送/单字节接收

    串口发送信息 启动串口一的时钟 初始化对应串口一的时钟,引脚,将TX引脚设置为复用推挽输出。 配置串口一配置寄存器,设置波特率为9600,关闭硬件流控,不使用校验位,数据长度为八字节 封装串口发送字节函数 封装串口发送字符串函数 封装串口发送数组函数 封装串口

    2024年01月23日
    浏览(50)
  • STM32-串口通信(串口的接收和发送)

    本文在于记录自己的学习过程中遇到的问题和总结,各种情况下串口通信在STM32的实际使用方面占有很大的比重,本文主要对 串口通信 做一个简要的总结。 在STM32里,串口通信是USART,STM32可以通过串口和其他设备进行传输 并行数据 ,是 全双工 , 异步时钟控制 ,设备之间是

    2024年02月03日
    浏览(76)
  • STM32串口通信—串口的接收和发送详解

    目录 前言: STM32串口通信基础知识: 1,STM32里的串口通信 2,串口的发送和接收 串口发送: 串口接收: 串口在STM32中的配置: 1. RCC开启USART、串口TX/RX所对应的GPIO口 2. 初始化GPIO口 3. 串口初始化 4. 串口使能 5. 串口发送数据 串口接收的两种实现方式: 1,轮询方式: 2,中断

    2024年04月08日
    浏览(111)
  • # STM32中断方式实现串口通信(标准库)

    主要任务 : 1)当stm32接收到字符“s”时, 停止持续发送 “hello windows!”; 当接收到字符“t”时, 持续发送 “hello windows!”; 2)当stm32接收到字符“stop stm32!”时,停止持续发送“hello windows!”; 当接收到字符“go stm32!”时,持续发送“hello windows!” 实验工具: (1)软件 标

    2024年02月11日
    浏览(34)
  • STM32串口映射printf——发送中文字符乱码

    简介         在将之前的工程使用Notepad++修改代码后,加载到现有工程中,使用串口打印输出测试串口功能,发现输出的中文字符全为乱码。对照keil设置,确保与之前工程中设置一样,莫名的就是不能输出中文字符。 解决过程         此处串口已输出为乱码,说明移植过来

    2024年02月12日
    浏览(52)
  • STM32+OLED屏显示字符串、汉字、图片(二)

    上一节初始化了OLED屏,使得它完成了清屏,现在驱动它在屏幕上打印字符串、汉字以及图片。         1.1   STM32+OLED屏初始化(一)          1.2  STM32+OLED屏显示字符串、汉字、图片(二)         1.3  STM32+OLED屏多级菜单显示(三)         1.4  STM32+OLED屏(软

    2024年01月22日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包