原创 使用变参函数实现STM32串口接收指定字符的功能(新版)

2014-10-27 13:51 1470 20 21 分类: MCU/ 嵌入式 文集: C语言

回头看老版,才发现艾玛怎么会设计得那么复杂!
新版改动的地方有:
第一,不使用中断接收,而使用while来等待,因为本身函数的功能就是等待;
第二,去掉各种各样的全局数组;
第三,调用的函数指针更加简单;
第四,采用goto语句实现各种情形下的返回和收尾工作。

char UART_wait_spe_char(USART_TypeDef* USARTx, void (*fun)(void), int len, ...)
{
    char byte = 0xFF, *p = (char *)&len + sizeof(len);
    int i = 0;
    uint8_t channel;

    if (USARTx == USART1)
        channel = USART1_IRQn;
    else if (USARTx == USART2)
        channel = USART2_IRQn;
    else if (USARTx == USART3)
        channel = USART3_IRQn;
    else
        return -1;

    NVIC->ICER[channel >> 0x05] = (uint32_t)0x01 << (channel & (uint8_t)0x1F);

    while (1) {
        fun();
        while (USART_GetITStatus(USARTx,USART_IT_RXNE) == RESET);
        byte = USART_ReceiveData(USARTx);
        uart_send_byte(USARTx, byte);

        for (i = 0; i < len; i++) {
            if (byte == *((char *)(p + i * sizeof(int))))
                goto END;
        }
    }

END:
    NVIC->ISER[channel >> 0x05] = (uint32_t)0x01 << (channel & (uint8_t)0x1F);
    return byte;
}

使用时,先定义函数入口参数fun:
void uart1_wait_fun(void)
{
    uart_printf(USART1, "\r\nPlease enter your choice (a/b/c/d): ");
}

然后在主函数中执行:
 byte = UART_wait_spe_char(USART1, uart1_wait_fun, 4, 'a', 'b', 'c', 'd');
 uart_printf(USART1, "\r\nControl the LED.\r\n");
 
在串口终端minicom就会显示:
Please enter your choice (a/b/c/d): F                                           
Please enter your choice (a/b/c/d): D                                           
Please enter your choice (a/b/c/d): a                                           
Control the LED.


 

文章评论1条评论)

登录后参与讨论

用户602821 2014-12-27 21:03

认个老师
相关推荐阅读
DiracFatCat 2018-09-05 12:14
【博客大赛】卡尔曼滤波学习笔记(11)从位置估计速度
卡尔曼滤波器,不仅仅是一个低通滤波器,否则也不会持续发展50年。 示例:桑先生需要测试高速列车的性能。测试的目的是判断列车在直线上能否保持80m/s的速度。速度和位置每0.1秒测量一次,但是由于...
DiracFatCat 2018-08-31 19:32
【博客大赛】卡尔曼滤波学习笔记(10)一个简单的示例
《Kalman Filtering: Theory and Practice Using MATLAB》第三章,看不懂,暂时略过。《Kalman Filtering: Theory and Pract...
DiracFatCat 2018-07-19 15:09
对sed命令的练习
sed是流编辑器。它每次处理一个输入,因此很有效率。官方手册:https://www.gnu.org/software/sed/manual/sed.html学习Linux命令,当然要阅读官方手册,所...
DiracFatCat 2018-06-19 15:10
【博客大赛】卡尔曼滤波学习笔记(八)可观测性和可控制性 ...
可观测性是指,在给定模型的情况下,动力学系统的状态是否由它的输入输出唯一确定。可观测性是系统模型的特征。如果传感器矩阵H是可逆的,则本系统可观测,因为有:如果传感器矩阵H某些时候是不可逆的,则本系统仍...
DiracFatCat 2018-06-19 10:56
【博客大赛】卡尔曼滤波学习笔记(七)Z变换
如果我们仅仅对离散线性系统感兴趣,那么就使用下面这个表达式:如果u是常量,那么可以写成:为了简化表达式,我们可以将上面写成:离散线性时不变系统的Φ求解,可以使用Z变换。(* 由于本人已经忘记了Z变换的...
DiracFatCat 2018-06-19 10:54
【博客大赛】卡尔曼滤波学习笔记(六)拉普拉斯变换
对于线性时变/时不变系统,求解Φ(t)有多种方式,拉普拉斯变换是其中一种。(* 由于本人已经忘记了拉普拉斯变换的内容,因此本节待续。)...
我要评论
1
20
关闭 站长推荐上一条 /2 下一条