2016-06-23 22 views
1

Ich verwende ein Arduino mega2560 und ein EZO EC (Elektrische Leitfähigkeit) und versuche, einen Befehl mit der Serial.print() -Funktion zu senden. Ich verwende die Arduino IDE 1.6.7.Gerät reagiert nicht auf UART-Befehle

Ich habe etwas Code, der scheint gut zu funktionieren, die ich online gefunden habe. Aber ich möchte wissen, warum mein Code nicht funktioniert. Der EC-Sensor scheint die Daten, die ich sende, nicht zu empfangen. Es werden keine Daten gesendet.

Ich weiß, dass es nicht meine Verbindung ist, da ich das Setup mit dem Code getestet habe, der funktioniert, läuft es gut und wie erwartet. Hier

ist der Code, den ich online gefunden, die funktioniert:

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

Hier ist mein Code:

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

Die Serial3.print einfach nicht an den Sensor geschickt bekommen. Aber der andere Code sendet auch eine Zeichenfolge mit der Funktion Serial3.print() und es funktioniert gut. Ich weiß nicht, was ich falsch mache.

Ich verstehe, dass ich eine Prozedur schreiben muss, um alles aufzunehmen, was vom Sensor kommt. Aber nichts scheint überhaupt an den Sensor gesendet zu werden!

Jede Hilfe würde sehr geschätzt werden. Danke

Antwort

0

Sie verwenden Schrägstrich, nicht Backslash. Ändern Sie diese

Serial3.print("R/r"); 

dazu:

Serial3.print("R\r"); 

Und nicht verwenden, um die String Klasse. Es wird dich vermasseln. :) Verwenden Sie einfach char-Arrays und füllen Sie sie aus, wenn Zeichen in loop verfügbar sind. Wenn die \ r schließlich ankommt, Prozess das Array:

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

Sie etwas Ähnliches für die Antwortzeile. Dies verhindert auch das Blockieren in einem SerialEvent. : P

+0

Hallo slash-dev, okay, ich werde das versuchen. Aber wie ich den Sensor verstehe, ist, dass der Sensor ein "* ER" zurück an die Arduino Serial-Art senden soll, an die es angeschlossen ist. Wenn es der Befehl gesendet wurde, aber diejenigen, die es nicht verstehen. Es wird "* OK" senden, wenn es es versteht. Also sollte es zumindest den Befehl erhalten, den ich sende. z.B. wenn ich "R" sende, sollte es zumindest den Befehl erhalten. Aber von meinen Tests weiß ich, dass es es nicht einmal erhält. Kannst du erklären, warum das so ist? –

+0

Frage: Warum machen Sie es seriell.available() und Serial.read()? Sollte es nicht Serial3 sein? Da ich direkt auf die Serial.3 schreiben möchte, möchte ich Serial0 überhaupt nicht verwenden. Oder ist das notwendig? –

+0

@JohnB., Verwendet Ihr Programm 'serialEvent', um' input_string' von 'Serial' zu lesen (wie in serial0). Ich nehme an, das ist ein Befehl an den Sensor. Ich habe gerade von deiner Skizze gearbeitet. Schneiden Sie aus und fügen Sie meinen Codeabschnitt ein, um von Serial3 zu lesen, und verarbeiten Sie die Antwort, wenn die \ r schließlich ankommt. Beachten Sie auch die Antwort von mhopeng: "Serial3.print" in 'setup' sollte' Serial3.begin', LOL sein. –

0

Sie haben einen Fehler in Ihrem setup() Block: bevor Sie Daten über eine serielle Verbindung senden können Sie die Verbindung mit einer begin() Anweisung konfigurieren müssen:

Serial3.begin(9600) 

Aber in dem Code in Ihrer Frage, die Sie haben

Serial3.print(9600) 

Und stellen Sie sicher, dass Sie die EZO müssen die richtigen Pins verbunden Serial3 (14,15).

Sie müssen auch das "\" zum Drucken von Steuerzeichen verwenden.