如何使用chracter数组更改函数输入

如何使用chracter数组更改函数输入,c,function,embedded,keil,hal,C,Function,Embedded,Keil,Hal,大家好,我正在用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_P

大家好,我正在用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`
之后,我用HAL功能调整继电器状态(“GPIO引脚状态”)。例如,在每个循环中,我使用微控制器引脚设置我的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);
         }
       }

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

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

static const struct {
  GPIO_TypeDef *port;
  uint16_t     pin;
} relays[] = {
 { GPIOC, GPIO_PIN_14 },
 { GPIOC, GPIO_PIN_15 },
 ... more here ...
};
然后,您可以在阵列中使用索引来获取端口/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);
}

非常感谢您的时间和努力