1

私は Arduino mega2560 と EZO EC (Electrical Conductivity) を使用しており、Serial.print() 関数を使用してコマンドを送信しようとしています。Arduino IDE 1.6.7 を使用しています。

オンラインで見つけた、正常に動作するように見えるコードがいくつかあります。しかし、私のコードが機能しない理由を知りたいです。EC センサーが、送信しているデータを取得していないようです。データが送信されていないようです。

私はそれが正常に動作し、期待どおりに動作するコードでセットアップをテストしたので、それが私の接続ではないことを知っています.

オンラインで見つけたコードは次のとおりです。

String inputstring = "";                              
String sensorstring = "";                             
boolean input_string_complete = false;              
boolean sensor_string_complete = false;             

void setup() {                                        
  Serial.begin(9600);                                 
  Serial3.begin(9600);                                
  inputstring.reserve(10);                           
  sensorstring.reserve(30);                          

}


void serialEvent() {                                 
  inputstring = Serial.readStringUntil(13);          
  input_string_complete = true;                       
}


void serialEvent3() {                                
  sensorstring = Serial3.readStringUntil(13);        
  sensor_string_complete = true;                      
}


void loop() {                                        
  float wt = 28.9;
  String tempCal = "T,";
  tempCal += wt;
  if (input_string_complete == true) {                
    Serial3.print(inputstring);
    Serial3.print("\r");                             
    inputstring = "";                                 
    input_string_complete = false;                    
  }

  if (sensor_string_complete == true) {               
    if (isdigit(sensorstring[0]) == false) {          
      Serial.println(sensorstring);                  
    }
    else                                             
      print_EC_data();                                
    }
    sensorstring = "";                                
    sensor_string_complete = false;                   
  }
}


void print_EC_data(void) {                           

  char sensorstring_array[30];                        
  char *EC;                                          
  char *TDS;                                          
  char *SAL;                                         
  char *GRAV;                                         
  float f_ec;                                         

  sensorstring.toCharArray(sensorstring_array, 30); 
  EC = strtok(sensorstring_array, ",");              
  TDS = strtok(NULL, ",");                            
  SAL = strtok(NULL, ",");                            
  GRAV = strtok(NULL, ",");                         

  Serial.print("EC:");                                
  Serial.println(EC);                                 
  Serial.print("TDS:");                             
  Serial.println(TDS);                               
  Serial.print("SAL:");                            
  Serial.println(SAL);                                
  Serial.print("GRAV:");                             
  Serial.println(GRAV);                               
  Serial.println();                                  

//f_ec= atof(EC);                                     
}

これが私のコードです:

void setup() {
  Serial.begin(9600);
  Serial3.print(9600);
}
void loop() {
  Serial3.print("R/r");
  Serial.print("R/r");
  delay(2000);
}

Serial3.print はセンサーに送信されません。しかし、他のコードも Serial3.print() 関数を使用して文字列を送信し、正常に動作します。何が間違っているのかわかりません。

センサーから入ってくるものを取り込む手順を書く必要があることは理解しています。しかし、そもそもセンサーに何も送信されていないようです!

どんな助けでも大歓迎です。ありがとうございました

4

2 に答える 2

0

バックスラッシュではなく、スラッシュを使用しています。これを変える

Serial3.print("R/r");

これに:

Serial3.print("R\r");

Stringまた、クラスを使用しないでください。それはあなたを台無しにします。:) char 配列を使用するだけで、文字がループで使用できるようになります。\r最終的に が到着したら、配列を処理します。

char inputString[16];
int  inputStringIndex = 0;

void loop()
{
  if (Serial.available()) {
    char c = Serial.read();
    if (c == '\r') {
      inputString[ inputStringIndex ] = '\0'; // NUL-terminate string
      inputStringIndex = 0; // reset for next time

      Serial3.print( inputString );
      Serial3.print( '\r' );

    } else if (inputStringIndex < sizeof(inputString)-1) {
      inputString[ inputStringIndex++ ] = c;
    }
  }

応答行についても同様のことを行います。これにより、SerialEvent 内でのブロックも回避されます。:P

于 2016-06-23T13:31:22.343 に答える
0

ブロックにエラーがあります: シリアル接続を介してデータを送信する前に、次のステートメントsetup()で接続を構成する必要があります。begin()

Serial3.begin(9600)

しかし、あなたの質問のコードでは

Serial3.print(9600)

また、EZO がSerial3 (14,15)の正しいピンに接続されていることを確認してください。

また、制御文字を印刷するには「\」を使用する必要があります。

于 2016-06-24T14:31:46.043 に答える