2017-02-10 25 views
0

BeagleBoneブラックボードからArduino Unoにデータを送信しようとしています。私が選択したボーレートは300です。私はここにあるserialibライブラリを使用しています:http://serialib.free.fr/html/classserialib.html#ac8988727fef8e5d86c9eced17876f609あなたは2つのファイル(serialib.hとserialib.cpp)を見るために最後までスクロールすることができますが、メインのスニペットもここにあります。私はこのライブラリが信頼できないと言っているいくつかのレビューを読んでいますが、まず何かを疑う前に自分のコードをチェックしたいと思います。LinuxでのC++シリアル通信

これは私のBeagleBone上++私はCで書かれているプログラムであり、次のようにArduinoの宇野の

#include <iostream> 
#include "serialib.h" 

#ifdef __linux__ 
#define  DEVICE_PORT "/dev/ttyO1" 
#endif 

using namespace std; 
int main() 
{ 
    serialib LS; //the main class to access 
    int Ret; 

    Ret= LS.Open(DEVICE_PORT,300); 
    if (Ret!=1) 
    { 
     cout<<"cant open port\n"; 
     return 0; 
    } 
    else{cout<<"port now open \n";} 

    string xval="650X450Y"; 
    for(int i=0;i<500;i++)//send xval 500 times 
    { 
     for(int j=0;j<xval.length();j++)//send each character separately 
     { 
      Ret=LS.WriteChar(xval[j]); 
      LS.Close(); 
      LS.Open(DEVICE_PORT,300); 
     } 
     if (Ret!=1){cout<<"cannot write\n";} 
     else{cout<<"done writing\n";} 
    } 
    LS.Close(); 
    cout<<"Transmission complete\n"; 
} 

私のコードは次のとおりです。

#include <SoftwareSerial.h> 
SoftwareSerial uart(10,11); 
void setup() { 
// put your setup code here, to run once: 
Serial.begin(9600); //baud rate for Serial communication 
uart.begin(300); 
} 
char x; 
String data=""; 

void loop() 
{ 
if(uart.available()>0)//check if data is coming in 
{ 
    while(uart.available()) 
    { 
    x=uart.read();//read the incoming byte 
    data+=x;//append the string with incoming bytes 
    } 

    if(x=='Y')//received all the bits 
    { 
    Serial.println(data); //display received information 
    } 
} 
} 

C++ - 私が最初に私のUARTを開いています私の通信システムが堅牢であるかどうかを確認するために500回繰り返されるキャラクタごとに文字列 "650X450Y"を送信します。あなたが 'for'ループ内で見ることができるように、私はすべての文字を送信した後、このポートを閉じて開いています。これがなければ、かなりの間違ったデータが送られてしまい、このforループが非常に大きいと、これたびに、このポートを開閉した後(それはそのように振る舞う理由はわからない)、私はかなりの誤差を減らすために管理しているが、いくつかのエラーがまだあります:私はこの文字列を送信し

  • 500回が、1つのサンプルは、私はウノで受け取った "660X450Y"、間違った値だった。
  • 500回のうち約2〜3回は、「650X450Y650X450Y650X450Y」という繰り返しを受信して​​います。これは間違いなく文字列の長さではなく、このデータをどのように送信できますか。

私がウノで受け取った残りの文字列は完璧です。

私は文字で読み込み、dataという名前の文字列に追加していて、文字列の最後を示すバイト 'Y'が検出されるとすぐにこのデータを出力しています。以前私のC++コードでWriteString()関数を使用しましたが、いくつかのエラーがありました。私が提供したコードは、このシステムを100%信頼性と堅牢性を確保するために、デバッグは、しかし、私は本当になぜシステムがまだ100%ではないのか分かりません。

ライブラリ内の両方のファイルのソースコードを見て、serialib.cppの210行目で定義されているWriteChar(char Byte)関数を観察しました。これは既に送信されているリンクです。文字:

if (write(fd,&Byte,1)!=1)  // Write the char 
    return -1;  // Error while writting 
return 1; // Write operation successfull 

私は100%の精度でデータを受信できない理由は、この機能に何か問題が、その後、私のソースコードのいずれか一方の両方に何か問題があります表示されていない?べきI私は他のライブラリを選択してもまだ私の結果が得られない場合、私は、例えばBluetoothモジュールを使って無線でこの情報を送信しなければならないかもしれないと思います。誰かがこの問題に関する提案/改善をしているなら私に教えてください:)それまで100%の精度を達成するために他の方法を試みます。

+0

Linuxのシリアルポート経由で通信するライブラリは必要ありません。あなたは間違った方向に行きます。ここには良いリソースがあります:https://www.cmrr.umn.edu/~strupp/serial.html –

+0

@AndrejsCainikovs注目。私は最近これを見つけましたが、まだ実装されていませんが、確かに試してみます。 –

+1

さらに、LS.WriteChar() - LS.Close() - LS.Open()のシーケンスは本当に変です。 – linuxfan

答えて

0

Linux端末ですばやく実行できるかどうかを確認するのが最も簡単で、ライブラリはそのために使用されません。

  1. はUART1のために300にボーレートを設定します(sttyの-Fは/ dev/ttyO1生&のstty -Fは/ dev/ttyO1 300)

  2. あなたは単純に書き込むことでUART1にデータを送ったことができます(または読み取り)あなたのケースであるUART1のデバイスファイルへの/ dev/ttyO1

執筆: "650X450Y" エコー>は/ dev/ttyO1

読書:猫は/ dev/ttyO1

これをCコードで実行したい場合は、open/read/write/close syscall関数を使用できます。

関連する問題