历史上的今天
返回首页

历史上的今天

今天是: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'其中一个,则继续执行后面的程序,否则重复打印上面的内容。


变参函数,在形参的数量和内容不确定的情况下,能够简化分支判断语句,使代码干净整洁


推荐阅读

史海拾趣

中移物联网(Chinamobile)公司的发展小趣事

中移物联网始终秉持开放、合作、共享的发展理念,与国内外众多企业建立了紧密的合作关系。公司积极与硬件设备厂商、软件开发商、解决方案提供商等开展技术合作,共同推动物联网技术的创新与应用。同时,中移物联网还与行业协会、学术机构建立合作关系,加强技术交流和合作研究,为构建良好的物联网产业生态做出了积极贡献。这些合作不仅提升了公司的技术实力和市场竞争力,也推动了整个物联网行业的健康发展。

Eastron Corp公司的发展小趣事

Eastron Corp一直重视人才的培养和引进。公司建立了完善的人才培养和激励机制,鼓励员工不断学习和创新。同时,Eastron还积极引进国内外优秀人才,为公司的发展注入新的活力。正是凭借一支高素质、专业化的团队,Eastron在电子行业中不断取得新的突破。

DB Unlimited公司的发展小趣事

DB Unlimited公司最初只是一个生产基础音频组件的小型企业。随着技术的不断发展和市场的变化,公司意识到单纯的组件生产已经无法满足客户的需求。于是,DB Unlimited开始转型,致力于提供完整的音频解决方案。通过不断研发和创新,公司成功开发出了一系列高性能的音频产品,并凭借其卓越的品质和性能,赢得了客户的广泛认可。

Automatic Connector公司的发展小趣事

Automatic Connector公司自创立之初,就专注于电子连接器技术的研发与创新。公司团队不断突破传统设计,推出了多款具有高性能、高可靠性的连接器产品。随着智能手机和可穿戴设备的普及,Automatic Connector的微型连接器在市场上大受欢迎,公司因此迅速崛起。通过与知名电子设备制造商的合作,Automatic Connector逐渐在行业中树立了技术领先的形象,实现了稳健的发展。

Conflux公司的发展小趣事

在竞争激烈的电子行业中,Conflux始终保持对技术创新的追求。公司团队不断研发新的区块链应用场景,如供应链管理、物联网安全等。通过将这些技术应用于实际业务中,Conflux不仅提升了自身的竞争力,也推动了整个电子行业的进步。同时,公司还积极参与国际技术交流和合作,不断引进国际先进理念和技术,为公司的持续创新提供了有力支持。

Engelking Elektronik GmbH公司的发展小趣事

Engelking Elektronik GmbH公司成立于20世纪90年代初,最初只是一家小型电子产品制造商。在创始人Engelking先生的领导下,公司专注于生产高质量的电子元件和模块。随着技术的不断进步和市场的扩大,Engelking Elektronik开始将产品范围扩展到更复杂的电子系统。通过持续的研发投入和严格的质量控制,公司逐渐在电子行业中树立了专业可靠的声誉。

问答坊 | AI 解惑

STM32 中断与嵌套NVIC 快速入门。

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。 急求各位大侠,哪个知道是哪个公司的产品吗?…

查看全部问答>

MSP430F149内部资源(一)

一、上电复位 POR 和 上电清除 PUC 二、低功耗控制 但系统时钟发生器基本功能建立之后,CPU内的状态寄存器SR中的SCG1、SCG2、OscOff、CpuOff是低功耗的重要控制位; 系统工作模式一共有6种,1种活动模式和5种低功耗模式; 可以通过设置控制位使 ...…

查看全部问答>

430 IO 数字量

430的IO都是数字量类型的管脚,如果电流经模数转换后的数字量可不可以1个输出接一个IO口呢,在程序里循环扫描这几个IO口,来获得这个数字量,不知道这个想法是否可行,不行的话,麻烦讲解一下 …

查看全部问答>

晒WEBENCH设计的过程+500流明LED设计

本帖最后由 游乐场 于 2014-7-16 21:51 编辑 普通的白炽灯要有500流明的光通量大概需要60W,而500流明的LED大概在5W到20W左右,每一盏LED都比白炽灯更加节能。现在用WEBENCH设计一款500流明光通量的LED。第一步  在LED设计框选择输入设 ...…

查看全部问答>

一点点小分享

偶尔看到群里各种没法编译,我觉得要上阵必须要磨好枪,不过我最近很忙,没什么时间学习瑞萨,只能靠挤时间来完成。 我的版本是2.02的,也能完成大家所要求的大部分操作。在此再次说明一下,单纯使用光碟里面的程序是不能完成下载程序的,就是说使 ...…

查看全部问答>

求个STM32编译MDK 或 IAR。

求个STM32编译MDK 或 IAR。 …

查看全部问答>