历史上的今天
今天是:2025年04月02日(星期三)
2021年04月02日 | 使用变参函数实现STM32串口接收指定字符的功能
2021-04-02 来源:eefocus
串口经常需要接收指定范围的字符。比如程序运行到某处,提供给用户‘A’、‘B’、‘C’、‘D’四个选项,等待用户输入。如果输入是‘A’、‘B’、‘C’、‘D’的其中一个,则跳转;否则继续等待。
这个功能可以使用if判断语句来实现,它的优点是直观简单,缺点是代码有重复。如果程序中有十次这样的等待输入,就得编写十次if判断语句。
所以,这里使用变参函数将这个功能整合成一个模块。
// 定义在变参函数中,需要调用的显示函数,里面放置打印给用户的提示信息等等
// 函数类型需要符合变参函数中的uart_func
// USART_TypeDef用来选择串口号
// 第一个struct uartData用来存储串口接收中断的数据和标志位
// 第二个struct uartData是第一个的缓存,避免数据和标志位在处理的时候被串口接收中断更新
int uxah_dis(USART_TypeDef* USARTx, struct uartData *uartxData, struct uartData *uartxMain)
{
usart_printf(USARTx, "rnplease enter your choice: ");
return sFALSE;
}
// uart_func func是调用的显示函数,便于重复打印提示信息
// char *byte用来存储最终的有效字符
// int num是可用的字符数量,如果变参为‘A’、‘B’、‘C’、‘D,则num=4
int UART_wait_char(USART_TypeDef* USARTx, struct uartData *uartxData,
struct uartData *uartxMain, uart_func func, char *byte, int num, ...)
{
char *p = (char *)&num + sizeof(int);
uint32_t i = 0;
START:
func(USARTx, uartxData, uartxMain);
for (i = 0; i < num; i++) {
usart_send_byte(USARTx, *((char *)(p + i * sizeof(int))));
if (i != num - 1)
usart_printf(USARTx, "/");
}
usart_printf(USARTx, " ");
uartxData->recIrq = sFALSE;
while (1) {
if (uartxData->recIrq >= sTRUE) {
uartxMain->recTempH = uartxData->recTempH;
uartxData->recIrq = sFALSE;
usart_send_byte(USARTx, uartxMain->recTempH);
for (i = 0; i < num; i++) {
if (uartxMain->recTempH == *((char *)(p + i * sizeof(int)))) {
*byte = uartxMain->recTempH;
return sTRUE;
}
}
goto START;
}
}
return sFALSE;
}
当执行:
UART_wait_char(USART1, uart1Data, uart1Main, uxah_dis, &temp, 4, 'A', 'B', 'C', 'D');
时,会打印:
please enter your choice: A/B/C/D w
please enter your choice: A/B/C/D q
please enter your choice: A/B/C/D A
如果接收到'A', 'B', 'C', 'D'其中一个,则继续执行后面的程序,否则重复打印上面的内容。
当执行:
UART_wait_char(USART1, uart1Data, uart1Main, uxah_dis, &temp, 2, 'Y', 'N');
时,会打印
please enter your choice: Y/N Q
please enter your choice: Y/N N
如果接收到'Y', 'N'其中一个,则继续执行后面的程序,否则重复打印上面的内容。
变参函数,在形参的数量和内容不确定的情况下,能够简化分支判断语句,使代码干净整洁
上一篇:STM32学习之时钟
史海拾趣
|
TM32 中断与嵌套NVIC 快速入门。 我也是靠看这本书才弄懂的: Cortex-M3 权威指南 Joseph Yiu 著 宋岩 译 其实很简单。 //CM3 有 最多240个中断(通常外部中断写作IRQs),就是 软件上说的 IRQ CHANAELx(中断通道号x) 每个中断有自己的可编 ...… 查看全部问答> |
|
http://www.96qd.com/driver/softdown.asp?softid=166173 请哪位好心人帮我下载这个驱动程序,之后压缩打包后发我一下, 万分谢谢! 我的email: hkds2008@163.com 在线等!… 查看全部问答> |
|
【我给xilinx资源中心做贡献】Xilinx Spartan-3E开发板相关资源 概述 Spartan-3E初学者电路板向工业上基于Spartan-3E电路设计平台提供了最受欢迎最超值的产品。板载的50万门Spartan 3E FPGA可以构建32位RISC处理器和DDR接口。开发板上拥有的Xilinx Platform Flash、USB和JTAG并 ...… 查看全部问答> |
|
最近在弄气敏型烟雾监测装置,手里面有一个传感器元件,性能测试不错,但是不知道是哪个厂家的产品,只能从产品上面看到企业logo。 急求各位大侠,哪个知道是哪个公司的产品吗?… 查看全部问答> |
|
一、上电复位 POR 和 上电清除 PUC 二、低功耗控制 但系统时钟发生器基本功能建立之后,CPU内的状态寄存器SR中的SCG1、SCG2、OscOff、CpuOff是低功耗的重要控制位; 系统工作模式一共有6种,1种活动模式和5种低功耗模式; 可以通过设置控制位使 ...… 查看全部问答> |
|
430的IO都是数字量类型的管脚,如果电流经模数转换后的数字量可不可以1个输出接一个IO口呢,在程序里循环扫描这几个IO口,来获得这个数字量,不知道这个想法是否可行,不行的话,麻烦讲解一下 … 查看全部问答> |
|
本帖最后由 游乐场 于 2014-7-16 21:51 编辑 普通的白炽灯要有500流明的光通量大概需要60W,而500流明的LED大概在5W到20W左右,每一盏LED都比白炽灯更加节能。现在用WEBENCH设计一款500流明光通量的LED。第一步 在LED设计框选择输入设 ...… 查看全部问答> |




