2012-02-15 5 views
0

私は現在、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リーダーを使用するときに期待通りに動作します。

答えて

0

なぜ今返信がないのか分かります。記録のために、シリアルポートを開くための引数は問題ありませんでした。問題は、私はそれを閉じることなく各読書のために同じポートを開こうとしていたので、私はそれを完了したまでそれを開いたままにしていたということでした。

関連する問題