第十五届蓝桥杯-UART接收不定长指令的处理

学习初衷: 不仅仅为了比赛!

目录

一、问题引入

二、UART常用的三种工作模式

1.UART工作在中断模式

2.UART工作在DMA模式下

3.uart工作在接收转空闲的模式下

三、获取指令中需要的数据

四、printf函数的实现


一、问题引入

问题引入:请看下面这样一个设计要求

这个时候, 是不是使用一下的这种配置方法就不得行了

/* 主函数初始化 */
Uart_Init();

/* 接收中断, 该函数的最后一个参数指定接收到对应的字符数后才触发中断 */
HAL_UART_Receive_IT(&huart1, uart_recv_buff, 7);

/* uart接收完成ISR */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1) {
		printf("recv: 111111\r\n");
		memset(uart_recv_buff, 0 , sizeof(uart_recv_buff));
		HAL_UART_Receive_IT(&huart1, uart_recv_buff, 5);
	}
}

以上的配置方法只适合接收的字符数量确定的情况, 对于文章开头描述的问题并不能完成要求。

二、UART常用的三种工作模式

1.UART工作在中断模式

也就是上述所描述的那种情况, 给大家配置一下, 将就我也再加深一下印象。

不去配置指定的引脚的化, 再uart的参数配置这里配置好后的USART1的默认引脚不是PA9和PA10, 这个坑大家注意一下。

接着就可以生成代码。在过程种大家在初始化函数的地方调用生成好的的uart的初始化函数,接着在调用uart接收并产生中断的哪一个函数, 注意点就是该函数必须接收到指定的字符数才产生中断

/* 主函数初始化 */
Uart_Init();

/* 接收中断, 该函数的最后一个参数指定接收到对应的字符数后才触发中断 */
HAL_UART_Receive_IT(&huart1, uart_recv_buff, 7);

/* uart接收完成ISR */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1) {
		printf("recv: 111111\r\n");
		memset(uart_recv_buff, 0 , sizeof(uart_recv_buff));
		HAL_UART_Receive_IT(&huart1, uart_recv_buff, 5);
	}
}

2.UART工作在DMA模式下

配置和上述一样, uart的基本参数, 接着需要配置一下DMA

生成代码的代码编写如下, 和uart的接收中断模式一样

3.uart工作在接收转空闲的模式下

上述函数可能不太常用, 该函数的位置

上述中断回调函数的位置

如此, 就能接收不定长的指令了

三、获取指令中需要的数据

给大家说一些C库函数, 大家不会的学一下, 很有用。

sprintf

snprintf

sscanf()

strtok

strchr

strstr

就可以将接收到的数据, 给轻松的解析出来, 剩下的就是逻辑处理的工作了

四、printf函数的实现

调试程序非常有用, 建议大家比赛的时候配置上, 简单讲一下用处。

在函数中打印信息, 查看函数的调用情况

打印变量的值, 在逻辑不清楚的时候, 打印变量的值可以很快的帮助我们解决问题

在过程中任意的位置实现fputc函数

int fputc(int ch, FILE *fp)
{
    /* 当串口的发送数据寄存器不空的时候等待 */
    while((USART1->ISR & (1 << 7)) == 0);
    UASRT1->TDR = ch;

    return ch;
}

好了, 就分享这么多, 希望需要帮助的人看了能有思路,不在疑惑!

相关推荐

  1. 题解-握手

    2024-03-16 19:46:05       16 阅读
  2. 总结

    2024-03-16 19:46:05       7 阅读
  3. 总结

    2024-03-16 19:46:05       8 阅读
  4. 2019年省赛真题-不同子串

    2024-03-16 19:46:05       24 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-16 19:46:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-16 19:46:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-16 19:46:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-16 19:46:05       18 阅读

热门阅读

  1. 厦大GPA(xmuoj)

    2024-03-16 19:46:05       17 阅读
  2. 452. 用最少数量的箭引爆气球

    2024-03-16 19:46:05       19 阅读
  3. 常用的正则表达式

    2024-03-16 19:46:05       18 阅读
  4. Redis 线程模型

    2024-03-16 19:46:05       20 阅读
  5. springboot2.7使用redis的redission组件实现分布式锁

    2024-03-16 19:46:05       16 阅读
  6. MySQL作业一

    2024-03-16 19:46:05       19 阅读
  7. Linux用户和权限

    2024-03-16 19:46:05       16 阅读
  8. 力扣98:验证二叉搜索树

    2024-03-16 19:46:05       17 阅读
  9. Horspool 算法介绍

    2024-03-16 19:46:05       18 阅读