私は現在、Windowsを使ってシリアルポートリーダークラスを実装しようとしています(すでにBoostを使って実装していますが、プラットフォームにBoostがない可能性があります)。C++はCreateFileで共有シリアルポートを開きます
ブーストシリアルポートライター(別の実行可能ファイル)を使用してWindowsシリアルポートリーダー(実行可能ファイル)をテストする場合を除き、すべてライターがアクセス拒否例外をスローします。さもなければ、それはライターがもはや書くことができなくなるまで、シリアルポート上にあるものを読み取っているように見えるので、リーダーは機能します。
ライターが最初に起動されるか、リーダーが最初に起動されるかは関係ありません。リーダーが読み込み用ポートを開くと、ライターはそのポートに書き込むことができなくなります。
私はCreateFile()メソッドで異なる引数を設定しようとしましたが、これまでのところ役に立たなかったので、次のコードスニペットが機能すると期待しますが、そうではありません。
m_serial = CreateFile(
m_port,
GENERIC_READ,
FILE_SHARE_WRITE,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
ライターコードは無関係かもしれないが、ここではそれがとにかくです:
void writeLine(std::string line)
{
boost::asio::io_service io;
boost::asio::serial_port serial(io, m_port);
serial.set_option(boost::asio::serial_port_base::baud_rate(m_rate));
boost::asio::write(serial, boost::asio::buffer(line.c_str(), line.size()));
}
とブースト用.what()::システム:: SYSTEM_ERRORは次のとおりです。
open: Access is denied
何か案は?
http://www.robbayer.com/files/serial-win.pdf(偉大な記事ですが、それほど遠くない)とhttp://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx - これはdwShareMode引数である必要がありますが、動作させることはできません。
編集:私はこのシリアルポートエミュレータhttp://www.eterlogic.com/Products.VSPE.htmlを使用していますが、私の悲しみの原因になっている可能性があります。エミュレータは、(2つの別々の実行ファイルから)私のBoostライターと一緒に私のBoostリーダーを使用するときに期待通りに動作します。