HAL库串口接收不定长字符串(CubeMX,不用DMA)

    科技2022-07-14  152

    新建工程 选择芯片,点start project PA10是串口一的rx PA9是串口一的tx 配上IO RCC这边,选择使用外部晶振 配时钟树 project manager里面,设置项目名字,路径和编译器 选上给每个外设都建立独立的c文件 回到pinout界面,设置波特率 上面的mode一定一定一定要选A开头的那个,异步,uart。usart只能往串口助手发消息,但是收不到串口助手发来的消息。

    开中断 generate code,打开文件 在uart.h里面添加#include “stdio.h”

    在usart.c下添加printf重定向

    int fputc(int ch, FILE *f) { HAL_USART_Transmit(&husart1, (uint8_t *)&ch, 1, 0xffff); return ch; }

    main函数的while里面加上这一段来测试

    printf("hello\r\n"); HAL_Delay(500);

    效果正常 接下来是正题,接收不定长字符串(假设字符串是以/r/n结束) 发生中断时,会执行void USART1_IRQHandler(void) 该函数调用HAL_USART_IRQHandler(&husart1); 该函数是判断是不是接收完成中断,如果是的话,调用USART_Receive_IT() 尝试了这个教程,无果 考虑基于定时器的改动 用定时器三 定时器操作方法 操作失败 有个小tip,在c文件定义变量,然后在对应的h文件中extern

    考虑基于字符串回显的代码,来进行改动 参照这篇博客设置,一切正常

    然后打开cubemx工程,把串口三配上,因为串口三连着传感器 串口三是PB10和PB11

    使用HAL_UART_Receive_IT(&huart1,&aRxBuffer,1); 等待读取第一个返回数 读到后,会调用HAL_UART_RxCpltCallback 里面HAL_UART_Transmit(&huart1,&aRxBuffer,1,0xFFFF);将读到的数通过串口一发到电脑上

    改动: 使用HAL_UART_Transmit(&huart3,“AT+SPO2\r\n”,9,0xFFFF);用串口三给模块发数 在while循环中 使用HAL_UART_Receive_IT(&huart3,&aRxBuffer,1); 等待串口三读取第一个返回数 读到后,会调用HAL_UART_RxCpltCallback 里面HAL_UART_Transmit(&huart1,&aRxBuffer,1,0xFFFF);将读到的数通过串口一发到电脑上

    还是不行 考虑先看看寄存器版的串口 这个地方要用数组,直接上字符串,不识别转义字符

    调出来了 心率调完

    Processed: 0.012, SQL: 8