当前位置: 首页 > article >正文

stm32串口编程实例-实现数据的收发功能

大家好,今天给大家介绍stm32串口编程实例,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。

串口是USART(通用同步/异步收发器)的俗称。

实际上,串行总线并不只有USART,还包含IIC、SPI、CAN、K线、单总线、USB、485等等总线,只是因为UART用得较多,习惯上叫做“串口”。

首先来看下UART的通信模型:

设备1与设备2进行通信

TXD:发送端,负责发送数据

RXD:接收端,负责接收数据

GND:地线,保证设备1与设备2有相同的参考电压,保证通信的正常进行。

从模型上我们可以看出UART(USART是同步通信,在这个模型的基础上都一条始终控制总线,但不常用)是一个异步、全双工、串行通信。既然是异步的,那么就需要控制设备1与设备2数据收发的速度一致性,也就是两设备要有相同的波特率(bit/s一秒钟能传的),否则通信会出现数据传输错误。

现在我们配置stm32的串口1,实现与PC端上的串口助手实现通信。首先查看串口的引脚、查看芯片手册上各引脚对用的复用功能等。

以下是实现代码,主要是实现Uart1数据的收发。

void USART1_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

//配置时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

/* USART1 GPIO config */

/* Configure USART1 Tx (PA.09) as alternate function push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure USART1 Rx (PA.10) as input floating */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* USART1 mode config */

USART_InitStructure.USART_BaudRate = 115200;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

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(USART1, &USART_InitStructure);

//使能串口中断

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

//清空发送完成标志位

USART_ClearFlag(USART1,USART_FLAG_TC);

//使能串口

USART_Cmd(USART1, ENABLE);

}

//定义printf函数接口(printf重定向)

int fputc(int ch, FILE *f)

{

USART_SendData(USART1, (uint8_t) ch);

while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

return (ch);

}

//定义scanf函数接口(scanf重定向)

int fgetc(FILE *f)

{

while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);

return (int)USART_ReceiveData(USART1);

}

//发送字符

char usart1_putc(char ch)

{

USART_SendData(USART1, (uint8_t) ch);

while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) != SET);

return (ch);

}

//发送字符串

int usart1_putstr(unsigned char* buff,int len)

{

int i = 0;

for(i = 0;i < len;i++)

{

usart1_putc(buff[i]);

}

return len;

}

//接收字符

char usart1_getc(void)

{

char temp = 0;

while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)!= SET);

temp = USART_ReceiveData(USART1);

return temp;

}

//接收字符串

int usart1_getstr(unsigned char* buff,int len)

{

int i = 0;

for(i = 0;i < len;i++)

{

buff[i] = usart1_getc();

}

return len;

}

配置好之后,将这些函数放到头文件中申明,并放到主函数中去初始化及调用,就可以实现数据的收发功能。

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

(点击找小助理领取)扫码进群领资料icon-default.png?t=N7T8https://s.pdb2.com/pages/20230519/16QijNiGb32IFIn.html


http://www.kler.cn/news/162696.html

相关文章:

  • 【CVE 复现】CVE-2022-0185 fsconfig之整数溢出
  • LinuxBasicsForHackers笔记 -- 使用和滥用服务
  • 自动化测试框架需要具备哪些功能?
  • 2、Redis变慢原因排查(下)
  • 使用Echarts.js绘制环形图(指定触发高亮事件)
  • Python中读写(解析)JSON文件的深入探究
  • MIT线性代数笔记-第26讲-对称矩阵及正定性
  • VUE学习二、创建一个前端项目
  • vs 安装 qt qt扩展 改迅雷下载qt
  • java中可重入锁的作用是什么?
  • Linux 统计命令Netstat详解
  • jsonwebtoken生成token和解析
  • 进制 + 原码,反码,补码
  • 供应链产品经理常用的ChatGPT通用提示词模板
  • 代立冬:基于Apache Doris+SeaTunnel 实现多源实时数据仓库解决方案探索实践
  • 持续集成交付CICD:CentOS 7 安装 Sonarqube9.6
  • 使用Java API操作HDFS
  • 云上巴蜀丨云轴科技ZStack成功实践精选(川渝)
  • Leetcode—2034.股票价格波动【中等】
  • 信息可视化在数字孪生中的应用:打造直观决策支持系统
  • css 十字分割线(含四等分布局)
  • Python-链式调用详解(默认参数,函数的嵌套调用、关键字传参)
  • xxl-job详解
  • RestTemplate硬编码的使用
  • C++STL的string模拟实现
  • 实现SQL server数据库完整性
  • 进程控制与原语
  • Termux+Hexo结合内网穿透轻松实现安卓手机搭建博客网站发布公网访问
  • 这把养生局~
  • Vue 子路由页面发消息给主路由页面 ,实现主页面显示子页面的信息