1

我正在研究带有土壤传感器的协议,但该值不是数字或文本。
TT
代码

 Serial.print(inChar,HEX);
  for(int i=0;i<9;i++){
    Serial.println(inputString.charAt(i));
   }

结果

14600AD700D373
1
4
6
F [3]
A7 [4]
B [5]
54 [6]
0 [7]
6 [8]
D3 //CRC
73 //CRC

代码

ss=((int)inputString.charAt(3)*256+(int)inputString.charAt(4))/100;
    Serial.println("MO : "+ss);
    ss=((int)inputString.charAt(5)*256+(int)inputString.charAt(6))/100;
    Serial.println("TEM : "+ss);
    ss=((int)inputString.charAt(7)*256+(int)inputString.charAt(8))/100;
    Serial.println("EC : "+ss);
    inputString="";
    Serial.println("");

结果

MO : 
TEM :  → //Characters such as arrows, not numbers
EC :  //no answer

Arduino 串行监视器省略了之前的零值。

inputString.charAt[3]=0F,
inputString.charAt[4]=A7,  
inputString.charAt[5]=0B,
inputString.charAt[6]=54,  
inputString.charAt[7]=00,
inputString.charAt[8]=06

结合 inputString[3],[4] 并除以 100,剩下的 [5][6],[7][8] 分别是温度和 EC。
例如) 0FA7(16) -> 4007(10) 4007/100 -> 40.07%VMC
0B54(16) -> 2900(100) 2900/100 -> 29'C

我编写了一个代码来将传感器值转换为我们知道的值,但是这些值不能正常输出。
可能 char 变量的大小最大为 256,因此出现错误。我试图将 int 更改为 float 并再次尝试,但值没有出来。
你知道问题可能是什么吗?请帮我!

我的 Arduino 草图

#include <Ticker.h>
#include "CRC.h"
#include <SoftwareSerial.h>
Ticker ticker;
SoftwareSerial mySerial(D7, D4); // RX, TX

String inputString = "";         
int counter=0;

void tick()
{
 // Serial.println ( WiFi.localIP() );
  counter++;
  crd16Rtu();
}

void setup() {
  Serial.begin(115200);
  mySerial.begin(115200);
  ticker.attach(3, tick); 

}

void loop() {
  serialEvent();
}

void serialEvent() {
  if(mySerial.available() == false)
    return;
  while (mySerial.available()) {
    // get the new byte:
    char inChar = (char)mySerial.read();
    Serial.print(inChar,HEX);
    // add it to the inputString:
    inputString += inChar;
  }
  Serial.println("");
  if(inputString.length() >= 11) {
    String ss="";
   for(int i=0;i<9;i++){
    Serial.println(inputString.charAt(i));
   }
    
    ss=((int)inputString.charAt(3)*256+(int)inputString.charAt(4))/100;
    Serial.println("MO : "+ss);
    ss=((int)inputString.charAt(5)*256+(int)inputString.charAt(6))/100;
    Serial.println("TEM : "+ss);
    ss=((int)inputString.charAt(7)*256+(int)inputString.charAt(8))/100;
    Serial.println("EC : "+ss);
    inputString="";
    Serial.println("");

  } 
}

// RS485 out
void crd16Rtu() {
  char str[24] =  {0x01,0x04,0x00,0x07,0x00,0x03,0x00,0x00};  //[1,4,0,7,0,3,0,0],
  String s;
  int si,sj,len;

  len=6;
  
  uint8_t * data = (uint8_t *) &str[0];
  si=crc16(data, len, 0x8005, 0xFFFF, 0x0000, true,  true  );
  sj=si&0xff;
  str[len]=sj;
  sj=si>>8;
  str[len+1]=sj;

  for(int i=0;i<len+2;i++) {
    mySerial.print(str[i]);
    //Serial.println((int)str[i]);
  }
}
4

1 回答 1

0
    Serial.println("MO : "+ss);

您似乎在字符串加法运算符教程中错过了这一点:

注意: 在同一行上连接多个变量类型时应小心,因为您可能会得到意想不到的结果。例如:

int sensorValue = analogRead(A0);
String stringOne = "Sensor value: ";
String stringThree = stringOne + sensorValue;
Serial.println(stringThree);

导致“传感器值:402”或任何analogRead()结果,但是

int sensorValue = analogRead(A0);
String stringThree = "Sensor value: " + sensorValue;
Serial.println(stringThree);

给出不可预测的结果,因为stringThree在您开始连接不同的数据类型之前从未获得初始值。

这确实是奇怪的 Arduino 编程语言的一种难以理解的行为。

于 2021-07-01T09:21:13.183 回答