我使用以下代码打开串口:
#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。