0

boostのシリアルライブラリを使用するクラスBufferedAsyncSerialここを参照)に基づいて、モデムと通信するためのC++コードがいくつかあります。このようなC++の短いコードで

BufferedAsyncSerial device("/dev/ttyACM0",9600);
device.writeString("AT\r");
std::cout << device.readString() << std::endl;
boost::this_thread::sleep(boost::posix_time::seconds(2));
std::cout << device.readString() << std::endl;
device.close()

ATシリアルポートのアナログモデムにコマンドを送信し/dev/ttyACM0、ポートから正しい答え、つまり' OK'を受信することができます。その間のスリープは、モデムが入力を処理するための時間を確保するためです。

これらすべてをxmlrpcクラスにラップして、別のコンピューター間で読み取り/書き込みを通信します(テストでは、実際には同じコンピューターです)。そのため、xmlrpcPythonを使用して機能にアクセスします。

device = xmlrpclib.ServerProxy("http://localhost:8080/RPC2")
device.serial.open("/dev/ttyACM0")
device.serial.send("AT\r")
for i in range(100):
    time.sleep(0.1)
    print device.serial.read()

C ++サーバー側では、オープン/クローズ/読み取り/書き込み機能がそれに応じてラップされます。ポート名はボーレートと同じです。ただし、これらのPython関数を実行すると、ATはモデムに送信されますが(xmlrpc接続を介して読み戻すことができます!)、OK試行回数や試行時間に関係なく、表示されることはありません。

C ++ / boost / serial / xmlrpc / pythonスペシャリストが利用できる場合は、アドバイスをいただければ幸いです。ここにいくつかの追加のコメントとコメントがあります:

  • 使用されているC++xmlrpcサーバーはabyss/xmlrpc-cであり、どちらも私は精通していません
  • すべてのopen/write / read / closeチェーンをxmlrpcを介してカンニングできる単一の関数でコーディングすると、期待どおりの結果が得られます。
  • 実際のBufferedAsyncSerialインスタンスへのアクセスが1つのクラスを介して行われることを確認し、各コマンドの順序と詳細をログに記録しました。どちらの場合も同じです。私は何も見逃しません。
  • また、作業中のオブジェクトが同じオブジェクトである、つまりメモリ内に同じアドレスがあることを確認しました
4

0 に答える 0