Устройство не отвечает на команды 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() и работает нормально. Я не знаю, что я делаю не так.
Я понимаю, что мне нужно написать процедуру, чтобы принять все, что поступает от датчика. Но ничего, кажется, даже не отправлено на датчик в первую очередь!
Любая помощь будет принята с благодарностью. Спасибо
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.:П
У вас есть ошибка в вашем setup()
блокировать: прежде чем вы сможете отправлять данные через последовательное соединение, вам необходимо настроить соединение с begin()
заявление:
Serial3.begin(9600)
Но в коде в вашем вопросе у вас есть
Serial3.print(9600)
И убедитесь, что EZO подключен к правильным контактам для Serial3 (14,15).
Также вам нужно использовать "\" для печати управляющих символов.