STM32串口接收小结

STM32串口接收数据

稍微理一下思路,一个数据从电脑发送到STM32,然后在从STM32返回到电脑显示出来。

如上图所示,发送(1所示的路线)前,STM32的淳口需要初始化的设置。包括:波特率,字长,硬件流,停止位,奇偶校验位,模式(接收,发送,接收和发送),串口的基地址(Instance)。在初始化串口的函数里面,需要调用到HAL_UART_MspInit(),这是一个虚函数(_weak),HAL_UART_MspInit()会调用到HAL_GPIO_Init(),把IO口进行配置。(模式,上下拉,速度,复用)

3.接收中断优先级的配置

HAL_NVIC_EnableIRQ(USART1_IRQn);          //接收中断使能
HAL_NVIC_SetPriority(USART1_IRQn,2,2);    // 中断优先级的配置       

以上两个函数可以放在HAL_UART_MspInit()里面进行

4.使能串口接收中断

HAL_UART_Receive_IT(&usart1_handler,rdula,1);

这个函数可以写在主函数里面,因为在uart.c的文件中是有的。同时可以写在串口配置函数的后面。

5.编写中断服务函数

/***中断服务函数***/
void USART1_IRQHandler()
{
    HAL_UART_IRQHandler(&usart1_handler);      //中断处理函数

   HAL_UART_Receive_IT(&usart1_handler,rdula,1);//使能接收中断。为什么放在这里,因为是处理完中断处理函数,而接受中断关闭,不在处理相关的接收数据,为了能够再次接收数据,可以把接收中断函数放在中断服务函数逇里面。
}

6.编写中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    u8 temp;
    if(huart->Instance == USART1)            //判断是不是串口一,要对串口一进行回调函数。
    {
        temp=*((huart->pRxBuffPtr)-1);
        HAL_UART_Transmit(&usart1_handler,&temp,1,1000);

    }

}

上图所示的代码中,void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)是一个虚函数(_weak),所以需要重新定义。其中if是判断这个基地址是不是串口一。

 

                                                                                          2019-09-06   21:52:36

原文地址:https://www.cnblogs.com/DY004/p/11470799.html

时间: 2024-11-07 19:07:27

STM32串口接收小结的相关文章

stm32串口接收完整的数据包

借鉴了文章:<stm32串口中断接收方式详细比较> 文章地址:http://blog.csdn.net/kevinhg/article/details/40186169 串口的配置这里不做说明,仅对中断中的协议解析进行描述 数据帧协议: 帧头1 帧头2 数据长度 有效数据 crc_1 crc_2 B5 5B 03 00 57 0B 帧头1+帧头2+数据长度(包含有效数据.crc_1.crc_2)+有效数据 + crc_1 + crc_2(校验为帧头到有效数据) crc16校验未深入学习,代码也

STM32串口中断的一些资料

在研究STM32串口接收发送中断的时候找到不少不错的资料,现在备份在这里.以供自己查阅,以及方便其他人. TC ====TXE 顺便预告下最近会写个有关串口处理数据的帖子,从查询和中断方面以及数据处理的方式,从队列以及FIFO方面写起. SECTION 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 /* 调试STM32串口过程中发现一个奇怪的问题,

stm32的串口接收字符串以十六进制数

#include "pbdata.h" uint8_t TxBuffer1[] = "USART Interrupt Example: This isUSART1 DEMO"; uint8_t RxBuffer1[],rec_f,tx_flag; volatile uint8_t TxCounter1 = 0x00; volatile uint8_t RxCounter1 = 0x00; uint32_t Rec_Len; int main(void) { u8 a

STM32串口USART1的使用方法和程序

通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换. USART利用分数波特率发生器提供宽范围的波特率选择,支持同步单向通信和半双工单线通信. 1.STM32固件库使用外围设备的主要思路 在STM32中,外围设备的配置思路比较固定.首先是使能相关的时钟,一方面是设备本身的时钟,另一方面如果设备通过IO口输出还需要使能IO口的时钟:最后如果对应的IO口是复用功能的IO口,则还必须使能AFIO的时钟. 其次是配置GPIO,GPI

2018最新mfc作为上位机接收硬件端USB或串口数据显示成图片 解决串口接收数据丢字节丢包问题

本文用的是VS2013MFC写串口数据接收: 第一步:首先建立一个MFC工程,成功后会跳出一个对话框,直接在对话框上点击右键->点击插入ACTIVAE控件->选择MicrosoftCommunications Control, version 6.0 成功后会显示一个电话的图标在对话框上,运行起来不会显示的 不用担心这个美观问题.如果没有这个插件的话,可能是版本太低  可以自己下载一个补上 第二步:大概的窗体搞好:   那个显示图片的大框是PICTURE控件变量 然后就要项目->类向导中

stm32串口发送数据复位 第一个数据丢失

http://blog.csdn.net/kevinhg/article/details/40991655 STM32串口发送必须先检测状态,否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失.换成发送别的数值的数据,如0x06 0x0ff,则接收到0x0ff,0x06丢失.错

STM32串口遇到的一个问题

做HLW8032电能表项目中关于USART使用DMA接收定长数据的问题 1:由于HLW8032芯片一上电,芯片就会通过串口每隔50ms向STM32发送24字节的数据,且我不能通过STM32控制HLW8032发送数据,由于STM32初始化需要一段时间,所以当STM32接收数据时会出现丢包的情况.. 2:解决方法:使用USART空闲中断,在初始化时先不使能串口DMA,只打开串口,在STM32串口空闲时,跳入串口空闲中断, 先判断数据是否正确,是否接收到24个字节的数据,如果数据校验错误,将缓冲区清零

单片机多字节串口接收(转)

工作了一年多,写了不少单片机串口程序.感觉串口多字节接收部分的逻辑相对于配置寄存器跟串口回复来说,是有点难度的——寄存器配置基本上都是死的,串口回复多字节跟回复一字节只是多了一个循环. 串口接收程序是基于串口中断的,单片机的串口每次接收到一字节数据产生一次中断,然后再读取某个寄存器就可以得到串口接收的数据了.然而在实际应用当中,基本上不会有单字节接收的情况.一般都是基于一定串口通信协议的多字节通信.在422或者485通信中,还可能是一个主机(一般是计算机)带多个从机(相应的有单片机的板卡).这就

STM32 串口通信基础知识

2.STM32的串口通信原理 串口通信是单片机最基本的功能,很多传感器模块与单片机的连接都会用到串口功能.串口通信,顾名思义就是将一整条的内容,切成一“串”个体来发送或接收.发送的核心思想是:将字符串中的一个字符写到一个寄存器中(此寄存器只能存一个字符),写入后会自动通过串口发送,发送结束再写入下一个字符.接收时会直接装入单片机缓冲区的一个字符型数组中,由程序依次读这个数组. 上图是串口数据发送接收的过程做一个简单的图示.收发控制器根据寄存器配置,对数据存储转移部分的移位寄存器进行控制.当需要发