linux 串口接收多个字符,使用变参函数实现STM32串口接收指定字符的功能

串口经常需要接收指定范围的字符。比如程序运行到某处,提供给用户‘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, "\r\nplease 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'其中一个,则继续执行后面的程序,否则重复打印上面的内容。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值