如何使用字符数组更改我的函数输入

How can I change my function inputs with chracter array

大家好,我正在使用 Keil MicroVision IDE 在 STM32Fxx 微处理器上编写嵌入式 C 代码。在我的项目中,我使用了 8 个继电器。我用以下代码示例清除了每个继电器。

 #define DO9_Pin GPIO_PIN_14
 #define DO9_GPIO_Port GPIOC
 #define DO8_Pin GPIO_PIN_15
 #define DO8_GPIO_Port GPIOC
 #define DO7_Pin GPIO_PIN_1
 #define DO7_GPIO_Port GPIOA
 #define DO6_Pin GPIO_PIN_0
 #define DO6_GPIO_Port GPIOA
 #define DO5_Pin GPIO_PIN_7
 #define DO5_GPIO_Port GPIOB
 #define DO4_Pin GPIO_PIN_6
 #define DO4_GPIO_Port GPIOB
 #define DO3_Pin GPIO_PIN_5
 #define DO3_GPIO_Port GPIOB
 #define DO2_Pin GPIO_PIN_1
 #define DO2_GPIO_Port GPIOB
 #define DO1_Pin GPIO_PIN_4
 #define DO1_GPIO_Port GPIOA
 #define DO0_Pin GPIO_PIN_3
 #define DO0_GPIO_Port GPIOA`

之后我调整了 Relay status("GPIO PIN STATUS") 与 HAL Functions 众所周知。例如,在每个循环中,我正在使用微控制器引脚设置我的 9 个继电器的状态,为此我正在使用此代码块`

  void prsSetResetRelays(unsigned char coilNo,char status){

    if(coilNo==0){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO0_GPIO_Port,DO0_Pin,GPIO_PIN_SET);
       }else{
            HAL_GPIO_WritePin(DO0_GPIO_Port,DO0_Pin,GPIO_PIN_RESET);
        }
    }
    else if(coilNo==1){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO1_GPIO_Port,DO1_Pin,GPIO_PIN_SET);
        }else{
            HAL_GPIO_WritePin(DO1_GPIO_Port,DO1_Pin,GPIO_PIN_RESET);
        }
    }
    else if(coilNo==2){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO2_GPIO_Port,DO2_Pin,GPIO_PIN_SET);
        }else{
            HAL_GPIO_WritePin(DO2_GPIO_Port,DO2_Pin,GPIO_PIN_RESET);
        }
    }
    else if(coilNo==3){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO3_GPIO_Port,DO3_Pin,GPIO_PIN_SET);
        }else{
            HAL_GPIO_WritePin(DO3_GPIO_Port,DO3_Pin,GPIO_PIN_RESET);
        }
    }else if(coilNo==4){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO4_GPIO_Port,DO4_Pin,GPIO_PIN_SET);
        }else{
            HAL_GPIO_WritePin(DO4_GPIO_Port,DO4_Pin,GPIO_PIN_RESET);
        }
    }else if(coilNo==5){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO5_GPIO_Port,DO5_Pin,GPIO_PIN_SET);
        }else{
            HAL_GPIO_WritePin(DO5_GPIO_Port,DO5_Pin,GPIO_PIN_RESET);
        }
    }
    else if(coilNo==6){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO6_GPIO_Port,DO6_Pin,GPIO_PIN_SET);
        }else{
            HAL_GPIO_WritePin(DO6_GPIO_Port,DO6_Pin,GPIO_PIN_RESET);
        }
    }
    else if(coilNo==7){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO7_GPIO_Port,DO7_Pin,GPIO_PIN_SET);
        }else{
            HAL_GPIO_WritePin(DO7_GPIO_Port,DO7_Pin,GPIO_PIN_RESET);
        }
    }
    else if(coilNo==8){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO8_GPIO_Port,DO8_Pin,GPIO_PIN_SET);
        }else{
            HAL_GPIO_WritePin(DO8_GPIO_Port,DO8_Pin,GPIO_PIN_RESET);
        }
    }
      else if(coilNo==9){
          if(status=='s' || status=='S'){
              HAL_GPIO_WritePin(DO9_GPIO_Port,DO9_Pin,GPIO_PIN_SET);
          }else{
                HAL_GPIO_WritePin(DO9_GPIO_Port,DO9_Pin,GPIO_PIN_RESET);
         }
      }

    }

我的问题是这样的。我有什么办法可以以更短的形式减少这段代码。我可以使用 for 循环,而不是这个 all 语句吗?例如我想写这样的代码:`

      for(int i=0;i<10;i++){
           if(status=='s' || status=='S'){
                  HAL_GPIO_WritePin(DO[i]_GPIO_Port,DO[i]_Pin,GPIO_PIN_SET);
           }else{
                HAL_GPIO_WritePin(DO[i]_GPIO_Port,DO[i]_Pin,GPIO_PIN_RESET);
         }
       }

我有什么办法可以用c 编程语言来做这种表示法吗?提前致谢。

您不能索引预处理器名称,不。它们不是运行时变量,它们严格用于在编译器看到代码之前进行文本替换。

正确的解决方案是将继电器阵列建模为阵列:

static const struct {
  GPIO_TypeDef *port;
  uint16_t     pin;
} relays[] = {
 { GPIOC, GPIO_PIN_14 },
 { GPIOC, GPIO_PIN_15 },
 ... more here ...
};

然后就可以使用数组的索引得到port/pin数据,戳一下:

void prsSetResetRelays(unsigned char coilNo, char status)
{
  if(coilNo >= sizeof relays / sizeof *relays)
    return;
  HAL_GPIO_WritePin(relays[coilNo].port, relays[coilNo].pin,
    (status == 's' || status == 'S') ? GPIO_PIN_SET : GPIO_PIN_RESET);
}