问题描述
我正在研究使用土壤传感器的协议,但该值不是数字或文本。
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 编程语言的一种难以理解的行为。