C ++用CreateFile打开一个共享串口

时间:2012-02-15 16:49:01

标签: c++ boost serial-port boost-asio

我目前正在尝试使用Windows实现串口读取器类(已经使用Boost实现了一个,想要满足平台可能没有Boost的可能性)。

所有似乎都运行良好,除非我使用我的Boost串口编写器(一个单独的可执行文件)测试我的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()));

}

boost :: system :: system_error的.what()是:

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这可能是我的困境的原因,如果是这样那么无关紧要。当使用我的Boost阅读器和我的Boost编写器时,模拟器按预期工作(来自两个独立的可执行文件)。

1 个答案:

答案 0 :(得分:0)

我能理解为什么现在没有回复。为了记录,打开串口的参数很好。问题是我试图为每次读取打开相同的端口而不关闭它,所以我只是把它打开直到我完成它。