我正在尝试使用C ++打开一个用于读写的COM端口,但我似乎无法通过实际打开它的第一阶段。我的手柄上有一个INVALID_HANDLE_VALUE
与GetLastError FILE_NOT_FOUND
。我已经在网上搜索了几天,我是刚刚想出来的。我也在这个网站上搜索了有关COM的所有问题。
我已经扫描了现有的端口(或者我相信),以便正确获取端口的名称。
我还尝试了_T("COM1")
与斜杠的组合,没有斜杠,带冒号,没有冒号,没有_T
我在64位机器上使用Windows 7。
这是我得到的代码
我很高兴有关于此
的任何意见void SendToCom(char* data, int len)
{
DWORD cbNeeded = 0;
DWORD dwPorts = 0;
EnumPorts(NULL, 1, NULL, 0, &cbNeeded, &dwPorts);
//What will be the return value
BOOL bSuccess = FALSE;
LPCSTR COM1 ;
BYTE* pPorts = static_cast<BYTE*>(malloc(cbNeeded));
bSuccess = EnumPorts(NULL, 1, pPorts, cbNeeded, &cbNeeded, &dwPorts);
if (bSuccess){
PORT_INFO_1* pPortInfo = reinterpret_cast<PORT_INFO_1*>(pPorts);
for (DWORD i=0; i<dwPorts; i++)
{
//If it looks like "COMX" then
size_t nLen = _tcslen(pPortInfo->pName);
if (nLen > 3)
{
if ((_tcsnicmp(pPortInfo->pName, _T("COM"), 3) == 0) ){
COM1 =pPortInfo->pName;
//COM1 ="\\\\.\\COM1";
HANDLE m_hCommPort = CreateFile( COM1 ,
GENERIC_READ|GENERIC_WRITE, // access ( read and write)
0, // (share) 0:cannot share the COM port
NULL, // security (None)
OPEN_EXISTING, // creation : open_existing
FILE_FLAG_OVERLAPPED, // we want overlapped operation
NULL // no templates file for COM port...
);
if (m_hCommPort==INVALID_HANDLE_VALUE)
{
DWORD err = GetLastError();
if (err == ERROR_FILE_NOT_FOUND) {
MessageBox(hWnd,"ERROR_FILE_NOT_FOUND",NULL,MB_ABORTRETRYIGNORE);
}
else
if(err == ERROR_INVALID_NAME) {
MessageBox(hWnd,"ERROR_INVALID_NAME",NULL,MB_ABORTRETRYIGNORE);
}
else
{
MessageBox(hWnd,"unkown error",NULL,MB_ABORTRETRYIGNORE);
}
}
else{
WriteAndReadPort(m_hCommPort,data);
}
}
pPortInfo++;
}
}
}
}
答案 0 :(得分:0)
解决方案是使用
问题是,如果您的端口是Bigger然后9,那么您必须使用语法
LPCWSTR szPortName = L"\\\\.\\COM11";
。
答案 1 :(得分:0)
如果您使用的是Windows 10 - 运行所有系统更新可能会有所帮助!
我有同样的问题,即打开端口&#34; COM4&#34;返回错误ERROR_FILE_NOT_FOUND。以&#34;管理员&#34;运行程序时有效。现在更新到1511后,该程序可以打开&#34; COM4&#34;甚至没有以&#34;管理员&#34;。
运行答案 2 :(得分:0)
http://www.cplusplus.com/forum/windows/163855/ 使用CreateFileA(...)而不是CreateFile(...)