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

这篇具有很好参考价值的文章主要介绍了STM32系列——串口收发数据基础。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 串行接口相关知识
  • 两种通信方式:并行通信与串行通信,并行通信传输速度快但是占用的引脚资源多,串行通信传输速度慢但是占用的引脚资源少。

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

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

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

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

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

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

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

  1. STM32CubeMX中关于USART的配置
stm32串口接收数据,STM32系列,stm32,单片机,Powered by 金山文档

注意:(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。文章来源地址https://www.toymoban.com/news/detail-675645.html

stm32串口接收数据,STM32系列,stm32,单片机,Powered by 金山文档
stm32串口接收数据,STM32系列,stm32,单片机,Powered by 金山文档
(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 */
操作完毕!

到了这里,关于STM32系列——串口收发数据基础的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32通讯系列--串口通讯】使用标准库、HAL库实现任意长度数据的收发(包含帧头、帧尾校验,配套完整开源程序)

    【数据组成】串口的通讯协议由开始位,数据位,校验位,结束位构成。 【数据结构】一般以一个低电平作为一帧数据的起始,接着跟随 8 位或者 9 位数据位,之后为校验位,分为奇校验,偶校验和无校验,最后以一个先高后低的脉冲表示结束位,长度可以设置为 0.5,1,

    2024年02月14日
    浏览(43)
  • 【STM32】STM32学习笔记-USART串口收发HEX和文本数据包(29)

    串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式, 电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和

    2024年01月19日
    浏览(46)
  • 【STM32】STM32F103C8T6串口通信,实现3个串口收发数据

    串口通信(Serial Communications)实现单片机与电脑或者其它外设进行通信,通信时只需两根线(TX,RX)就可以实现数据传输。STM32f103有三个串口,分别为串口1(RX PA10, TX PA 9),串口2(RX PA3,TX PA2),串口3(RX PB11,TX PB10)。 以下代码是配置三个串口: usart.c usart.h main.c 注意,

    2024年02月12日
    浏览(49)
  • stm32和python实现DMA+串口数据收发

    1-0 串口配置 1-1 DMA发送模式配置 1-2 通过DMA传输数据到USART1的发送寄存器 1-3 串口数据发送 将usart1_dma_tx_data()函数放在main函数中或者中断处理函数中即可,如下所示: 2-1 DMA接收模式配置 2-2 串口结束中断 2-3 对串口接收的数据进行处理 3 完整程序

    2024年02月14日
    浏览(41)
  • stm32串口自定义协议接收一串十六进制数据(将其中两个字节转化为十进制数据)+部分串口基础知识

    位(bit): 二进制数中的一个数位,可以是0或者1,是计算机中数据的最小单位。 字节(Byte): 计算机中数据的基本单位,每8位组成一个字节。各种信息在计算机中存储、处理至少需要一个字节。 例如,一个ASCII码用一个字节表示,一个汉字用两个字节表示。 字(Word):

    2023年04月08日
    浏览(59)
  • 在STM32中使用5个串口收发数据的问题

    之前碰巧有个项目需要多个串口,用的是ST自带的5个串口没有用扩展芯片 1.MCU型号:STM32F103VET6 2.标准库 1.5个中断同时开启接收数据,即使设置了优先级,还是会出现卡死现象 2.5个中断开启时,printf 重定义如何兼容5个串口 3.如何将5个串口实现通用配置,兼容STF10XXX系列 4.在单片机中

    2024年02月21日
    浏览(41)
  • 【STM32学习】——USART串口数据包&HEX/文本数据包&收发流程&串口收发HEX/文本数据包实操

    声明:学习笔记根据b站江科大自化协stm32入门教程编辑,仅供学习交流使用!

    2024年02月06日
    浏览(49)
  • STM32 串口DMA接收数据(高效接收数据)

    极度不推荐在使用DMA的时候按照传统的方式进行重定义!!! 非常简单,轮询方式整个CPU 在串口发送时处于等待状态,但是使用DMA时无法确保当前DMA已经传输完成。 有同学可能会认为可以通过判断DMA的传输标志位来进行等待,但如果这样的话就丧失了DMA的设计意图: 再次使

    2024年02月16日
    浏览(50)
  • stm32使用HAL库配置串口中断收发数据(保姆级教程)

    最近在学习使用hal库,之前都是用标准库来写32代码,所以发个帖子记录一下学习过程,同时也希望能帮助到一些也在学习HAL库的同学。 接下来进入正题 串口中断是指当单片机收到一个串口数据时,单片机会产生一个中断信号,通知处理器中断服务程序去处理这个接收到的数

    2024年02月07日
    浏览(40)
  • STM32实现DMA接收串口数据

    一..首先我们得配置DMA和USARAT,我们的原理是DMA1的通道5为USART1的RX引脚。  1.USART1的配置 2.DMA的配置 二.中断进行数据处理(stm32f10x_it.c) 我们可以串口打印出数组中的数据,验证DMA是否正常工作。可以到数据处理那个地方进行处理。USART1在初始化中就已经波特率为115200.我们可以

    2024年02月16日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包