stm32串口发送+接收

2023-05-16

本文章转自B站江科大自化协

一发送

接线图

 目标结构

Serial.c

 

#include "stm32f10x.h"  
#include <stdio.h>//1移植printf函数
//封装sprintf
#include <stdarg.h>

void Serial_Init(void)
{
	   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//开启USART1的时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIOA的时钟
	//初始化GPIOA的引角
    GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz ;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//初始化USART
	USART_InitTypeDef USART_InitStruture;
	//波特率的数值
	USART_InitStruture.USART_BaudRate=9600;
	//硬件流控制
	USART_InitStruture.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//不使用流控
	//串口模式
	USART_InitStruture.USART_Mode=USART_Mode_Tx;//发送模式
	//校验位
	USART_InitStruture.USART_Parity=USART_Parity_No;//不校验
	//停止位
	USART_InitStruture.USART_StopBits=USART_StopBits_1;//1位停止位
	//字长
	USART_InitStruture.USART_WordLength=USART_WordLength_8b;//8位
	USART_Init(USART1,&USART_InitStruture);
	
	USART_Cmd(USART1, ENABLE);
}
//写一个发送数据的函数
void Serial_SendByte(uint8_t Byte)
{
	//
	USART_SendData(USART1, Byte);
	//等待标志位
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);

}
//写一个发送数组的函数
void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
	uint16_t i;
	for (i=0;i<Length;i++)
	{
			Serial_SendByte(Array[i]);
	}
	
}
//写一个SendString函数
void Serial_SendString(char *String)
{
			uint8_t i;
	        for(i=0; String[i] != '\0'; i++)
	   {
	   Serial_SendByte(String[i]);
	   
	   }
		
}
//写一个次方函数
uint32_t Serial_Pow(uint32_t X,uint32_t Y)
{
	uint32_t Result=1;
	while( Y --)
	{
			Result *=X;
	}
	return Result;
}
//写一个SendNum函数
void Serial_SendNumber(uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for(i = 0; i<Length; i++)
	{
			   Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) %10 + '0');
	}

}
//2移植printf函数
//重写fputc函数
int fputc (int ch, FILE *f)
{
	//把fputc函数重定向到串口
	Serial_SendByte(ch);
	return ch;
}
//封装    sprintf
void Serial_Printf(char *format, ...)
{
		char String[100];
	//定义一个参数列表量
	va_list arg;
	//从format位置开始接收参数表,放到arg里面
	va_start(arg,format);
	vsprintf(String, format, arg);
	//释放参数表
	va_end(arg);
	//把String发送出去
	Serial_SendString(String);
	
}

 Serial.h

#ifndef __SERIAL_H
#define __SERIAL_H
#include <stdio.h>
void Serial_Init(void);
void Serial_SendByte(uint8_t Byte);
void Serial_SendArray(uint8_t *Array,uint16_t Length);
void Serial_SendString(char *String);
void Serial_SendNumber(uint32_t Number, uint8_t Length);
void Serial_Printf(char *format, ...);
#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"

int main(void)
{
	 OLED_Init();
     Serial_Init();
    //	 Serial_SendByte('A');   
    //     uint8_t MyArray[] = {0x42,0x43,0x44,0x45};
    //	 Serial_SendArray(MyArray,4);
	 Serial_SendString("\r\nNum1=");
	Serial_SendNumber(123,3);
    printf("\r\nNum2=%d",666);//方法1
	//方法二使用sprintf
	char String[100];
    sprintf(String,"\r\nNum3=%d",888);
	Serial_SendString(String);
//	使用封装好的
	Serial_Printf("\r\nNum4 =%d",44444);
	Serial_Printf("\r\n");
	while (1)
	{
		
	}
}

下载测试

 

 二接收

Serial.c

#include "stm32f10x.h"  
#include <stdio.h>//1移植printf函数
//封装sprintf
#include <stdarg.h>

uint8_t Serial_RxData;
uint8_t Serial_RxFlag;

void Serial_Init(void)
{
	   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//开启USART1的时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIOA的时钟
	//初始化GPIOA的引角 发送
    GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz ;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//接收
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   //上接输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz ;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//初始化USART
	USART_InitTypeDef USART_InitStruture;
	//波特率的数值
	USART_InitStruture.USART_BaudRate=9600;
	//硬件流控制
	USART_InitStruture.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//不使用流控
	//串口模式
	USART_InitStruture.USART_Mode=USART_Mode_Tx | USART_Mode_Rx;//发送模式或接收模式
	//校验位
	USART_InitStruture.USART_Parity=USART_Parity_No;//不校验
	//停止位
	USART_InitStruture.USART_StopBits=USART_StopBits_1;//1位停止位
	//字长
	USART_InitStruture.USART_WordLength=USART_WordLength_8b;//8位
	USART_Init(USART1,&USART_InitStruture);
	
	
	//开启中断
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启RXNE标志位到NVIC的输出
	//配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	//初始化NVIC的USART1通道
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;//中断通道
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStructure);
	
	
	
	USART_Cmd(USART1, ENABLE);
	
}



