Устройство не отвечает на команды UART

Я использую Arduino mega2560 и EZO EC (электропроводность) и пытаюсь отправить команду с помощью функции 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(), и она работает нормально. Я не знаю, что я делаю неправильно.

Я понимаю, что мне нужно написать процедуру для приема всего, что приходит с датчика. Но, похоже, на датчик вообще ничего не отправляется!

Любая помощь будет принята с благодарностью. Спасибо


person John B.    schedule 23.06.2016    source источник


Ответы (2)


Вы используете косую черту, а не обратную косую черту. Изменить это

Serial3.print("R/r");

к этому:

Serial3.print("R\r");

И не используйте класс String. Это запутает вас. :) Просто используйте массивы символов и заполняйте их, поскольку символы доступны в цикле. Когда \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. :П

person slash-dev    schedule 23.06.2016
comment
Привет, слэш-дев, хорошо, я попробую это. Но как я понимаю датчик, так это то, что датчик должен отправить *ER обратно в серийный номер Arduino, к которому он подключен. Если ему была отправлена ​​​​команда, но те ее не понимают. Он отправит *OK, если поймет это. Так что он должен, по крайней мере, получать команду, которую я отправляю. например если я отправлю R, то он должен хотя бы получить команду. Но из моего тестирования я знаю, что он даже не получает его. Можете ли вы объяснить, почему это так? - person John B.; 24.06.2016
comment
Вопрос: Почему вы делаете это Serial.available() и Serial.read()? Разве это не должен быть Serial3? Так как я хочу писать прямо в Serial.3 вообще не хочу использовать Serial0. Или это необходимо? - person John B.; 24.06.2016
comment
@JohnB., ваша программа использует serialEvent для чтения input_string из Serial (как в серийном номере 0). Я предполагаю, что это команда сенсору. Я просто работал по вашему эскизу. Вырежьте и вставьте мой фрагмент кода для чтения из Serial3 и обработки ответа, когда наконец прибудет ‹kbd›\r‹/kbd›. Также обратите внимание на ответ mhopeng ниже: Serial3.print в setup должно быть Serial3.begin, LOL. - person slash-dev; 24.06.2016
comment
Спасибо за помощь. Мой код работает хорошо уже более 2 недель. Ваше здоровье : >> - person John B.; 06.07.2016

У вас есть ошибка в вашем блоке setup(): прежде чем вы сможете отправлять данные по последовательному соединению, вам необходимо настроить соединение с begin() заявление:

Serial3.begin(9600)

Но в коде вашего вопроса у вас есть

Serial3.print(9600)

И убедитесь, что EZO подключен к правильным контактам для Serial3 (14,15 ).

Также вам нужно использовать «\» для печати управляющих символов.

person mhopeng    schedule 24.06.2016