String Prcss_ALL_Read(){
  
  String str = "";
  str += "AI?:";
  for (int i = 0; i < Size_AI; i++) {
    char formattedNumber[5]; // 4자리 숫자 + 널 종료 문자
    sprintf(formattedNumber, "%04X", Values_AI[i]); // 4자리로 고정된 형식의 문자열 생성
    str += formattedNumber; // 형식화된 문자열 추가
    str += ',';
  }
  str += RcvOK;

  
  str += "DI?:";
  char formattedNumber[5]; // 4자리 숫자 + 널 종료 문자
  sprintf(formattedNumber, "%04X", Values_DI); // 4자리로 고정된 형식의 문자열 생성
  str += formattedNumber; // 형식화된 문자열 추가
  str += ',';
  str += RcvOK;

  str += "PV10?:";
  if(rcv_10_PV){
    for (int i = 0; i < Size_PV; i++) {
      char formattedNumber[5]; // 4자리 숫자 + 널 종료 문자
      sprintf(formattedNumber, "%04X", Values_10_PV[i]); // 4자리로 고정된 형식의 문자열 생성
      str += formattedNumber; // 형식화된 문자열 추가
      str += ',';
    }
    str += RcvOK;
  }else{
    str += RcvErr;
  }

  str += "SV10?:";
  if(rcv_10_SV){
    for (int i = 0; i < Size_SV; i++) {
      char formattedNumber[5]; // 4자리 숫자 + 널 종료 문자
      sprintf(formattedNumber, "%04X", Values_10_SV[i]); // 4자리로 고정된 형식의 문자열 생성
      str += formattedNumber; // 형식화된 문자열 추가
      str += ',';
    }
    str += RcvOK;
  }else{
    str += RcvErr;
  }
  return str + FIN;
}

String Prcss_DO_Write(unsigned int data[], int dataSize){
  String str = "DO!:";

  if(dataSize != 1){
    str += RcvErr;
    return str + FIN;
  }

  unsigned int data0 = data[0];
  for (int bit = 0; bit < 16; bit++) {
    digitalWrite(DoPin[bit], bitRead(data0, bit) ? HIGH : LOW);
  }

  str += RcvOK;
  return str + FIN;
}
String Prcss_DI_Read(){
  String str = "DI?:";

  //for (int i = 0; i < Size_DI; i++) {
    char formattedNumber[5]; // 4자리 숫자 + 널 종료 문자
    sprintf(formattedNumber, "%04X", Values_DI); // 4자리로 고정된 형식의 문자열 생성
    str += formattedNumber; // 형식화된 문자열 추가
    str += ',';
  //}

  str += RcvOK;
  return str + FIN;
}
//
String Prcss_AI_Read(){
  String str = "AI?:";

  for (int i = 0; i < Size_AI; i++) {
    char formattedNumber[5]; // 4자리 숫자 + 널 종료 문자
    sprintf(formattedNumber, "%04X", Values_AI[i]); // 4자리로 고정된 형식의 문자열 생성
    str += formattedNumber; // 형식화된 문자열 추가
    str += ',';
  }

  str += RcvOK;
  return str + FIN;
}

String Prcss_AO_Write(unsigned int data[], int dataSize){
  String str = "AO!:";
  int t = millis();
  int d = 2;

  for(int i=0 ; i<dataSize ; i++){
    AO_Write(i, data[i]);
  }
  
  t = millis()-t;
  Serial.println(t);

  str += RcvOK;
  return str + FIN;
}

String Prcss_PV_Read(){
  String str = "PV10?:";

  for (int i = 0; i < Size_PV; i++) {
    char formattedNumber[5]; // 4자리 숫자 + 널 종료 문자
    sprintf(formattedNumber, "%04X", Values_10_PV[i]); // 4자리로 고정된 형식의 문자열 생성
    str += formattedNumber; // 형식화된 문자열 추가
    str += ',';
  }

  str += RcvOK;
  return str + FIN;
}

String Prcss_SV_Read(){
  String str = "SV10?:";

  for (int i = 0; i < Size_SV; i++) {
    char formattedNumber[5]; // 4자리 숫자 + 널 종료 문자
    sprintf(formattedNumber, "%04X", Values_10_SV[i]); // 4자리로 고정된 형식의 문자열 생성
    str += formattedNumber; // 형식화된 문자열 추가
    str += ',';
  }

  str += RcvOK;
  return str + FIN;
}

String Prcss_SV_Write(unsigned int data[], int dataSize){
  String str = "SV!:";
  String message, cmd, cmdData;

  cmd = "10DWR,";

  if (dataSize < 9) {
    cmd = "10DWR,0" + String(dataSize) + ",";
  } else {
    str += RcvErr;
    return str + FIN;
  }

  cmdData = "";
  for(int i=0 ; i<dataSize ; i++){
    char hexStr[5]; // Buffer to hold the hexadecimal string (4 characters + null terminator)
    sprintf(hexStr, "%04X", data[i]); // Format as 4 digit uppercase hexadecimal

    cmdData += MC9_CH[i] + 1; // ZONE 1
    cmdData += ",";
    cmdData += String(hexStr);
    if(i != dataSize -1){
      cmdData += ",";
    }
  }

  message = cmd + cmdData;
  message += sumMC9(message);
  message = "" + message + CRLF;
  write_buff_first(Buff_485_Wr, message);
  Serial.println(message);

  str += RcvOK;
  return str + FIN;
}

String Prcss_AT_Write(bool onOff){
  String str = "AT!:";
  String message, cmd;
  
  cmd = "10DWR,02,0302,0001,0501,";
  if(onOff){
    cmd += "0001";
  }else{
    cmd += "0000";
  }
  

  message = cmd;
  message += sumMC9(message);
  message = "" + message + CRLF;
  write_buff_first(Buff_485_Wr, message);

  str += RcvOK;
  return str + FIN;
}


String Prcss_RngAO(unsigned int data[], int dataSize){
  String str = "RngAO!:";
  int d = 2;
  for(int i=0 ; i<dataSize ; i++){
    AO_setup(i, data[i]);
    delay(d);
  }
  str += RcvOK;
  return str + FIN;
}