STM32串口发送接收数据
目录
- 1.串口通信
- 2.串口的结构体
- 3.如何配置串口的发送
- 4.通过串口向电脑发送ok字符
- 5.封装发送字符串函数
- 6.重定向printf串口发送
- 7.串口输入控制LED灯开关
- 遇到的问题
1.串口通信
我用的32是stm32f10x最小系统没有UART4和UART5
USART : 通用同步异步收发器
UART : 通用异步收发器
nRTS : 请求发送
nCTS : 请求接收
区别:USART指单片机的一个IO端口模块,可以根据需要配置成同步模式(SPI,IIC),也可以配置成异步模式(UART).可以理解为USART为SPI,IIC对等的”协议”。 UART则不是一个协议,为一个实体。
2.串口的结构体
Fck : 串口的时钟(APB1 36M / APB2 72M )
USARTDIV : 无符号的定点数
115200= 72 * 1000000/16 * USARTDIV
3.如何配置串口的发送
1.配置时钟: GPIO口的时钟,串口的时钟, 引脚复用的时钟
2.配置GPIO的结构体
3.配置串口的结构体
4.串口的发送
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 TXgpio_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 RXgpio_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()
{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);}}
5.封装发送字符串函数
注意:在封装发送字符串函数时,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 TXgpio_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 RXgpio_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()
{usart_init();while(1){usartSendStr(USART1,"Finny\r\n");delay(1000);}}
6.重定向printf串口发送
要使用printf,我们需要添加#include <stdio.h>头文件(学过c的都应该知道吧)
记得要给下图框住的内容打勾哦
stdio.h文件中有一个宏定义fputc,我们需要使用printf只需要重定向fputc就可以使用啦
usart.h
#include "stm32f10x.h"
#include <stdio.h>void usart_init(void);
void usartSendByte(USART_TypeDef* USARTx, uint16_t Data);
void usartSendStr(USART_TypeDef* USARTx,char *str);
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 TXgpio_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 RXgpio_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(USARTx, 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(USARTx, USART_FLAG_TC) == RESET);
}int fputc(int ch,FILE *f)
{USART_SendData(USART1,(uint8_t)ch);while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);return (ch);
}
main.c
#include "stm32f10x.h"
#include "led.h"
#include "relay.h"
#include "shake.h"
#include "exti.h"
#include "usart.h"
#include "stdio.h"void delay(uint16_t time)
{uint16_t i =0;while(time--){i=12000;while(i--);}
}int main()
{usart_init();GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_SetBits(GPIOC, GPIO_Pin_13);while(1){// usartSendStr(USART1,"°ÂÀï¸ø\r\n");int i = printf("Finny\r\n");printf("%d\r\n",i);
// putchar('2');delay(1000);}
}
图下为什么i不是5而是7呢,因为\r\n各占了1
重定向fputc不只可以使用printf还可以使用putchar,大伙可以试试呀
7.串口输入控制LED灯开关
输入o让led灯打开并输出Open LED light success,输入c让led灯关闭并输出Close LED light success
提示: main.c中会看见有外部中断的代码,这是之前做震动感应灯的点此进入 STM32 EXTI(外部中断)
led.h
#include "stm32f10x.h"
void Led_init(void);
led.c
#include "stm32f10x.h"
#include "led.h"void Led_init(void)
{GPIO_InitTypeDef Led_init;//1.ʹÄÜAPB2µÄʱÖÓGPIORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//2.½á¹¹ÌåÅäÖÃLed_init.GPIO_Mode = GPIO_Mode_Out_PP;Led_init.GPIO_Pin = GPIO_Pin_13;Led_init.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOC, &Led_init);
}
usart.h
#include "stm32f10x.h"
#include <stdio.h>void usart_init(void);
void usartSendByte(USART_TypeDef* USARTx, uint16_t Data);
void usartSendStr(USART_TypeDef* USARTx,char *str);
usart.c
#include "usart.h"
#include "stm32f10x.h"void usart_init(void)
{GPIO_InitTypeDef gpio_init;USART_InitTypeDef usartStruct;NVIC_InitTypeDef nvic_initStruct;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//1.ÅäÖÃʱÖÓ£ºGPIO¿ÚµÄʱÖÓ£¬Òý½Å¸´ÓõÄʱÖÓ£¬´®¿ÚµÄʱÖÓRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//2.ÅäÖÃGPIOµÄ½á¹¹Ìå//2.1 TXgpio_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 RXgpio_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_ITConfig(USART1,USART_IT_RXNE,ENABLE);//ÅäÖô®¿ÚÖжÏUSART_Cmd(USART1, ENABLE );nvic_initStruct.NVIC_IRQChannel = USART1_IRQn;nvic_initStruct.NVIC_IRQChannelPreemptionPriority = 1;nvic_initStruct.NVIC_IRQChannelSubPriority = 1;nvic_initStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&nvic_initStruct);}//·â×°ÁËһϷ¢ËÍ×Ö·û
void usartSendByte(USART_TypeDef* USARTx, uint16_t Data)
{USART_SendData(USARTx,Data);while(USART_GetFlagStatus(USARTx, 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(USARTx, USART_FLAG_TC) == RESET);
}int fputc(int ch,FILE *f)
{USART_SendData(USART1,(uint8_t)ch);while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);return (ch);
}int fgetc(FILE *f)
{while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);return (int) USART_ReceiveData(USART1);
}
main.c
#include "stm32f10x.h"
#include "led.h"
#include "relay.h"
#include "shake.h"
#include "exti.h"
#include "usart.h"
#include "stdio.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();//³õʼ»¯Òý½ÅGPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_SetBits(GPIOC, GPIO_Pin_13);}void EXTI1_IRQHandler(void)
{if (EXTI_GetITStatus( EXTI_Line1 ) != RESET){// ÅжÏÊÇ·ñ·¢ÉúÖжÏGPIO_ResetBits(GPIOA, GPIO_Pin_3);usartSendStr(USART1,"Open light success\r\n");delay(1000);GPIO_SetBits(GPIOA, GPIO_Pin_3);usartSendStr(USART1,"Close light success\r\n");}EXTI_ClearFlag(EXTI_Line1);}void USART1_IRQHandler(void)
{char temp;if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET){temp = USART_ReceiveData(USART1);if(temp == 'o'){GPIO_ResetBits(GPIOC, GPIO_Pin_13);usartSendStr(USART1,"Open LED light success\r\n");}if(temp == 'c'){GPIO_SetBits(GPIOC, GPIO_Pin_13);usartSendStr(USART1,"Close LED light success\r\n");}}
}
遇到的问题
评论区中小鲸鱼uu私信我了一个问题,就是他串口输出乱码
为什么senddata不能发送int的数字,因为将数字转换成ASCII码输出了,至于ASCII码表百度一下吧
STM32串口发送接收数据相关推荐
- STM32串口实时接收数据与所提前定义的比较,并作出相应的操作
STM32串口实时接收数据与所提前定义的比较,并作出相应的操作 //typedef const uint16_t uc16; /*!< Read Only */uc16 BUF[10]={162 ...
- C#利用SerialPort类对串口发送接收数据
1.连接串口方法 SerialPort ser = new SerialPort();//也可以在工具箱中直接拖SerialPort控件 public void OpenCom() {try{//波特 ...
- c# 串口发送接收数据
/********************** 串口数据接收事件 *****************************/private void SerialPort_DataReceived( ...
- 51单片机模拟串口发送接收数据(不使用SBUF)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 51单片机.模拟串口.串口发送.串口接收.逻辑分析仪 前言 一.配置定时器 二.串口发送 三.串口接收 四.主函数 五.波形图 5.1 ...
- STM32 串口DMA接收 Openmv / K210 整数、小数字符串数据 (基于HAL库)
目录 前言 一.工程配置 二.串口DMA部分代码 1.源文件UART_DMA.c 2.头文件UART_DMA.h 3.stm32f1xx_it.c的修改 4.串口收发DMA测试 三.字符串数字提取代码 ...
- STM32—USART串口发送+接收
STM32-USART串口发送+接收 本文来自于<STM32--江科大>的笔记整理. 文章目录 STM32-USART串口发送+接收 10.3 串口发送 串口调试助手 10.3.1 数据模 ...
- 向STM32串口发送数据的标准函数
向STM32串口发送数据的标准函数 例子:1 void UART_Send_Message(u8 *Data,u8 lenth) {while(lenth--){USART_SendData(USAR ...
- 求android 中串口的发送接收数据代码
RT,求高手帮忙! 就是 /dev/ttyS0 和/dev/ttyS1 两个设备的通信问题.. 同求~ 这个是不是需要串口驱动啊?最近正在搞这个串口通信的案子,头疼 同样也没有搞出来,老是报:不能扫描 ...
- C语言程序周期接收虚拟串口发送的数据
背景 我之前的一篇博客讲解了怎么使用虚拟串口和串口调试助手:虚拟串口模拟器和串口调试助手使用教程,这次我们在此基础上继续来使用虚拟串口周期发送和接收功能. 我们知道,在Windows的操作系统上,将串 ...
最新文章
- 滴滴海外市业务面试经历
- 字符流Reader对象创建子类及方法
- Oracle-awrddrpt.sql比较两个AWR差异报告
- MSSQL 从备份文件还原数据库脚本
- 面试官本拿求素数搞我,但被我优雅的“回击“了(素数筛)
- linux下redis权限,Linux(Centos)下Redis开机自启设置
- Pandas实用技能,数据筛选query函数详细介绍
- 责任链模式 和观察者模式
- python关闭对象语法_Python基础及语法(七)
- html文本格式化意思,HTML文本格式化标签(Formatting)
- JavaScript 工具库:Cloudgamer JavaScript Library v0.1 发布
- UE4 中文文档阅读
- worldwind java 教程_科学网—用worldwind java SDK开发应用程序 - 谢安涛的博文
- erp的术语-jde系统
- ios11对比android8.0,谁的设计更好?iOS11正式版多图详尽对比安卓8.0
- Amazon 中国区配置 PingIdentity 身份集成实现 Redshift 数据库群集单点登录
- C++求复数的角度_python实现输入三角形边长自动作图求面积案例
- 如何去掉PDF文档中的水印?
- 会计税务一键式统计2.0_按照内容锁定动态锁定工作薄,待更新
- 七夕种草“盐系妆”,get到重点了吗?
热门文章
- 网站超过一个月一直不收录怎么办?亲测有效(百度和360)
- SQL创建视图时设置默认值
- TP5中使用ajax
- 解决只读模式U盘保护格式化或者dd写报错:ERROR: failed to open ‘/dev/sdb‘ in read-write mode: Read-only file system.
- Ural 1710. Boris, You Are Wrong!
- Java 字节区/字符区缓冲流
- 【Java数据结构】平衡二叉树的手术刀剖析
- 关于多态三种基本形式
- 学生个人网页Dreamweaver设计作业 环保垃圾分类5页表格 js时间特效 js轮播视频
- python引号内引用变量_Python 在引号内引用变量