完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前言
本文,在cubemx已经初始化串口之后,讲解如何从串口接受数据,处理数据,以及中断回调函数的编写。另外有如何在HAL库实现串口打印的方法。 准备工作 我们为了实现串口的中断接受以及处理,我们需要在cube里面打开串口中断 函数讲解 串口初始化函数 我们在cube里面打开usart之后,会出现这个函数,这个函数的作用就是串口初始化,这里我们看到好色之了波特率,停止位等。 /** * @brief USART1 Initialization Function * @param None * @retval None */ static void MX_USART1_UART_Init(void) { /* USER CODE BEGIN USART1_Init 0 */ /* USER CODE END USART1_Init 0 */ /* USER CODE BEGIN USART1_Init 1 */ /* USER CODE END USART1_Init 1 */ huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART1_Init 2 */ /* USER CODE END USART1_Init 2 */ } 串口接受和发送函数 发送函数 /** * @brief Sends an amount of data in blocking mode. * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), * the sent data is handled as a set of u16. In this case, Size must indicate the number * of u16 provided through pData. * @param 串口结构体 * @param 数据u 8 或者 u16 * @param 传输数据大小 * @param 超时时间 */ HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) 中断回调函数 我们可以看到,这里的中断回调函数采用了弱定义,也就是说,一旦用户定义了这个函数,那么原来的函数就会被用户定义的取代。 /** * @brief Receives an amount of data in non blocking mode. * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), * the received data is handled as a set of u16. In this case, Size must indicate the number * of u16 available through pData. * @param 串口结构体 * @param 存数据的数组 * @param 大小 * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 串口操作流程 1、设置接受buffer,并且设置为中断接受 uint8_t UART_RXBUFFER[128] = {0}; HAL_UART_Receive_IT(&huart1, (uint8_t *)&UART_RXBUFFER, 1); 2、编写中断回调函数 注意这是我们自己定义的回调函数,但是名字必须用这个。 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART1) { HAL_UART_Transmit(&huart1,UART_RXBUFFER,1,100);//用来回发 HAL_UART_Receive_IT(&huart1,UART_RXBUFFER,1); //一直接受 } } 3、测试 printf 串口打印重定位 我们要知道,所谓的打印函数就是输出我们想要输出得字符。那么我们平时在pc上面的打印是输出到屏幕上面,那么在32上面,我们需要通过串口输出。这时候就需要将printf得打印定位到串口上面,也就是给一个基本得函数到printf。 我们只需要将下面一段代码放到。自己的代码中就行了 //这是定义一个打印字符的函数,里面定义为我们的串口输出字符就行了,这和我们原来使用的标准库没有太大区别。 int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1, 0xFFFF); return ch; } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1786 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1622 浏览 1 评论
1089 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
730 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1680 浏览 2 评论
1942浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
739浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
576浏览 3评论
599浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
561浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 22:31 , Processed in 0.669825 second(s), Total 48, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号