0

wxTerm (または同様のターミナル アプリケーション) が行うように、デバイスにブレーク信号を送信するという、この一見簡単なタスクについて、私はかなり頭を悩ませています。

私のテストとデバイスの仕様によると、この信号の長さは 125 ミリ秒でなければなりません。

特定の応答が返されるはずですが、予想よりも長い応答が返され、送信された日付が間違っています。

例えば:

何に反応するべきか08 00 81 00 00 01 07 00

何に反応するか08 01 0A 0C 10 40 40 07 00 7F

本当にびっくりするのは、wxTerm を使用して (接続も送信もせずに) 利用可能な COM ポートを調べた後、コードが動作し始めたことです! その後、好きなだけ休憩を送信できます。それ以降は、すぐに応答が得られます。もう一度試すには、PC をリセットする必要があります。

ここで一体何が起こっているのですか?

ブレーク信号によるリセットのコードは次のとおりです。

 minicom_client(boost::asio::io_service& io_service, unsigned int baud, const string& device)
            : active_(true),
              io_service_(io_service),
              serialPort(io_service, device)
    {
        if (!serialPort.is_open())
        {
                cerr << "Failed to open serial port\n";
                return;
        }           
        boost::asio::serial_port_base::flow_control FLOW( boost::asio::serial_port_base::flow_control::hardware );
        boost::asio::serial_port_base::baud_rate baud_option(baud);
        serialPort.set_option(FLOW);
        serialPort.set_option(baud_option);
        read_start();
        std::cout << SetCommBreak(serialPort.native_handle()) << std::endl;     
        std::cout << GetLastError() << std::endl;
        boost::posix_time::ptime mst1 = boost::posix_time::microsec_clock::local_time();
        boost::this_thread::sleep(boost::posix_time::millisec(125));
        boost::posix_time::ptime mst2 = boost::posix_time::microsec_clock::local_time();    
        std::cout << ClearCommBreak(serialPort.native_handle()) << std::endl;       
        std::cout << GetLastError() << std::endl;           
        boost::posix_time::time_duration msdiff = mst2 - mst1;
        std::cout << msdiff.total_milliseconds() << std::endl;
    }

編集:

wxTerm の COM ポートのコンボ ボックスの選択を確認するだけで済みました。コードを機能させるためにアクティブな接続を確立する必要はありませんでした。

wxTermがシリアルポートコンボボックスのリストを作成しているときに、ある種の初期化が欠落していると推測しています。

4

1 に答える 1

0

character_sizeこれをより深く調べたところ、これを機能させるには適切にセットアップする必要があることがわかりました。

しかし、私はこれを本当に忘れたわけではなく、今まで必要ではなかった. デバイスがすでにリセット後の状態にある場合、デバイスは私の要求に従ってデータを送信するので、すべて問題なく、baud_rate.

アクティブ フロー制御なしはよく使用されるデフォルトであるため、ここに何らかのエラーがあるのではないかと考えました。ただし、実際に必要なのはセットアップのみcharacter_sizeです。次に、期待される応答でブレーク信号が応答されます。

これは最小限の設定です:

minicom_client(boost::asio::io_service& io_service, unsigned int baud, const string& device)
        : active_(true),
          io_service_(io_service),
          serialPort(io_service, device)
{
    if (!serialPort.is_open())
    {
            cerr << "Failed to open serial port\n";
            return;
    }           
    boost::asio::serial_port_base::character_size CSIZE( 8 );
    boost::asio::serial_port_base::baud_rate baud_option(baud);
    serialPort.set_option( CSIZE );
    serialPort.set_option(baud_option);
    read_start();
    std::cout << SetCommBreak(serialPort.native_handle()) << std::endl;     
    std::cout << GetLastError() << std::endl;
    boost::posix_time::ptime mst1 = boost::posix_time::microsec_clock::local_time();
    boost::this_thread::sleep(boost::posix_time::millisec(125));
    boost::posix_time::ptime mst2 = boost::posix_time::microsec_clock::local_time();    
    std::cout << ClearCommBreak(serialPort.native_handle()) << std::endl;       
    std::cout << GetLastError() << std::endl;           
    boost::posix_time::time_duration msdiff = mst2 - mst1;
    std::cout << msdiff.total_milliseconds() << std::endl;
}

ただし、念のため、すべてのシリアル ポート パラメータを設定しています。

ここにあるサンプル ファイルBoost Asio serial_port -途中で io のヘルプが必要です。

于 2012-10-23T10:58:00.483 に答える