0

わかりました、問題が発生しました。Microsoft Flight Simulator X SDK と Arduino を使用するものをプログラミングしています。アプリケーションは、シリアルポートを介してarduinoボードにデータを送信することになっています。私はこの関数を使用しています:

http://playground.arduino.cc/Interfacing/CPPWindows

プログラムは、突然動作しなくなることを除いて、完全に動作します。このプログラムはループ while(1) であり、シミュレーターにデータを要求する関数を継続的に実行し、シリアル経由で文字列を送信します。これは、関数 WriteData を呼び出す方法です。

WriteData((char *)cadena.c_str(),8);

cadenaが送信している文字列であること。関数 WriteData は次のとおりです。

bool Serial::WriteData(char *buffer, unsigned int nbChar)
{
    DWORD bytesSend;
    //Try to write the buffer on the Serial port
    if(!WriteFile(this->hSerial, (void *)buffer, nbChar, &bytesSend, 0))
    {
        //In case it don't work get comm error and return false
        ClearCommError(this->hSerial, &this->errors, &this->status);

        return false;
    }
    else
        return true;
    }

全体をコメントするとif-else、関数WriteFileが呼び出されないため、プログラムは動作を停止せず、完全に続行することがわかりました (情報が Arduino に送信されないという事実を除いて)。その行が実行されると、プログラムは約 1 分後に停止します。停止とは、クラッシュなどを意味するのではなく、停止することを意味するだけです.コンソールはすべてのメッセージとともにまだそこにあり、動作を停止するだけです.

何が起こっているのでしょうか?

編集: わかりました、arduino は、プログラムによって読み取られることのないデータを継続的に送信していましたが、それは問題になる可能性がありますか? バッファがいっぱいで、WriteFile がそれに書き込むスペースを待っていたのではないでしょうか?シリアルに書き込んでいないことを知っているので、問題なく動作しているようです...

4

1 に答える 1

0

送信バッファがいっぱいになると、WriteFile() は停止します。ハンドシェイクを正しく設定した場合にのみ空になります。Arduinoでスキップされる傾向があるDSRおよびCTS信号を電気的に配線します。または、ハンドシェークを無効にして SetCommState() 関数を使用します。SetCommTimeouts() でタイムアウトを設定することは、最小限のエラー回復を追加するもう 1 つの適切な戦略です。

Arduino から送信されたデータを読み取らないことも、多くのポイントを獲得しません。一度に 1 つの問題を解決することに集中できるように、これを段階的に実装することが確かに最善です。ただし、通常、ハンドシェイク配線の間違いによる PC のデータ送信を妨げることはありません。

于 2013-06-01T20:25:37.760 に答える