如何在Arduino上拆分ECU字符串数据?

如何在Arduino上拆分ECU字符串数据?,arduino,arduino-uno,Arduino,Arduino Uno,我有一个从串行端口分离发动机控制系统字符串数据的问题。通信协议描述如下 例如: 检索FADEC LCD屏幕上显示的数据。如果命令为RSD,则输出为: **C7h 2Ch 52h 53h 44h 2Ch 0Dh** C7h -> Sync 2Ch -> “,” Separator 52h -> “R” 53h -> “S” 44h -> “D” 2Ch -> “,” Separator 0Dh -> CR, last byte. ECU将返回两个字符串

我有一个从串行端口分离发动机控制系统字符串数据的问题。通信协议描述如下

例如: 检索FADEC LCD屏幕上显示的数据。如果命令为RSD,则输出为:

**C7h 2Ch 52h 53h 44h 2Ch 0Dh**

C7h -> Sync
2Ch -> “,” Separator
52h -> “R”
53h -> “S”
44h -> “D”
2Ch -> “,” Separator
0Dh -> CR, last byte.
ECU将返回两个字符串。首先是接收到的命令副本,然后是请求的数据。在上面的示例中,它将返回:

**C7h, RSD, 0Dh**
C7h -> Sync byte
2Ch -> “,” Separator

Payload in ASCII “TrimLow EGT 20CRpm 50.000Pw=124”
2Ch -> “,” Separator
0Dh -> CR, last byte.
我以字符串格式读取屏幕上的所有数据。当我向ECU发送
RCV
时,它将根据上述表格返回转速、温度、泵电压、蓄电池电压和节气门

Xicoy说明:(命令、含义、有效载荷)

RCV读取当前值RPM、EGT(单位:摄氏度)、泵功率、蓄电池电压、节气门%

byte veri[]={0xC7、0x2C、0x52、0x43、0x56、0x2C、0x0D};//对于RCV
和数据表(第5-6-7页):

#包括
软件系列mySerial(10,11);//接收,发送
int i=0;
字节veri[]={0xC7、0x2C、0x52、0x43、0x56、0x2C、0x0D};//RCV
int myTimeout=100;
无效设置(){
Serial.begin(9600);
mySerial.begin(9600);
mySerial.setTimeout(myTimeout);
}
void循环(){
Serial.println(mySerial.readString());
对于(i=0;i而言,答案也是

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

int i=0;
byte veri[]= { 0xC7, 0x2C, 0x52, 0x43, 0x56, 0x2C, 0x0D }; // RCV
int myTimeout = 10;  
String veri2[]={};
void setup() {
Serial.begin(9600);
while (!Serial) {
}
analogWrite(5,250);
mySerial.begin(9600);
mySerial.setTimeout(myTimeout);
}

void loop() { // run over and over

for(i=0;i<7;i++)
{
mySerial.write(veri[i]);
}

String split = mySerial.readString();
String word3 = getValue(split, ',',0);
Serial.println(word3);
for(i=0;i<7;i++)
{
mySerial.write(veri[i]);
}

String  split2 = mySerial.readString();
String word4= getValue(split2, ',',1);
Serial.println(word4);
 /*
split = mySerial.readString();
word3 = getValue(split, ',',2);
Serial.println(word3);
split = mySerial.readString();
word3 = getValue(split, ',',3);
Serial.println(word3);
split = mySerial.readString();
word3 = getValue(split, ',',4);
Serial.println(word3);
split = mySerial.readString();
word3 = getValue(split, ',',5);
Serial.println(word3);
split = mySerial.readString();
word3 = getValue(split, ',',6);
Serial.println(word3);
split = mySerial.readString();
word3 = getValue(split, ',',7);
Serial.println(word3);
}
#包括
软件串行mySerial(10,11);//接收,发送
int i=0;
字节veri[]={0xC7、0x2C、0x52、0x43、0x56、0x2C、0x0D};//RCV
int myTimeout=10;
字符串veri2[]={};
无效设置(){
Serial.begin(9600);
而(!串行){
}
模拟写(5250);
mySerial.begin(9600);
mySerial.setTimeout(myTimeout);
}
void loop(){//反复运行

(i=0;IDOU-ARDUNO有CSV解析库?我对ARDuiOS不太熟悉。正常的<代码> sSCANF String getValue(String data, char separator, int index) { int found = 0; int strIndex[] = {0, -1}; int maxIndex = data.length()-1; for(int i=0; i<=maxIndex && found<=index; i++){ if(data.charAt(i)==separator || i==maxIndex){ found++; strIndex[0] = strIndex[1]+1; strIndex[1] = (i == maxIndex) ? i+1 : i; } } return found>index ? data.substring(strIndex[0], strIndex[1]) : ""; }