2016-11-20 17 views
0

私は、このリンクでSerialClass.hとSerial.cppを使用します。http://playground.arduino.cc/Interfacing/CPPWindowsアルドゥイーノとC++シリアル通信同期

私のmain.cppに:

#include <stdio.h> 
#include <tchar.h> 
#include "SerialClass.h" // Library described above 
#include <string> 

// application reads from the specified serial port and reports the collected data 
int main(int argc, _TCHAR* argv[]) 
{ 

    printf("Welcome to the serial test app!\n\n"); 

    Serial* SP = new Serial("COM4"); // adjust as needed 

    if (SP->IsConnected()) 
     printf("We're connected\n"); 

    char incomingData[256] = "hello"; 
    int dataLength = 255; 
    int readResult = 0; 

    while(SP->IsConnected()) 
    { 
     readResult = SP->ReadData(incomingData,dataLength); 
     incomingData[readResult] = 0; 

     if(readResult != 0){ 
      printf("%s",incomingData); 
      printf("---> %d\n",readResult); 
     } 
     Sleep(500); 
    } 
    return 0; 
} 

私のArduinoのコード:

int mySize = 5; 
char incomingData[256] = "hello"; 

void setup(){ 
    Serial.begin(9600); // Seri haberleşmeyi kullanacağımızı bildirdik 
    pinMode(LedPin, OUTPUT); //LedPini çıkış olarak tanımlıyoruz. 
} 

void loop(){ 

    incomingData[mySize] = 't'; 
    ++mySize; 

    Serial.write(incomingData); 

    delay(500); 
} 

Arduinoは文字配列を書き込み、C++はそれを読み取ります。問題は、cppがデータを失っていることがあります。私の出力:

output

は私の最初の質問は、私はこのために何ができるのですか? ArduinoとC++の同期方法C++はarduinoが書き終えるまで待つべきです。私はロックシステムなどを使うべきだと思う。

その他の質問私は自分のArduinoとC++プログラムが常にコミュニケーションしたいと思っています。私はそれをしたい: "Arduino書き込み"後に "C + +の書き込み"の後に "C + +の書き込み"は、 "Arduino"の後に再び "Arduino"を書き込みます。だから、私は睡眠と遅延を使用しません。私の2番目の質問は、この同期のためにどうすればいいのですか?答えは最初の質問の答えと同じだと思います。

答えて

1

使用しているC++クラスは、独自の内部バッファを実装しておらず、ハードウェアバッファとOSドライババッファに依存しています。

​​

あなたの受信コードでSleep(500)遅れがありOS・ドライバ・バッファは、( - > [ポート - - >ドライバのプロパティ]> [ポート設定デバイスマネージャ)増加させることができました。このような500msの遅延の間、UARTハードウェアとソフトウェアドライバのバッファがいっぱいになると想像してください。しかし、あなたのコードは「スリープ状態」であり、バッファされたデータは読み込まれませんでした。この期間に受け取ったデータは破棄されます。 WindowsはリアルタイムOSではないため、Windowsプロセスでは(他にも多くのプロセスが存在するため)十分なタイムスライスが得られず、そのような拡張された非アクティブなデータが失われる可能性があります。したがって、Sleep(500)を削除してください。

信頼できる通信を保証するために、受信側は新しいデータを検出するとすぐにデータをバッファリングする必要があります(通常、別のスレッドで優先度が高くなる可能性があります)。メインの処理ロジックは、そのバッファされたデータで動作します。

また、あなたは、少なくとも2次で、プロトコルのいくつかの種類を実装しなければならない。

  • メッセージ形式(、起動、終了、サイズなど)
  • メッセージの完全性は、(データが破損せずに受信され、単純なことができチェックサム)

また、ある種のトランスミッションコントロールも良いでしょう(タイムアウト、応答/確認応答があれば)。

UPD:ArduinoコードでSerial.write(incomingData); incomingDataが適切にゼロ終端されていることを確認してください。 mySizeの上限チェックを追加...