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