C++使用CreateFile打开共享串行端口

C++ opening a shared serial port with CreateFile

本文关键字:共享 串行端口 使用 CreateFile C++      更新时间:2023-10-16

我目前正在尝试使用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编写器时(从两个独立的可执行文件中),模拟器可以正常工作。

我能理解为什么现在没有回复。记录在案,打开串行端口的参数是正确的。问题是,我试图在不关闭的情况下为每次读取打开同一个端口,所以我一直保持打开状态,直到我完成读取。