Showing
1 changed file
with
74 additions
and
0 deletions
| @@ -577,3 +577,77 @@ BOOL DisconnectOK() | @@ -577,3 +577,77 @@ BOOL DisconnectOK() | ||
| 577 | 577 | ||
| 578 | return ((MessageBox(ghwndMain, "OK to Disconnect?", gszPort, MB_YESNO)) == IDYES); | 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