2016-05-08 4 views
1

私はBeaglebone BlackでUART経由で画像を書き込もうとしています。しかし、私がライブラリでwrite()関数を使うと、かかわらずagurment nbyteLinuxのC/C++でwrite()関数を使ってUART経由で70kBを書き込むBeaglebone Black

int write(int handle, void *buffer, int nbyte); 

intタイプを持って、私は一度に70KBを転送することはできません。転送されたバイト数を表示し、結果はバイト数= 4111です。

length = write(fd,body.c_str(),strlen(body.c_str())); // 
cout<<length<<endl; // result length = 4111; 
cout<<strlen(body.c_str())<<endl; // result strlen(body.c_str()) = 72255; 

私はあなたからお聞きしたいと思います!

+0

すべてが送信されるまで残ったデータを書き込もうとしましたか? – nwp

+0

'body'が' std :: string'オブジェクトの場合、 'strlen'呼び出しの代わりに' body.length() '(または' body.size() ')を使わないのはなぜですか? –

+0

あなたの問題については、ループで書くことを考えましたか? –

答えて

2

writeコールでは、指定された量のデータを書き込むことはできません。そのため、返される値としてはブール値ではありません。表示される動作は実際には異なるオペレーティングシステム間で共通しています。アンダーラインデバイスが70 KBを書き込むのに十分なバッファまたはストレージがない可能性があります。あなたが必要なのはループで書くことです、各書き込みは未書き込みのまま残っている量を書き込みます:

int total = body.length(); // or strlen(body.c_str()) 
char *buffer = body.c_str(); 
int written = 0; 
int ret; 
while (written < total) { 
    ret = write(fd, buffer + written, total - written); 
    if (ret < 0) { 
     // error 
     break; 
    } 
    written += ret; 
} 
+0

説得力のある説明をありがとう!それは私のために非常に便利です。私はこの問題の解決策を見つけたと思います:) –

関連する問題