armfly 发表于 2015-4-12 06:50:00

注册表中可以查询到当前有效的串口号

阅读 victor 串口控件源码(支持C++ Builder XE7),发现可以从注册表中查询到当前激活的COM端口号,动态的。

void __fastcall TCommSerialPortInfo::ListFromSystem(void)
{
HKEY hKey;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_READ, &hKey)==ERROR_SUCCESS)
   {
   try
      {
      _PortList->Clear();
      for(int idx=0; idx<32767; idx++)
         {
         TCHAR sName, sValue;
         DWORD dwNameLen=256, dwValueSize=sizeof(sValue);
         if(RegEnumValue(hKey, idx, sName, &dwNameLen, NULL, NULL, (LPBYTE)sValue, &dwValueSize)!=ERROR_SUCCESS)break;
         if(*sValue)_PortList->Add(sValue);
         }
      _PortList->CustomSort(PortListSortCompare);
      }
   __finally
      {
      RegCloseKey(hKey);
      }
   }
}

=================================

CH340支持常用通讯波特率:50、75、100、110、134.5、150、300、600、900、1200、1800、2400、3600、4800、9600、14400、19200、28800、33600、38400、56000、57600、76800、115200、128000、153600、230400、460800、921600、1500000、2000000等。串口发送信号的波特率误差小于0.3%,串口接收信号的允许波特率误差不小于2%。

=================================

13.5.2配置串口(1)
在打开通信设备句柄后,常常需要对串口进行一些初始化配置工作。配置串口的一些属性,如串口通信参数、通信超时设置、缓冲区申请及缓冲区清空操作等。
(1)设置串口参数。设置串口参数需要通过一个DCB结构来进行。DCB结构包含了诸如波特率、数据位数、奇偶校验和停止位数等信息。在查询或配置串口的属性时,都要通过一个DCB结构的缓冲区。
一般用CreateFile打开串口后,可以调用GetCommState()函数来获取串口的初始配置。要修改串口的配置,应该先修改DCB结构,然后再调用SetCommState()函数设置串口。DCB结构包含了串口的各项参数设置,下面介绍该结构5个常用的成员变量。
BaudRate:波特率,DWORD型变量,指定通信设备的传输速率。这个成员可以是实际波特率值或者是表13.2中的常量值之一。
fParity:指定奇偶校验使能,DWORD型变量。若此成员为1,允许奇偶校验检查。
ByteSize:通信字节位数,4—8,BYTE型变量。
Parity:指定奇偶校验方法,BYTE型变量。此成员的取值如表13.3所示。
StopBits:指定停止位的位数,BYTE型变量。此成员取值如表13.4所示。
表13.2波特率常见常量

值winbase.h中的定义说    明
CBR_110
#define CBR_110 110
波特率为110
CBR_300
#define CBR_300300
波特率为300
CBR_600
#define CBR_600600
波特率为600
CBR_1200
#define CBR_12001200
波特率为1200
CBR_2400
#define CBR_24002400
波特率为2400
CBR_4800
#define CBR_48004800
波特率为4800
CBR_9600
#define CBR_96009600
波特率为9600
CBR_14400
#define CBR_1440014400
波特率为14400
CBR_19200
#define CBR_1920019200
波特率为19200
CBR_38400
#define CBR_3840038400
波特率为38400
CBR_56000
#define CBR_5600056000
波特率为56000
CBR_57600
#define CBR_5760057600
波特率为57600
CBR_115200
#define CBR_115200 115200
波特率为115200
CBR_128000
#define CBR_128000 128000
波特率为128000
CBR_256000
#define CBR_256000 256000
波特率为256000
表13.3奇偶校验常见常量

值winbase.h中的定义说    明NOPARITY#defineNOPARITY0采用无校验方式ODDPARITY#defineODDPARITY1采用奇校验方式EVENPARITY#defineEVENPARITY2采用偶校验方式MARKPARITY#defineMARKPARITY3采用标记校验方式
表13.4停止位常见常量

值winbase.h中的定义说    明ONESTOPBIT#define ONESTOPBIT01位停止位ONE5STOPBITS#define ONE5STOPBITS11.5位停止位TWOSTOPBITS#define TWOSTOPBITS22位停止位
通过GetCommState()函数可以获得COM口的设备控制块,从而获得DCB中相关的参数。函数原型如下:


BOOL GetCommState(                  HANDLE hFile,   //标识通信端口的句柄                  LPDCB lpDCB   //指向一个设备控制块(DCB结构)的指针                  );
而通过SetCommState()函数则可以设置COM口的设备控制块,函数原型如下:BOOL SetCommState(                  HANDLE hFile,                  LPDCB lpDCB                  );
函数参数同GetCommState()。
页: [1]
查看完整版本: 注册表中可以查询到当前有效的串口号