Arduino 土壤传感器 RS-485 协议响应值转换问题

问题描述

我正在研究使用土壤传感器的协议,但该值不是数字或文本。
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,0x03,0x00};  //[1,4,7,3,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]);
  }
}

解决方法

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

您似乎在 String Addition Operator 教程中错过了这一点:

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

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 编程语言的一种难以理解的行为。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...