|
|
//功能:实现串口操作的一些函数
|
|
|
#include "StdAfx.h"
|
|
|
#include "ComControlFunction.h"
|
|
|
|
|
|
//查找系统可用的串口号,将所有的串口号保存在pPortList数组里
|
|
|
//输出:串口数portNumber,串口号数组pPortList
|
|
|
//pPortList保存各串口的串口数字
|
|
|
BOOL ScanPCCom( int *pPortList, int& portNumber )
|
|
|
{
|
|
|
portNumber = 0; //系统配置的串口总数
|
|
|
|
|
|
//扫描PC机存在的串口,从注册表读取存在的串口。
|
|
|
UINT nComNum = 0;
|
|
|
HKEY hKEY = NULL;
|
|
|
LONG hResult = ::RegOpenKeyEx( HKEY_LOCAL_MACHINE, _T( "HARDWARE\\DEVICEMAP\\SERIALCOMM" ), 0, KEY_READ, &hKEY );
|
|
|
|
|
|
if ( hResult != ERROR_SUCCESS ) //如果无法打开hKEY,则中止程序的执行
|
|
|
{
|
|
|
return FALSE;
|
|
|
}
|
|
|
|
|
|
TCHAR strInf[30];
|
|
|
memset( strInf, 0, sizeof( TCHAR ) * 30 );
|
|
|
|
|
|
DWORD type_1 = REG_SZ;
|
|
|
DWORD cbData_1 = 10;
|
|
|
DWORD aa = 30, num = 0;
|
|
|
DWORD a1 = 0, a2 = 0, a3 = 0, a4 = 0, a5 = 0, a6 = 0, a7 = 0;
|
|
|
|
|
|
//hResult = ::RegQueryInfoKey( hKEY, strInf, &a7, NULL, &a3, &a1, &a2, &num, &a4, &a5, &a6, NULL );
|
|
|
hResult = ::RegQueryInfoKeyA( hKEY, NULL, NULL, NULL, &a3, &a1, NULL, &num, &a4, &a5, NULL, NULL );
|
|
|
if ( hResult != ERROR_SUCCESS )
|
|
|
{
|
|
|
RegCloseKey( hKEY );
|
|
|
return FALSE;
|
|
|
}
|
|
|
|
|
|
BYTE portName[15];
|
|
|
memset( portName, 0, 15 );
|
|
|
|
|
|
CString csr = _T( "" );
|
|
|
|
|
|
for ( DWORD i = 0 ; i < num ; ++i )
|
|
|
{
|
|
|
aa = 30 ;
|
|
|
cbData_1 = 10;
|
|
|
hResult = ::RegEnumValue( hKEY, i, strInf, &aa, NULL, &type_1, portName, &cbData_1 );
|
|
|
if ( hResult != ERROR_SUCCESS )
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
csr.Format( _T( "%s" ), portName );
|
|
|
|
|
|
csr.Delete( 0, 3 );
|
|
|
|
|
|
pPortList[portNumber] = atoi( csr );
|
|
|
|
|
|
++portNumber; //系统配置的串口总数
|
|
|
|
|
|
++nComNum;
|
|
|
}
|
|
|
RegCloseKey( hKEY );
|
|
|
return TRUE;
|
|
|
}
|
|
|
|
|
|
|
|
|
//判断串口是否被占有,串口可用返回true,否则返回false
|
|
|
bool OnCheckComPort( const CString& portName )
|
|
|
{
|
|
|
CString str = _T( "//./" ) + portName;
|
|
|
HANDLE hCom = CreateFile( str, //打开串口1
|
|
|
GENERIC_READ | GENERIC_WRITE, //允许读和写操作
|
|
|
0, //独占方式
|
|
|
0, OPEN_EXISTING, //打开一个存在的串口
|
|
|
0, 0 );
|
|
|
|
|
|
|
|
|
if ( hCom == INVALID_HANDLE_VALUE ) //打开串口失败
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
CloseHandle( hCom );
|
|
|
hCom = NULL;
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//判断串口是否为空
|
|
|
//串口为空返回true,否则返回false
|
|
|
bool CheckComPortIsEmpty( const CString strPort )
|
|
|
{
|
|
|
if ( strPort.Compare( _T( "" ) ) == 0 )
|
|
|
{
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
//功能:检测2个串口是否相同,相同返回True,否则返回false
|
|
|
bool CompareTwoComPort( const CString port1, const CString port2 )
|
|
|
{
|
|
|
if ( ( port1.Compare( port2 ) ) == 0 )
|
|
|
{
|
|
|
return true;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//判断串口是否可用
|
|
|
//可用返回true,否则返回false
|
|
|
bool CheckComPortCanWork( const CString strPort )
|
|
|
{
|
|
|
if ( strPort.GetLength() <= 4 )
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
CString str = strPort;
|
|
|
str.Delete( 0, 4 ); //删除“串口”字符
|
|
|
|
|
|
CString strSelectCom = _T( "" );
|
|
|
strSelectCom.Format( "COM%d", atoi( str ) );
|
|
|
|
|
|
if ( !OnCheckComPort( strSelectCom ) ) //串口被占用,返回false
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
else //串口可用,返回true
|
|
|
{
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//判断串口名称是否正确,正确的名称为“串口XX”——前面为“串口”,后面为数字
|
|
|
//串口名称正确返回true, 否则返回false
|
|
|
bool CheckComPortName( const CString strPort )
|
|
|
{
|
|
|
if ( strPort.GetLength() < 5 )
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
CString str = strPort;
|
|
|
|
|
|
if ( str.Left( 4 ) != _T( "串口" ) )
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
str = strPort;
|
|
|
str.Delete( 0, 4 );
|
|
|
|
|
|
for ( int i = 0; i < str.GetLength(); ++i )
|
|
|
{
|
|
|
if ( ( str.GetAt( i ) < '0' ) || ( str.GetAt( i ) > '9' ) )
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
//从串口数组中进行查找,查找出配置文件设置的串口号
|
|
|
//输入:数组portArray,数组长度arrLength,查找元素itemValue
|
|
|
//输出:元素的位置pos
|
|
|
//返回值:查找成功返回true,否则返回false
|
|
|
bool FindItemFromComList( int& pos, const int *portArray, const int& arrLength, const int& itemValue )
|
|
|
{
|
|
|
for ( int i = 0; i < arrLength; ++i )
|
|
|
{
|
|
|
if ( itemValue == portArray[i] )
|
|
|
{
|
|
|
pos = i;
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
|