2012-02-17 7 views
2

この種の質問はインターネット上に散らばっていますが、何も私を正しく指し示すものはありません。シリアル・ストリームへのバイト書き込み

私はPropellerコントロールボードにシリアルストリームでコマンドを送信しようとしています。接続は機能しているようですが、送信するコマンドの種類によっては打撃エラーが発生します。10ffffffe1という同じ16進数のデータが返されます。送信されるデータが正しい形式でないようです。ボードはバイトデータを期待しているようですが、私のコードはそれをやっているようですが、私が間違っていることは分かりません。私はデータを正しく変換していないと思う。以下は私のコードです。みんな、ありがとう。

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

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

}

答えて

0

はい、使用するライブラリを移動した後、別のものと同時にこの問題を解決することができます。この私の問題は、別の問題と同じ解決策を持っています。あなたはここに行く: Writing STRINGS to serial port in C++ linux

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

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

あなたの現在のコードは、ポインタのサイズである、sizeof dataを使用し、あなたの尖った-へのデータの長さについては何も伝えていません。

"デフォルト"ボーレートを使用することも非常にうまくいかないようです。

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

私はPOSIX標準機能 opentcsetattrreadを使用することをお勧めし

、およびシリアルポートを使用するためwriteは、広く使用され、任意のバグが長く以来発見され、修正されました。

+0

str.size()に関するアドバイスをいただき、ありがとうございます。明日の朝仕事でそれを最初に試してみるでしょう。それがうまくいくことを望みます。 ええ、デフォルトのボーレートの問題も問題ですが、私はこれを現時点で持ち上げたいとは思っていませんでした。場合によっては、デフォルト以外のボーレートの設定はできません。すべてエラーを返します。どうしてか分かりません。理由を知っていると思いますか? –

+0

@ 30hoursflight:シリアルポートライブラリが表示されていないと、他のボーレートが動作していない理由がわかりません。実際のPC-ATシリアルポート、またはUSBシリアルアダプタですか?そして私は間違ったボーレートを使用するとあなたの質問が話すゴミデータの種類を与えると信じています。あなたはボーレートを解決するまでは何も解決できません。 –

+0

しかし、私はデバイスからシリアルデータを読み取る別のプログラムを持っています。ボーレートと同じ問題がありますが、正しいデータを読み取ることができます。したがって、私はボーレートが大きな問題ではないと考えました。どう思いますか?シリアルポートライブラリの名前は、コードに見られるように "LibSerial"です。私は彼らが有効なボーレート値であると確信しています。どう思いますか? –

0

あなたは

str.c_str() 

代わりの

str.data() 

を使用してみましたか? std :: string.data()はヌルで終了するCスタイルの文字列を返すことは保証されません。 std :: stringをCスタイルのconst char *に変換する場合は、.c_str()を使用してください。

+0

私が見たすべての 'write'関数は、NULで終了するのではなく、カウントされたバッファを使います。そして、それもまたここにあるようです。 –

+0

右に。これは、サイズを示す関数の第2パラメータを説明します。 D'oh! – bstamour

+0

ええ、私はそれが問題ではないと思います。しかし、まだ、ありがとう。私は明日もそれを打つつもりです。 –

関連する問題