シリアルポートからエンジン制御システムの文字列データを分割する質問があります。通信プロトコルの説明は以下の通りです。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)ですが、スロットル値を除いてすべてゼロであるため、数値が失われることがあります。サンプルを共有できますか?ありがとう。
画像:値が大きいので
arduinoのは、CSV解析ライブラリを持っていますか?私はArduinosをあまりよく知らない。 – Gaurav
通常の 'sscanf'は動作します。ArduinoはC++の亜種を使用しているので、部分文字列を取得する他の方法があるかもしれません。 –