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