STM32系列——串口收发数据基础

2023-05-16

  1. 串行接口相关知识

  • 两种通信方式:并行通信与串行通信,并行通信传输速度快但是占用的引脚资源多,串行通信传输速度慢但是占用的引脚资源少。

  • 三种模式:单工、半双工、全双工

  • 异步串行通信:通信双方在没有同步时钟的前提下,将一个字符(包括特定的附加位)按位进行传输的通信方式。

  • 波特率:每秒钟传输的二进制位数,如9600bps。

  • 串口<--------->USB接口:CH340 CP2012

  • STM32芯片的串口UASRT功能十分强大,但对于日常编程而言,使用最多的还是异步串行通信。

USART1_TX与PA9复用,USART1_RX与PA10复用。

USART2_TX与PA2复用,USART2_RX与PA3复用。

  1. STM32CubeMX中关于USART的配置

注意:(1)Mode模式设置为异步通信;(2)波特率配置要与上位机选择的一致;

  1. HAL库中串口发送的重要函数(重点)

  • 阻塞式发送函数(串口数据发送完以后,单片机才能执行下一步程序,一般串口需要发送的数据也不多,等他发完也不会花太多时间,所以其影响可忽略不计)

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

四个参数:使用哪个串口;需要发送的数据(是字符串还是字节获数组);数据大小;设定的发送时间;

  • 非阻塞式发送函数(串口发送数据,不需要等待发送完数据,单片机能执行下一步程序,一般用于串口需要发送很长的数据的情况)待串口将数据发送完以后,回调对应中断服务函数。

HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

  • 发送完毕中断回调函数

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);

  1. 串口发送数据实例

  • 使用非阻塞式的串口发送函数,将发送缓数组dat_Txd中的前5个数据发送到USART1,在数据发送完成后,翻转PB9引脚的输出电平。

HAL_UART_Transmit_IT(&huart1,&dat_Txd,5);//调用非阻塞式的串口发送函数
void HAL_UART_TxCpltCalback(UART_HandleTypeDef *huart)//发送完毕中断回调函数
{
    if(huart->Instance == USART1)//判断是否为串口1
    {
        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
    }
}
  • 补充:使用阻塞式的串口发送函数怎么写代码?

HAL_UART_Transmit(&huart1, &dat_Txd, 5, 10000);
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
  1. HAL库中串口接收的重要函数(重点)

  • 阻塞式接收函数(不推荐使用,一般不知道什么时候能够接受到数据,单片机不可能一直不工作只为等着接收数据)

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

  • 非阻塞式接收函数(推荐使用)

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

  • 接收完毕中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

  1. 串口接收数据实例

  • 使用非阻塞式的串口接收函数,接收USART1的一个字节,将其保存在变量dat_Txd中,在数据接收完成后若该字节为0x5A,翻转PB8引脚的输出电平。

HAL_UART_Receive_IT(&huart1,&dat_Rxd,1);//调用非阻塞式的串口发送函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)//判断是否为串口1
    {
        if(huart->Instance == USART1)
         {
            if(dat_Rxd == 0x5A)
            HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
         }
    }
}
  1. 综合实训

在STM32F103C8T6开发板上,连接相关外电路, 还需要一个串口,利用STM32CubeMX和Keil5协同开发,完成以下的功能。

【1】开机后,向串口1发送“hello world ! ”。

【2】串口1收到字节指令“OxA1”,PB9输出高电平,发送“LED1 Open ! ”。

【3】串口1收到字节指令“OxA2”,PB9输出低电平,发送“LED1 Closed! ”。

【4】在串口发送过程中,翻转PB8作为发送数据指示灯。

(1)cubmx配置

在本文第2点关于USART的配置基础下勾选中断,并将波特率修改为9600。

(2)Keil5编写代码
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/*宏定义*/
#define LED1_ON()     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
#define LED1_OFF()     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
#define LED2_ON()     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
#define LED2_OFF()     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);

uint8_t Tx_str1[] = "hello world!\r\n";
uint8_t Tx_str2[] = "LED1 Open!\r\n";
uint8_t Tx_str3[] = "LED1 Close!\r\n";
uint8_t RX_dat = 0;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)//判断是否为串口1
    {
        if(huart->Instance == USART1)
         {
            if(RX_dat == 0xa1)
            {
            LED1_ON();
            
            LED2_ON();
            HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str2),10000);
            LED2_OFF();    
            HAL_UART_Receive_IT(&huart1,&RX_dat,1);
            }
       
         else if(RX_dat == 0xa2)
         {
            LED1_OFF();
            
            LED2_ON();
            HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str3),10000);
            LED2_OFF();        
            HAL_UART_Receive_IT(&huart1,&RX_dat,1);
         }
       }
    }
}
/* USER CODE END 0 */
  /* USER CODE BEGIN 2 */
    LED2_ON();
    HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str1),10000);
    LED2_OFF();
    
    HAL_UART_Receive_IT(&huart1,&RX_dat,1);
  /* USER CODE END 2 */

操作完毕!

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

STM32系列——串口收发数据基础 的相关文章

  • java UDP DatagramSocket接收不到数据

    今天联系这个通信 xff0c 接收端总是接收不到数据 xff01 排除代码本身有可能出现的错误 xff0c 比如地址 xff0c 数据宝包 我称它为数据宝宝 xff09 等等自己粗心的错误后还是不行 xff0c 我查看各种方法 xff0c

