Commit 86ae3423fa1d4dfefcbd2b301f0d99a42bc1dd45

Authored by xiemeng
1 parent fd16a5bc

添加有效COM枚举功能

Showing 1 changed file with 74 additions and 0 deletions
... ... @@ -577,3 +577,77 @@ BOOL DisconnectOK()
577 577
578 578 return ((MessageBox(ghwndMain, "OK to Disconnect?", gszPort, MB_YESNO)) == IDYES);
579 579 }
  580 +
  581 +
  582 +
  583 +BOOL QuerySingleSerialPortEx(int nPort)
  584 +{
  585 + char strComm[50];
  586 + BOOL bValid = TRUE;
  587 + HANDLE hComm;
  588 + int nError;
  589 +
  590 +
  591 + sprintf(strComm,"COM%d",nPort);
  592 + if (nPort >= 10)
  593 + {//微软的技术手册规定打开端口号大于9的串口时应该使用"\\.\COM10"格式的文件名,更多的信息请参考msdn。
  594 + sprintf(strComm,"\\\\.\\COM%d",nPort);
  595 + }
  596 +
  597 + hComm = CreateFile(strComm,GENERIC_READ | GENERIC_WRITE,0,NULL,\
  598 + OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL| FILE_FLAG_OVERLAPPED, NULL);
  599 + nError = GetLastError();
  600 +
  601 + if(INVALID_HANDLE_VALUE == hComm)
  602 + {//***********如果没有该设备,或者被其他应用程序占用********
  603 + if(2 == nError)
  604 + bValid = -1;
  605 + else if(5 == nError)
  606 + bValid = FALSE;
  607 + else
  608 + bValid = FALSE;
  609 + }
  610 + CloseHandle(hComm); //重要 关闭文件句柄 = 关闭串口
  611 + return bValid;
  612 +}
  613 +
  614 +//利用API查询指定范围内的串口状态信息,并分别返回指定范围内系统存在的串口,
  615 +//当前未被占用的可用串口,已被占用的串口和系统不存在的串口
  616 +void QuerySerialPortStatusEx(int *AryNoneOpenedPort,int nStartPort,int nLastPort)
  617 +{
  618 + char strTmp[50],strComm[50],strFree[50];
  619 + int n1 = nStartPort,n2=nLastPort,i,loop = 0;
  620 + HANDLE hComm;
  621 + int nLastError;
  622 + //对输入的参数进行检查
  623 + if(nStartPort < 1) nStartPort = 1;
  624 + if(nStartPort > 65535) nStartPort = 65535;
  625 + if(nLastPort < 1) nLastPort = 1;
  626 + if(nLastPort > 65535) nLastPort = 65535;
  627 + nStartPort = min(n1,n2);
  628 + nLastPort = max(n1,n2);
  629 + memset(AryNoneOpenedPort,0,255);
  630 +
  631 +
  632 + for (i = nStartPort;i<=nLastPort;i++)
  633 + {
  634 + sprintf(strComm,"COM%d",i);
  635 + if (i >= 10)
  636 + {//微软的技术手册规定打开端口号大于9的串口时应该使用"\\.\COM10"格式的文件名,更多的信息请参考msdn。
  637 + sprintf(strComm,"\\\\.\\COM%d",i);
  638 + }
  639 + // 这里的CreateFile函数起了很大的作用,可以用来创建系统设备文件,如果该设备不存在或者被占用,则会返回一个错误,即下面的 INVALID_HANDLE_VALUE ,据此可以判断可使用性。详细参见MSDN中的介绍。
  640 + hComm = CreateFile(strComm,GENERIC_READ | GENERIC_WRITE,0,NULL,\
  641 + OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL| FILE_FLAG_OVERLAPPED, NULL);
  642 + nLastError = GetLastError();
  643 + //strComm.TrimLeft("\\\\.\\");
  644 +
  645 + if(hComm != INVALID_HANDLE_VALUE)
  646 + {//串口存在且未被占用
  647 + AryNoneOpenedPort[loop] = i;
  648 + loop++;
  649 + }
  650 + CloseHandle(hComm); //关闭文件句柄 - 必要
  651 + }
  652 +
  653 +}
... ...
Please register or login to post a comment