设备不响应 UART 命令
Device not responding to UART commands
我正在使用 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() 函数发送一个字符串,它工作正常。我不知道我做错了什么。
我知道我需要编写一个程序来接收来自传感器的任何信息。但是一开始似乎什么也没有发送到传感器!
如有任何帮助,我们将不胜感激。谢谢
您使用的是斜杠,而不是反斜杠。改变这个
Serial3.print("R/r");
对此:
Serial3.print("R\r");
并且不要使用 String
class。它会把你搞砸的。 :) 只需使用 char 数组,并在循环中使用字符时填充它们。当 \r 最终到达时,处理数组:
char inputString[16];
int inputStringIndex = 0;
void loop()
{
if (Serial.available()) {
char c = Serial.read();
if (c == '\r') {
inputString[ inputStringIndex ] = '[=12=]'; // 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
您的 setup()
块中有一个错误:在您可以通过串行连接发送数据之前,您需要使用 begin()
语句配置连接:
Serial3.begin(9600)
但是在你问题的代码中你有
Serial3.print(9600)
并确保将 EZO 连接到 Serial3 (14,15) 的正确引脚。
还需要使用“\”来打印控制字符。
我正在使用 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() 函数发送一个字符串,它工作正常。我不知道我做错了什么。
我知道我需要编写一个程序来接收来自传感器的任何信息。但是一开始似乎什么也没有发送到传感器!
如有任何帮助,我们将不胜感激。谢谢
您使用的是斜杠,而不是反斜杠。改变这个
Serial3.print("R/r");
对此:
Serial3.print("R\r");
并且不要使用 String
class。它会把你搞砸的。 :) 只需使用 char 数组,并在循环中使用字符时填充它们。当 \r 最终到达时,处理数组:
char inputString[16];
int inputStringIndex = 0;
void loop()
{
if (Serial.available()) {
char c = Serial.read();
if (c == '\r') {
inputString[ inputStringIndex ] = '[=12=]'; // 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
您的 setup()
块中有一个错误:在您可以通过串行连接发送数据之前,您需要使用 begin()
语句配置连接:
Serial3.begin(9600)
但是在你问题的代码中你有
Serial3.print(9600)
并确保将 EZO 连接到 Serial3 (14,15) 的正确引脚。
还需要使用“\”来打印控制字符。