随机推荐

  • Python与爬虫有什么关系?

    爬虫一般是指网络资源的获取 xff0c 因为python的脚本特征 xff0c Python易于配置 xff0c 对字符的处理也非常灵活 xff0c 加上python有丰富的网络抓取模块 xff0c 所以两者经常联系在一起 接下来我们可以详
  • C++中struct和class的区别

    1 C 43 43 中struct和class的区别 C 43 43 中的struct其实是为了与C的兼容性而留下来的 C 43 43 的struct和class其实大部分都是相同的用法 xff0c 基本上可以用class做的事都可以用st
  • L298N驱动步进电机,有stm32代码亲测可用

    1 1 步进电机相关概念 相数 xff1a 产生不同对极N S磁场的激磁线圈对数 xff0c 常用 m 表示 例如 xff1a 二相四线电机 xff0c 就有两对极N S磁场的激磁线圈 xff0c 四个线圈 上图可知 xff0c A 43
  • C++成员初始化

    C 43 43 成员分为 xff1a 一般变量 xff0c const修饰变量 xff0c 引用类型成员 xff0c static成员 xff0c const staic成员 同static const xff0c 自定义类型对象 clas
  • HTTP协议解析

    目录 1 HTTP协议的概念 2 HTTP协议格式 3 HTTPS 1 HTTP协议的概念 在我们之前学习网络的过程中 xff0c 我们知道了目前主流网络分层模型共分为5层 xff0c 分别是物理层 xff0c 数据链路层 xff0c 网络
  • cmake编译opencv开源项目报错问题

    最近使用cmake在编译一个配置了opencv环境的c 43 43 开源项目时遇到如下问题 CMake Warning at D opencv4 OpenCVConfig cmake 176 message Found OpenCV Win
  • Ubuntu系统换源

    简单介绍一下源 xff0c 源就是一个大仓库 xff08 类似应用商店 xff09 xff0c 系统下载软件需要从这个仓库下载 xff0c 因为Ubuntu默认源是国外的 xff0c 所以在下载东西的时候会出现下载速度很慢的情况 xff0c
  • 字符串的简单介绍和字符串的大小比较

    以前就写过一篇关于String的文章 xff0c 今天再来写一篇 xff0c 更加深入了解一下String类 x1f550 1 String类的定义 x1f551 2 String类的创建 x1f552 3 字符串的大小比较 1 之前在C语
  • 数据结构1

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
  • 洛谷P5740 【深基7.例9】最厉害的学生

    题目描述 现有 N N le 1000 N N 1000 名同学参加了期末考试 xff0c 并且获得了每名同学的信息 xff1a 姓名 xff08 不超过 8 个字符的仅有英文小写字母的字符串 xff09 语文 数学 英语成绩 xff08
  • C语言创建链表并输出

    代码如下 define CRT SECURE NO WARNINGS include lt stdio h gt include lt assert h gt include lt string h gt include lt stdlib
  • 游戏搬砖是什么意思?

    网络游戏搬砖是指在各网络游戏中 xff0c 玩家把花大量时间 精力赚的钱转手为游戏买各种东西 搬砖原本是一个汉语词语 xff0c 意思是原指搬运砖块 xff0c 在网络语中 xff0c 搬砖引申为工作辛苦 重复机械 赚钱不多的工作 在一些方
  • C语言实现扫雷游戏

    话不多说直接淦代码 代码都有详细注释 define CRT SECURE NO WARNINGS include lt stdio h gt include lt time h gt include lt stdlib h gt inclu
  • C语言用栈实现队列(数据结构)

    1 首先需要两个栈来模拟队列的出队和入队 2 假设入队1 2 3 4 如果要出队则不能直接出栈 需要进行数据的搬移 先把s1的数据全部放入s2中 然后再在s2出栈 gt 整个队列出队 3 如果再要入队则将入队元素放入s1 若要出队则出栈s2
  • Linux权限理解(详细详细)

    目录 一 权限的概念 二 Linux权限管理 1 文件访问者的分类 xff08 人 xff09 2 文件类型和访问权限 xff08 事物属性 xff09 3 文件权限值的表示方法 1 字符表示 2 8进制数字表示法 4 文件访问权限的相关设
  • Linux管道

    目录 1 管道概念 2 管道分类 1 匿名管道 1 基本实现与概念 2 站在文件描述符角度 深度理解管道 3 站在内核角度 管道本质 4 管道读写规则 5 管道属性设置与阻塞验证 6 管道特点 匿名 2 命名管道 1 创建一个命名管道 2
  • string类(C++)

    目录 一 简单了解string类 二 string的接口与使用 2 1string类对象的常见构造 2 2 string类对象的容量操作 2 3 string类对象的访问及遍历操作 2 4 string类对象的修改操作 一 简单了解stri
  • 力扣260:只出现一次的数字|||(异或)

    目录 题目 解析 完整代码 题目 我们首先看一下题目 给定一个整数数组 nums xff0c 其中恰好有两个元素只出现一次 xff0c 其余所有元素均出现两次 找出只出现一次的那两个元素 你可以按 任意顺序 返回答案 接口 class So
  • C++(多态)

    目录 一 多态概念 二 多态的定义及实现 2 1多态的构成条件 2 2 虚函数 2 4虚函数重写的两个例外 2 5 C 43 43 11 override 和 final 三 重载 覆盖 重写 隐藏 重定义 的对比 一 多态概念 多态的概念
  • STM32系列——串口收发数据基础

    串行接口相关知识 两种通信方式 xff1a 并行通信与串行通信 xff0c 并行通信传输速度快但是占用的引脚资源多 xff0c 串行通信传输速度慢但是占用的引脚资源少 三种模式 xff1a 单工 半双工 全双工 异步串行通信 通信双方在没有