【问题标题】:Arduino Soil Sensor RS-485 Protocol Response Value Conversion ProblemArduino土壤传感器RS-485协议响应值转换问题
【发布时间】:2021-09-13 04:37:38
【问题描述】:

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

【问题讨论】:

  • 您使用的是哪个传感器?您使用的是哪种 RS485 接口?
  • @김성빈 - 此语言不是 C。
  • @Armali - 对不起。谢谢。
  • @fpiette - KSM-8900 使用韩国公司的土壤传感器,RS-485 将 ESP-8266 连接到普通板上。 github.com/Kimseongbeen/korea-digital/blob/main/KSM-8900/…这个地址是我放在github上的土壤传感器手册。

标签: c arduino protocols serial-monitor


【解决方案1】:
    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编程语言的一种难以理解的行为。

【讨论】:

  • 谢谢。如您所说,传感器值将在您修改时正常打印。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多