//写一个发送数据的函数
void Serial_SendByte(uint8_t Byte)
{
	//
	USART_SendData(USART1, Byte);
	//等待标志位
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);

}
//写一个发送数组的函数
void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
	uint16_t i;
	for (i=0;i<Length;i++)
	{
			Serial_SendByte(Array[i]);
	}
	
}
//写一个SendString函数
void Serial_SendString(char *String)
{
			uint8_t i;
	        for(i=0; String[i] != '\0'; i++)
	   {
	   Serial_SendByte(String[i]);
	   
	   }
		
}
//写一个次方函数
uint32_t Serial_Pow(uint32_t X,uint32_t Y)
{
	uint32_t Result=1;
	while( Y --)
	{
			Result *=X;
	}
	return Result;
}
//写一个SendNum函数
void Serial_SendNumber(uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for(i = 0; i<Length; i++)
	{
			   Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) %10 + '0');
	}

}
//2移植printf函数
//重写fputc函数
int fputc (int ch, FILE *f)
{
	//把fputc函数重定向到串口
	Serial_SendByte(ch);
	return ch;
}
//封装    sprintf
void Serial_Printf(char *format, ...)
{
		char String[100];
	//定义一个参数列表量
	va_list arg;
	//从format位置开始接收参数表,放到arg里面
	va_start(arg,format);
	vsprintf(String, format, arg);
	//释放参数表
	va_end(arg);
	//把String发送出去
	Serial_SendString(String);
	
}
//接收和变量的封装
uint8_t Serial_GetRxFlag(void)
{

	if(Serial_RxFlag == 1)
	{
	  Serial_RxFlag = 0;
		return 1;
	}
    return 0 ;
}
uint8_t Serial_GetRxData(void)
	
{
	return Serial_RxData;

}
void USART1_IRQHandler(void)
	
{
	if(USART_GetITStatus(USART1, USART_IT_RXNE)== SET)
	{
		Serial_RxData = USART_ReceiveData(USART1);
		Serial_RxFlag = 1;
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);
	
	}
 
}

serial.h

#ifndef __SERIAL_H
#define __SERIAL_H
#include <stdio.h>
void Serial_Init(void);
void Serial_SendByte(uint8_t Byte);
void Serial_SendArray(uint8_t *Array,uint16_t Length);
void Serial_SendString(char *String);
void Serial_SendNumber(uint32_t Number, uint8_t Length);
void Serial_Printf(char *format, ...);

uint8_t Serial_GetRxData(void);
uint8_t Serial_GetRxFlag(void);

#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"

uint8_t RxData;

int main(void)
{
	 OLED_Init();
     Serial_Init();
	OLED_ShowString(1,1,"RxData:");
    
	while (1)
	{
		if(Serial_GetRxFlag()==1)
		{
				RxData = Serial_GetRxData();
			    Serial_SendByte(RxData);
			    OLED_ShowHexNum(1,8,RxData,2);
			    
		}
	}
}

下载编译 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32串口发送+接收 的相关文章

  • c语言和c++实现层序遍历

    层序遍历是一种二叉树的遍历方式 xff0c 也称为广度优先遍历 xff0c 它的遍历顺序是 xff1a 从上到下 xff0c 从左到右 xff0c 一层一层地遍历整棵树 在 C 语言中 xff0c 我们可以使用队列来实现层序遍历 具体实现步

