|
阅读 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、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_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()。 |
|