第十五届蓝桥杯-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;
}

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

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@daiwei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值