随机推荐

  • C语言获取wifi状态

    mark https blog csdn net dongyoubin article details 122134198 int getWirelessStatus char ath char ssid char ipAddr
  • 最全Visual Studio版本号对应表VisualStudioVersion

    名字 版本号 简称 全称 msvc70 VC7 0 VS2002 Microsoft Visual Studio 2002 msvc71 VC7 1 VS2003 Microsoft Visual Studio 2003 msvc80 VC
  • 二叉树静态实现的示例代码

    使用指针对于初学者容易出现很多困惑 下面是一个完整的二叉树静态实现的示例代码 xff0c 包括初始化 插入节点 各种遍历方法以及一些辅助函数 include lt stdio h gt include lt stdlib h gt defi
  • 广度优先搜索(BFS)算法实现二叉树层序遍历的 C++ 代码

    include lt iostream gt 输入输出流 include lt vector gt 向量容器 include lt queue gt 队列容器 using namespace std 命名空间 定义二叉树节点结构体 stru
  • PAT 1005 Spell It Right

    Given a non negative integer N your task is to compute the sum of all the digits of N and output every digit of the sum
  • 在PC的Ubuntu虚拟机上完成一个TCP 服务器,在设备上实现一个TCP客户端

    要求 在虚拟机上实现一个服务器 xff0c 设备终端上实现一个客户端设备客户端每隔 1 秒 检测一次网卡eth2 1 xff08 WAN口网卡 xff09 的信息 xff08 使用popen调用ifconfig xff09 然后将RX和TX
  • TCP发送数据、接受数据及TCP通信程序练习

    目录 一 TCP发送数据 二 TCP接收数据 三 TCP通信程序练习 一 TCP发送数据 Java中的TCP通信 xff1a Java对于基于TCP协议的网络提供了良好的封装 xff0c 使用Socket对象来代表两端的通信端口 xff0c
  • slam学习笔记

    ubuntu20 04 使用vs code编写 现放cmake文件 xff08 记得链接库文件和配置C 43 43 版本 xff09 cmake minimum required VERSION 2 8 project learingMat
  • SLAM学习笔记

    编译环境ubuntu20 04 vs code xff08 李群 李代数 xff09 先是CMakeLists txt cmake minimum required VERSION 3 0 project learning sophus s
  • SLAM学习笔记

    编译环境ubuntu20 04 xff0c vs code 先cmake文件 cmake minimum required VERSION 2 8 project image set CMAKE BUILD TYPE 34 Release
  • SLAM学习笔记

    编译环境ubuntu20 04 vscode ceres库2 0 0 g2o库同gaoxiang12 slambook2中的版本号一致 cmake文件 cmake minimum required VERSION 2 8 project c
  • 数据结构之C语言单链表操作

    实验目的 xff1a 1 xff0e 创建一个带头结点的单链表 2 xff0e 插入元素操作 xff1a 将新元素x插入到单链表head的头部 将新元素x插入到单链表head的尾部 将新元素x插入到单链表head中第i个元素之后 3 xff
  • DBUS入门与C编程

    https blog csdn net weixin 45566765 article details 125028296 一 D Bus简介 1 D Bus是什么 D Bus最主要的用途是在 Linux 桌面环境为进程提供通信 xff0c
  • 模拟IIC——关于模拟IIC的IO口的配置选取推挽输出还是开漏输出,以及是否需要更改IO口输入输出模式和是否需要对IO配置上拉

    在使用模拟IIC的时候 xff0c 观看别人的程序的时候发现了程序之间的一些不一样的地方 代码1 IO方向设置 define SDA IN GPIOB gt MODER amp 61 3 lt lt 9 2 GPIOB gt MODER 6
  • C语言——链表

    C语言 链表 链表是一种基础的数据结构类型 xff0c 一种能够动态维护数据的线性数据表 链表的数据以结点形式存储信息 xff0c 并通过结点之间的指针实现结点之间的衔接 为什么要用链表 xff1f 链表和数组类似 xff0c 但是功能比数
  • 学习记录 | ZigBee协议栈工作流程

    第一次来CSDN记录一下学习过程 xff0c 其实就是笔记啦 之前用Typora 的 但前几天电脑出问题重装系统后打开笔记文件发现照片都打不开了 xff0c 索性想换一种记笔记方式 好啦 以下是正文 xff01 xff01 xff01 对了
  • 学习记录 | ZigBee协议栈实践——串口收发数据

    上次的理论知识学的有点杂乱 今天来跟着例程实践看一看 目录 一 ZigBee协议栈的安装 编译和下载 二 协议栈工作流程 三 串口通信主要代码 1 串口打印 2 串口打印收到的数据 四 实现 五 总结 一 ZigBee协议栈的安装 编译和下
  • 第一次画异形板后的总结感悟

    目录 画原理图前的准备 画PCB的一些好方法 蜂鸣器电路 供电电路 其他电路 杂七杂八的随记要点 总结 像这样的异形板是通过solidworks扫描实物生成的 画原理图前的准备 当然是选购元器件 一般习惯在嘉立创进行选购 选择符合要求 有库
  • 自学物联网ESP第一天

    先简单的使用串口通信AT指令 刚开始不知道用什么开发好 在博客找了很久本来打算用 eclipse 不过突然发现可以用Arduino 不过下载真的好慢 于是开始看一下函数准备一下 一 基本函数 1 setup 函数 Arduino控制器通电或
  • stm32串口发送+接收

    本文章转自B站江科大自化协 一发送 接线图 目标结构 Serial c include 34 stm32f10x h 34 include lt stdio h gt 1移植printf函数 封装sprintf include lt std