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