2016-06-23 4 views
1

Arduino mega2560とEZO EC(Electrical Conductivity)を使用しており、Serial.print()関数を使用してコマンドを送信しようとしています。私はArduino IDE 1.6.7を使用しています。デバイスがUARTコマンドに応答しない

私は、オンラインで見つかったうまく動作するように見えるいくつかのコードを持っています。しかし、なぜ私のコードがうまくいかないかを知りたい。 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()関数を使って文字列を送信しても問題ありません。私は何が間違っているのか分からない。

私はセンサーからのものを取り込む手順を記述する必要があることを理解します。しかし、何も最初の場所にセンサに送信されるようだ!

ご協力いただければ幸いです。ありがとうございます

答えて

0

スラッシュを使用していますが、バックスラッシュは使用していません。これにこの

Serial3.print("R/r"); 

を変更します。

Serial3.print("R\r"); 

そしてStringクラスを使用しないでください。それはあなたを台無しにするでしょう。 :) char配列を使用して、ループ内で文字を使用できるようにするだけです。

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

が応答ラインの似たような操作を行います:R \ は最終的に、プロセス配列を到着すると。これにより、SerialEvent内部でのブロッキングも回避されます。 :P

+0

こんにちはslash-devです。これを試してみます。しかし、私がセンサーを理解する方法は、それが接続されているArduino Serialソートにセンサーが "* ER"を返す必要があるということです。コマンドが送られてきたが、それらは理解できません。それを理解すれば "* OK"を送信します。それで少なくとも私が送るコマンドを受け取っているはずです。例えば私が "R"を送るなら、それは少なくともコマンドを受け取るべきです。しかし、私のテストから、私はそれがそれを受け取っていないことも知っています。なぜこれがそうだと説明できますか? –

+0

質問:なぜあなたはそれをシリアルにしていますか?available()とSerial.read()?それはSerial3ではないでしょうか?私はSerial3にまっすぐ書いてみたいので、Serial0をまったく使いたくないです。それとも必要ですか? –

+0

@ JohnB。、プログラムは 'serialEvent'を使って' Serial'から 'input_string'を読み込みます(シリアル0のように)。私はそれがセンサーの命令だと考えています。私はあなたのスケッチから作業しました。 Serial3から読み取るコードセクションを切り取り、貼り付けて、\ rが最終的に到着したときに応答を処理します。以下のmhopengの答えにも注意してください: 'setup'の' Serial3.print'は 'Serial3.begin'、LOLです。 –

0

あなたのsetup()ブロック内のエラーを持っている:あなたは、あなたの質問に

Serial3.begin(9600) 

しかし、コード内:あなたはbegin()の文との接続を設定する必要があり、シリアル接続を介してデータを送信することができます前に、

Serial3.print(9600) 

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

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

関連する問題