硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3090|回复: 0
收起左侧

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

[复制链接]

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2015-4-12 06:50:00 | 显示全部楼层 |阅读模式
阅读 victor 串口控件源码(支持C++ Builder XE7),发现可以从注册表中查询到当前激活的COM端口号,动态的。

void __fastcall TCommSerialPortInfo:istFromSystem(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[256], sValue[256];
           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、460800921600、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_300  300

波特率为300

CBR_600

#define CBR_600  600

波特率为600

CBR_1200

#define CBR_1200  1200

波特率为1200

CBR_2400

#define CBR_2400  2400

波特率为2400

CBR_4800

#define CBR_4800  4800

波特率为4800

CBR_9600

#define CBR_9600  9600

波特率为9600

CBR_14400

#define CBR_14400  14400

波特率为14400

CBR_19200

#define CBR_19200  19200

波特率为19200

CBR_38400

#define CBR_38400  38400

波特率为38400

CBR_56000

#define CBR_56000  56000

波特率为56000

CBR_57600

#define CBR_57600  57600

波特率为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
#define  NOPARITY  0
采用无校验方式
ODDPARITY
#define  ODDPARITY  1
采用奇校验方式
EVENPARITY
#define  EVENPARITY  2
采用偶校验方式
MARKPARITY
#define  MARKPARITY  3
采用标记校验方式

表13.4  停止位常见常量

winbase.h中的定义
说    明
ONESTOPBIT
#define ONESTOPBIT  0
1位停止位
ONE5STOPBITS
#define ONE5STOPBITS  1
1.5位停止位
TWOSTOPBITS
#define TWOSTOPBITS  2
2位停止位

通过GetCommState()函数可以获得COM口的设备控制块,从而获得DCB中相关的参数。函数原型如下:


    [li]BOOL GetCommState(  [/li][li]                    HANDLE hFile,   //标识通信端口的句柄  [/li][li]                    LPDCB lpDCB     //指向一个设备控制块(DCB结构)的指针  [/li][li]                    ); [/li]

而通过SetCommState()函数则可以设置COM口的设备控制块,函数原型如下:
    [li]BOOL SetCommState(  [/li][li]                    HANDLE hFile,  [/li][li]                    LPDCB lpDCB  [/li][li]                    ); [/li]

函数参数同GetCommState()。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 03:14 , Processed in 0.227363 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表