2

この種の質問はインターネット全体に散らばっていることに気づきましたが、私を正しく指し示しているものは何もないようです。

シリアルストリームを介してプロペラコントロールボードにコマンドを送信しようとしています。接続は機能しているようですが、送信するすべての種類のコマンドでエラーが発生し続けます。同じ16進データである10ffffffe1が返されます。送信されているデータが正しい形式ではないようです。ボードはバイトデータを期待しているようで、(私は)私のコードはそれを実行しているようですが、私は自分が何を間違っているのか理解できません。データを正しく変換していないと思います。これが私のコードです。みんな、ありがとう。

注:以下のコードは、応答の読み取りを示していません。それは私の別のプログラムで行われ、動作し、シリアル端末からの応答も正しく読み取ります。

#include <iostream>
#include <SerialStream.h>
using namespace LibSerial;
using namespace std;
int main(int argc, char** argv) {

SerialStream serial;
serial.Open("/dev/ttyUSB0");
serial.SetCharSize(SerialStreamBuf::CHAR_SIZE_8);
serial.SetBaudRate(SerialStreamBuf::DEFAULT_BAUD);
serial.SetNumOfStopBits(1);
serial.SetFlowControl(SerialStreamBuf::FLOW_CONTROL_NONE);
if(serial.good()){
    cout << "SUCCESSFUL: serial port opened at: /dev/ttyUSB0" << endl;
    usleep(5000);
}
else{
    cout << "ERROR: Could not open serial port." << endl;
    return 1;
}

std::string str= "ver\r"; //command to get version of firmware
const char* data = str.data();
serial.write(data, sizeof data);
return 0 ;

}

4

3 に答える 3

4
serial.write(str.data(), str.size());

現在のコードsizeof dataでは、ポインタのサイズであるを使用しており、ポイントされたデータの長さについては何も教えてくれません。

「デフォルト」のボーレートを使用することも、機能する可能性は非常に低いようです。

それらを修正した後も問題が解決しない場合は、おそらく非標準SerialStreamクラス(標準C ++ライブラリまたはPOSIXの一部ではありません)です。あなたがそれへのリンクを提供するならば、私たちはそれが正しいかどうか見てみることができます。

POSIX標準関数、、、を使用することをお勧めしopenますtcsetattrreadこれらwriteは広く使用されており、バグは長い間発見されて修正されているためです。

于 2012-02-17T17:08:58.503 に答える
0

使ってみましたか

str.c_str()

それ以外の

str.data()

?std :: string.data()は、nullで終了するcスタイルの文字列を返すことが保証されていません。std::stringをcスタイルのconstchar*に変換する場合は、.c_str()を使用します。

于 2012-02-17T17:11:21.207 に答える
0

ええ、使用するライブラリにシフトした後、私は別の問題と同時にこの問題を解決することができました。私のこの問題は、別の問題と同じ解決策を持っています。ここにあなたたちは行きます: C++Linuxのシリアルポートに文字列を書く

本当に助けてくれてありがとう!

于 2012-02-18T13:26:54.417 に答える