📄 scommtestdlg.cpp
字号:
m_ctrlComm.SetCommPort(comcount); //选择com
if( !m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE); //打开串口
else
{return;}
m_ctrlComm.SetSettings("115200,n,8,1"); //波特率m_fvalue,无校验,8个数据位,1个停止位
m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据
m_ctrlComm.SetRThreshold(1); //1 //czq
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
id_Search_Send_Ok=1;
}
void CSCommTestDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus);
// TODO: Add your message handler code here
}
BOOL CSCommTestDlg::SearchSerial(short comnumber) //搜索串口是否空闲,若有空闲串口返1,否则返0。
{
CString ComString;
short comnum;
comnum=comnumber;
if(comnum==1)
ComString="com1";
else if(comnum==2)
ComString="com2";
else if(comnum==3)
ComString="com3";
else if(comnum==4)
ComString="com4";
else if(comnum==5)
ComString="com5";
else if(comnum==6)
ComString="com6";
else if(comnum==7)
ComString="com7";
else if(comnum==8)
ComString="com8";
else if(comnum==9)
ComString="com9";
else if(comnum==10)
ComString="com10";
else if(comnum==11)
ComString="com11";
else if(comnum==12)
ComString="com12";
else if(comnum=13)
ComString="com13";
else if(comnum==14)
ComString="com14";
else if(comnum==15)
ComString="com15";
else if(comnum==16)
ComString="com16";
else if(comnum==17)
ComString="com17";
else if(comnum==18)
ComString="com18";
else if(comnum==19)
ComString="com19";
else if(comnum==20)
ComString="com20";
else
{AfxMessageBox("搜索串口超过20个");return 0;}
HANDLE m_hCom;
m_hCom = CreateFile(ComString, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); //打开串口。
if (m_hCom == (HANDLE)0xFFFFFFFF)
return 0; //打开串口失败.
else
{
CloseHandle(m_hCom); //关闭串口。
return 1;
}
}
BOOL CSCommTestDlg::SearchUSB()
{
char HCName[16];
HANDLE hHCDev;
PCHAR rootHubName;
BOOL success;
PUSB_NODE_CONNECTION_INFORMATION connectionInfo;
HANDLE hHubDevice;
id_USBLink_HAVE=0;
for (HCNum = 0; HCNum < NUM_HCS_TO_CHECK; HCNum++)
{
wsprintf(HCName, "\\\\.\\HCD%d", HCNum);
hHCDev = CreateFile(HCName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hHCDev == INVALID_HANDLE_VALUE)
break; //没找到USB控制器
PCHAR deviceDesc;
ULONG nBytes;
rootHubName =(char*) GetRootHubName(hHCDev);
if(rootHubName==NULL)
{
goto end;//错误
}
PUSB_NODE_INFORMATION HubInfo;
HubInfo = (PUSB_NODE_INFORMATION)malloc(sizeof(USB_NODE_INFORMATION));
PCHAR deviceName;
deviceName = (PCHAR)malloc(strlen(rootHubName) + sizeof("\\\\.\\"));
if (rootHubName != NULL)
{
strcpy(deviceName, "\\\\.\\");
strcpy(deviceName + sizeof("\\\\.\\") - 1, rootHubName);
hHubDevice = CreateFile(deviceName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
free(deviceName);
if (hHubDevice == INVALID_HANDLE_VALUE)
{
goto end; //错误
}
success = DeviceIoControl(hHubDevice,
IOCTL_USB_GET_NODE_INFORMATION,
HubInfo,
sizeof(USB_NODE_INFORMATION),
HubInfo,
sizeof(USB_NODE_INFORMATION),
&nBytes,
NULL);
if (!success)
{
goto end; //错误
}
}
ULONG port;
port=HubInfo->u.HubInformation.HubDescriptor.bNumberOfPorts;
for (index=1; index <= port; index++)
{
ULONG nBytes;
nBytes = sizeof(USB_NODE_CONNECTION_INFORMATION) +
sizeof(USB_PIPE_INFO) * 30;
connectionInfo = (PUSB_NODE_CONNECTION_INFORMATION)malloc(nBytes);
if (connectionInfo == NULL)
{
goto end; //错误
}
connectionInfo->ConnectionIndex = index;
success = DeviceIoControl(hHubDevice,
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION,
connectionInfo,
nBytes,
connectionInfo,
nBytes,
&nBytes,
NULL);
if (!success)
{
free(connectionInfo);
goto end; //错误
}
deviceDesc = NULL;
if (connectionInfo->ConnectionStatus == DeviceConnected)
{
if((connectionInfo->DeviceDescriptor.idVendor==USB_VID) &&(connectionInfo->DeviceDescriptor.idProduct==USB_PID))
{id_USBLink_HAVE=1;return 1;}//AfxMessageBox("USBOK");}
}
}
end:;
CloseHandle(hHubDevice);
CloseHandle(hHCDev);
}
return 1;
}
PCHAR CSCommTestDlg::GetRootHubName(HANDLE HostController)
{
BOOL success;
ULONG nBytes;
USB_ROOT_HUB_NAME rootHubName;
PUSB_ROOT_HUB_NAME rootHubNameW;
PCHAR rootHubNameA;
rootHubNameW = NULL;
rootHubNameA = NULL;
success = DeviceIoControl(HostController,
IOCTL_USB_GET_ROOT_HUB_NAME,
0,
0,
&rootHubName,
sizeof(rootHubName),
&nBytes,
NULL);
if (!success)
{
goto GetRootHubNameError;
}
nBytes = rootHubName.ActualLength;
rootHubNameW =(PUSB_ROOT_HUB_NAME) malloc(nBytes);
if (rootHubNameW == NULL)
{
goto GetRootHubNameError;
}
success = DeviceIoControl(HostController,
IOCTL_USB_GET_ROOT_HUB_NAME,
NULL,
0,
rootHubNameW,
nBytes,
&nBytes,
NULL);
if (!success)
{
goto GetRootHubNameError;
}
rootHubNameA = WideStrToMultiStr(rootHubNameW->RootHubName);
free(rootHubNameW);
return rootHubNameA;
GetRootHubNameError:
if (rootHubNameW != NULL)
{
free(rootHubNameW);
rootHubNameW = NULL;
//ShowMessage("出错!\r\n"); //cz
}
return NULL;
}
PCHAR CSCommTestDlg::WideStrToMultiStr(PWCHAR WideStr)
{
ULONG nBytes;
PCHAR MultiStr;
nBytes = WideCharToMultiByte(
CP_ACP,
0,
WideStr,
-1,
NULL,
0,
NULL,
NULL);
if (nBytes == 0)
{
return NULL;
}
MultiStr =(PCHAR) malloc(nBytes);
if (MultiStr == NULL)
{
return NULL;
}
nBytes = WideCharToMultiByte(
CP_ACP,
0,
WideStr,
-1,
MultiStr,
nBytes,
NULL,
NULL);
if (nBytes == 0)
{
free(MultiStr);
return NULL;
}
return MultiStr;
}
BOOL CSCommTestDlg::SearchUSBOne()
{
char HCName[16];
HANDLE hHCDev;
PCHAR rootHubName;
BOOL success;
PUSB_NODE_CONNECTION_INFORMATION connectionInfo;
HANDLE hHubDevice;
id_USBLink_OK=0;
//for (HCNum = 0; HCNum < NUM_HCS_TO_CHECK; HCNum++)
//{
wsprintf(HCName, "\\\\.\\HCD%d", HCNum); //HCNum ok
hHCDev = CreateFile(HCName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hHCDev == INVALID_HANDLE_VALUE)
goto end; //没找到USB控制器
PCHAR deviceDesc;
ULONG nBytes;
rootHubName =(char*) GetRootHubName(hHCDev);
if(rootHubName==NULL)
{
goto end;//错误
}
PUSB_NODE_INFORMATION HubInfo;
HubInfo = (PUSB_NODE_INFORMATION)malloc(sizeof(USB_NODE_INFORMATION));
PCHAR deviceName;
deviceName = (PCHAR)malloc(strlen(rootHubName) + sizeof("\\\\.\\"));
if (rootHubName != NULL)
{
strcpy(deviceName, "\\\\.\\");
strcpy(deviceName + sizeof("\\\\.\\") - 1, rootHubName);
hHubDevice = CreateFile(deviceName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
free(deviceName);
if (hHubDevice == INVALID_HANDLE_VALUE)
{
goto end; //错误
}
success = DeviceIoControl(hHubDevice,
IOCTL_USB_GET_NODE_INFORMATION,
HubInfo,
sizeof(USB_NODE_INFORMATION),
HubInfo,
sizeof(USB_NODE_INFORMATION),
&nBytes,
NULL);
if (!success)
{
goto end; //错误
}
}
int port;
port=HubInfo->u.HubInformation.HubDescriptor.bNumberOfPorts;
//for (index=1; index <= port; index++)
{ //index ok
ULONG nBytes;
nBytes = sizeof(USB_NODE_CONNECTION_INFORMATION) +
sizeof(USB_PIPE_INFO) * 30;
connectionInfo = (PUSB_NODE_CONNECTION_INFORMATION)malloc(nBytes);
if (connectionInfo == NULL)
{
goto end; //错误
}
connectionInfo->ConnectionIndex = index;
success = DeviceIoControl(hHubDevice,
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION,
connectionInfo,
nBytes,
connectionInfo,
nBytes,
&nBytes,
NULL);
if (!success)
{
free(connectionInfo);
goto end; //错误
}
deviceDesc = NULL;
if (connectionInfo->ConnectionStatus == DeviceConnected)
{
if((connectionInfo->DeviceDescriptor.idVendor==USB_VID) &&(connectionInfo->DeviceDescriptor.idProduct==USB_PID))
{id_USBLink_OK=1;}//AfxMessageBox("USBOK");}
}
}
end:;
//}
CloseHandle(hHubDevice);
CloseHandle(hHCDev);
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -