0

シリアル通信にブースト asio を使用しようとしています。私は現在 Windows で作業していますが、最終的にはコードを Linux に移行する予定です。コンピューターを再起動すると、プログラムから送信されたデータが本来あるべきものではなくなり (たとえば、null の後にキャリッジ リターンを送信し、"00111111 10000011" をバイナリで取得する)、一貫性がありません (複数の null によって異なるバイナリが生成されます)。 .

ただし、他のプログラムを使用してシリアルポートにデータを送信し、プログラムを再度実行するとすぐに、完全に機能します。ポートの初期化で何かが欠けているに違いないと思いますが、私の調査では何も判明していません。

ポートを開く方法は次のとおりです。

// An IOService to get the socket to work
boost::asio::io_service *io;
// An acceptor for getting connections
boost::shared_ptr<boost::asio::serial_port> port;

// Cnstructor Functions
void Defaults() {
    io = new boost::asio::io_service();

    // Set Default Commands
    command.prefix = 170;
    command.address = 3;
    command.xDot[0] = 128;
    command.xDot[1] = 128;
    command.xDot[2] = 128;
    command.throtle = 0;
    command.button8 = 0;
    command.button16 = 0;
    command.checkSum = 131;
}

void Defaults(char * port, int baud) {
    Defaults();

    // Setup the serial port
    port.reset(new boost::asio::serial_port(*io,port));
    port->set_option( boost::asio::serial_port_base::baud_rate( baud ));

    // This is for testing
    printf("portTest: %i\n",(int)port->is_open());
    port->write_some(boost::asio::buffer((void*)"\0", 1));
    boost::asio::write(*port, boost::asio::buffer((void*)"\0", 1));
    boost::asio::write(*port, boost::asio::buffer((void*)"\r", 1));
    boost::asio::write(*port, boost::asio::buffer((void*)"\r", 1));
    Sleep(2000);
}

編集:関連のないコードを削除しようとして、ボーレートを設定した行を誤って削除してしまい、元に戻しました。また、ヌルモデムとドックライトで出力を確認しています。ボーレートは別として、ブーストシリアルポートに指定されたデフォルトのシリアル設定をすべて使用しています(明示的に設定しても効果がありませんでした)。

4

2 に答える 2

1

送信されているものをどのようにチェックしているかは述べていませんが、おそらく両端間のボーレートの不一致です。

これが欠けているようです:

port->set_option( boost::asio::serial_port_base::baud_rate( baud ) );

デフォルト値と異なる場合は、データ ビット数、パリティ、スタート ビットとストップ ビットも設定する必要があります。

それでも分類できない場合は、出力にオシロスコープを貼り付けて、送信側と受信側の波形を比較します。このようなものが表示されます。

于 2012-12-21T22:02:14.237 に答える