簡體   English   中英

如何使用chracter數組更改函數輸入

[英]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`

之后,我以HAL功能眾所周知的方式調整了繼電器狀態(“ GPIO PIN STATUS”)。 例如,在每個缸中,我使用微控制器引腳設置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循環代替所有這些語句嗎? 例如,我想編寫如下代碼:

      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 ...
};

然后,您可以使用數組中的索引來獲取端口/引腳數據,並對其進行戳戳:

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM