C ++ - 无法打开现有的串口

时间:2018-02-12 08:48:45

标签: c++ winapi serial-port access-denied

我使用以下代码打开串口:

#include "stdafx.h"
#include <windows.h>
#include <winbase.h>
#include "ConsoleApplication2.h"
typedef unsigned int UI_32;     // 32-bit unsigned integer
typedef unsigned int   UI_P;  // platform dependent unsigned integer (16b on 16b platforms, 32b on 32b platforms)
HANDLE hComHandle;

bool  OpenChannel(UI_32  _u32ComPort,     // COM port 1,2,...
    UI_32  _u32BaudRate,    // baud rate
    UI_32  _u32ParityIndex) // parity index in table, depends on OS (1/2/3)
{
    char acPort[20];

    sprintf_s(acPort, sizeof(acPort), "\\\\.\\COM%d", _u32ComPort);       // i pro COM10 a vic
    hComHandle = CreateFile(acPort, GENERIC_ALL, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (hComHandle == INVALID_HANDLE_VALUE) {
//#ifdef _DEBUG
        printf("Port %d couldn't be opened: error %d\n", _u32ComPort, GetLastError());
//#endif
        return false;
    }
    /*
    if (!SetBaudRate(_u32BaudRate, _u32ParityIndex))
        return false;
    if (SetupComm(hComHandle, QUEUE_IN_LEN, QUEUE_OUT_LEN) == 0)
        return false;*/
    return true;

}  // OpenChannel

bool  CloseChannel()
{
    return (CloseHandle(hComHandle) != 0);

}  // CloseChannel



int main()
{
    bool bFound;
    for (UI_P c = 1; c <= 20; c++)
    {
        if (OpenChannel(c, 9600, 2))
        {
            printf("COM%u\n ", c);
            bFound = true;
            CloseChannel();
        };

    } // for
    scanf_s(" ");
    return 0;
}

某处有错误吗?因为在大多数计算机上,这段代码工作正常,但我发现代码不能在两台计算机上运行(Win 10,Win 7,但它可以在另一台运行W7的计算机上运行)。我收到错误代码5(访问被拒绝。),但我可以通过另一个应用程序(Hyperterminal)打开端口。硬件正在使用FTDI芯片,但我不认为这是问题所在。我有点绝望了。

编辑解决方案

我已经解决了我的问题。我将dwDesiredAccess参数从GENERIC_ALL更改为GENERIC_WRITE | GENERIC_READ | GENERIC_EXECUTE和代码在我可用的每台计算机上运行良好。 Here回答了GENERIC_ALL和GENERIC_WRITE |之间的不同之处GENERIC_READ | GENERIC_EXECUTE。

0 个答案:

没有答案