2017-07-10 7 views
0

シリアルポートからエンジン制御システムの文字列データを分割する質問があります。通信プロトコルの説明は以下の通りです。Arduinoで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は2つの文字列を返します。最初に、受信したコマンドのコピーと、次に要求されたデータが続きます。上記の例では、返されます:

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

Payload in ASCII “TrimLow EGT 20CRpm 50.000Pw=124” 
2Ch -> “,” Separator 
0Dh -> CR, last byte. 

私は文字列形式で画面上のすべてのデータを読み取りました。 RCVをECUに送信すると、上記の形式に従ってRPM、温度、ポンプ電圧、バッテリ電圧、スロットルが返されます。

Xicoyの説明:(コマンド、意味、ペイロード)

RCV読み出し電流値のRPM、EGTºCで、ポンプパワー、バッテリの電圧、スロットル%

byte veri[]= { 0xC7, 0x2C, 0x52, 0x43, 0x56, 0x2C, 0x0D }; // for RCV 

データシート(5-6-7ページ):http://www.xicoy.com/SerialAdapt1_0.pdf

#include <SoftwareSerial.h> 
SoftwareSerial mySerial(10, 11); // RX, TX 
int i=0; 
byte veri[]= { 0xC7, 0x2C, 0x52, 0x43, 0x56, 0x2C, 0x0D }; // RCV 
int myTimeout = 100; 

void setup() { 
    Serial.begin(9600); 
    mySerial.begin(9600); 
    mySerial.setTimeout(myTimeout); 
} 

void loop() { 
    Serial.println(mySerial.readString()); 
    for(i=0;i<7;i++) 
    { 
    mySerial.write(veri[i]); 
    } 
} 

RPM、EGT°C、ポンプ電圧、バッテリ電圧、およびスロットル率は、ECUから戻ってくるデータパケットに含まれていますか?識別プロセスの後、私は2番目のシリアルポート経由でLabViewに送信します。 RPM値は6桁(約120000 RPM)、排気ガス温度は3桁(EGT 800°C)ですが、スロットル値を除いてすべてゼロであるため、数値が失われることがあります。サンプルを共有できますか?ありがとう。

画像:値が大きいので

+0

arduinoのは、CSV解析ライブラリを持っていますか?私はArduinosをあまりよく知らない。 – Gaurav

+1

通常の 'sscanf'は動作します。ArduinoはC++の亜種を使用しているので、部分文字列を取得する他の方法があるかもしれません。 –

答えて

-1

、彼らはparseInt()によって解析することはできません。一般的にはそう

void setup() { 
    Serial.begin(9600); 
} 

void loop() { 

    String csv = "123,34566,12"; 

    int lastcommaPos; 
    int commaPos = csv.indexOf(',', 0); // find first comma 
    String val1 = csv.substring(0, commaPos); // grab first value 

    lastcommaPos = commaPos + 1; 
    commaPos = csv.indexOf(',', lastcommaPos); // find next comma 
    String val2 = csv.substring(lastcommaPos, commaPos); // grab next value 

    lastcommaPos = commaPos + 1; 
    commaPos = csv.indexOf(',', lastcommaPos); // find next comma 
    String val3 = csv.substring(lastcommaPos, commaPos); // grab next value 

    Serial.println(val1); 
    Serial.println(val2); 
    Serial.println(val3); 

    delay(2000); 
} 

:そのためには、最初にカンマを見つけることによって解析し、いくつかの文字列を行うために必要になるだろう

  1. 次を検索コンマ
  2. 現在の位置を追跡します2つの間の部分文字列を取得
  3. 更新位置
  4. 完了するまで繰り返します。
+0

私のために働いていません..ありがとう – aytac

+0

@aytac大きな値を解析しているのが分かります。私の更新された答えを見てください。 – TomServo

+0

@aytac私は今、Unoで動作している完全な実例を投稿しました。これは機能します。 – TomServo

-1

回答もあります。

#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); 
} 

*/

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]) : ""; 
} 
関連する問題