目录

  • 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串口发送接收数据相关推荐

  1. STM32串口实时接收数据与所提前定义的比较,并作出相应的操作

    STM32串口实时接收数据与所提前定义的比较,并作出相应的操作 //typedef const uint16_t uc16; /*!< Read Only */uc16 BUF[10]={162 ...

  2. C#利用SerialPort类对串口发送接收数据

    1.连接串口方法 SerialPort ser = new SerialPort();//也可以在工具箱中直接拖SerialPort控件 public void OpenCom() {try{//波特 ...

  3. c# 串口发送接收数据

    /********************** 串口数据接收事件 *****************************/private void SerialPort_DataReceived( ...

  4. 51单片机模拟串口发送接收数据(不使用SBUF)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 51单片机.模拟串口.串口发送.串口接收.逻辑分析仪 前言 一.配置定时器 二.串口发送 三.串口接收 四.主函数 五.波形图 5.1 ...

  5. STM32 串口DMA接收 Openmv / K210 整数、小数字符串数据 (基于HAL库)

    目录 前言 一.工程配置 二.串口DMA部分代码 1.源文件UART_DMA.c 2.头文件UART_DMA.h 3.stm32f1xx_it.c的修改 4.串口收发DMA测试 三.字符串数字提取代码 ...

  6. STM32—USART串口发送+接收

    STM32-USART串口发送+接收 本文来自于<STM32--江科大>的笔记整理. 文章目录 STM32-USART串口发送+接收 10.3 串口发送 串口调试助手 10.3.1 数据模 ...

  7. 向STM32串口发送数据的标准函数

    向STM32串口发送数据的标准函数 例子:1 void UART_Send_Message(u8 *Data,u8 lenth) {while(lenth--){USART_SendData(USAR ...

  8. 求android 中串口的发送接收数据代码

    RT,求高手帮忙! 就是 /dev/ttyS0 和/dev/ttyS1 两个设备的通信问题.. 同求~ 这个是不是需要串口驱动啊?最近正在搞这个串口通信的案子,头疼 同样也没有搞出来,老是报:不能扫描 ...

  9. C语言程序周期接收虚拟串口发送的数据

    背景 我之前的一篇博客讲解了怎么使用虚拟串口和串口调试助手:虚拟串口模拟器和串口调试助手使用教程,这次我们在此基础上继续来使用虚拟串口周期发送和接收功能. 我们知道,在Windows的操作系统上,将串 ...

最新文章

  1. 滴滴海外市业务面试经历
  2. 字符流Reader对象创建子类及方法
  3. Oracle-awrddrpt.sql比较两个AWR差异报告
  4. MSSQL 从备份文件还原数据库脚本
  5. 面试官本拿求素数搞我,但被我优雅的“回击“了(素数筛)
  6. linux下redis权限,Linux(Centos)下Redis开机自启设置
  7. Pandas实用技能,数据筛选query函数详细介绍
  8. 责任链模式 和观察者模式
  9. python关闭对象语法_Python基础及语法(七)
  10. html文本格式化意思,HTML文本格式化标签(Formatting)
  11. JavaScript 工具库:Cloudgamer JavaScript Library v0.1 发布
  12. UE4 中文文档阅读
  13. worldwind java 教程_科学网—用worldwind java SDK开发应用程序 - 谢安涛的博文
  14. erp的术语-jde系统
  15. ios11对比android8.0,谁的设计更好?iOS11正式版多图详尽对比安卓8.0
  16. Amazon 中国区配置 PingIdentity 身份集成实现 Redshift 数据库群集单点登录
  17. C++求复数的角度_python实现输入三角形边长自动作图求面积案例
  18. 如何去掉PDF文档中的水印?
  19. 会计税务一键式统计2.0_按照内容锁定动态锁定工作薄,待更新
  20. 七夕种草“盐系妆”,get到重点了吗?

热门文章

  1. 网站超过一个月一直不收录怎么办?亲测有效(百度和360)
  2. SQL创建视图时设置默认值
  3. TP5中使用ajax
  4. 解决只读模式U盘保护格式化或者dd写报错:ERROR: failed to open ‘/dev/sdb‘ in read-write mode: Read-only file system.
  5. Ural 1710. Boris, You Are Wrong!
  6. Java 字节区/字符区缓冲流
  7. 【Java数据结构】平衡二叉树的手术刀剖析
  8. 关于多态三种基本形式
  9. 学生个人网页Dreamweaver设计作业 环保垃圾分类5页表格 js时间特效 js轮播视频
  10. python引号内引用变量_Python 在引号内引用变量