读取计算机上串口数过程分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_17017545/article/details/79246925

通过工具栏上的组合框读取串口的基本实现思路:

  1. 设置好工具栏(这里比较特殊,原因是想把读串口设置在工具栏上)
  2. 在工具栏中设置好各个功能按钮,并在最后多设置一个按钮,并将此按钮的ID设置为串口组合框的ID(这个组合框实质上只是工具栏上的一个按钮)
  3. 对刚刚设置的组合框按钮在消息映射表中添加消息映射函数(具体如何读取到电脑上有多少个串口交给响应函数吧^_^)

这里写图片描述
这里写图片描述
具体代码如下:

1. 在初始化OnInitDialog()中关于工具栏处理的代码;

//添加一个平面工具栏
if (!m_wndtoolbar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS, CRect(0, 3, 0, 0)) || !m_wndtoolbar.LoadToolBar(IDR_TOOLBAR))
{
TRACE0("failed to create toolbar\n");
return FALSE;
}
// Create the zoom combo box in the toolbar.
//在按钮上创建组合框,按钮位置决定了组合框的位置
int index1 = m_wndtoolbar.CommandToIndex(IDC_COMBO_COM_PORT);   //获取要设置为组合框的按钮的位置
m_wndtoolbar.SetButtonInfo(index1, IDC_COMBO_COM_PORT, TBBS_SEPARATOR, 100);//(对空白按钮进行设置)设置组合框的ID,类型(这里是分隔栏),100是指分隔栏宽度
// 根据分隔符的尺寸rect建立组合框
CRect rect1;
m_wndtoolbar.GetItemRect(index1, &rect1);    //将组合框的矩形区域数据存入rect1中
rect1.bottom += 100;
m_cZoomCombo.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST, rect1,&m_wndtoolbar, IDC_COMBO_COM_PORT); //创建组合框  四个参数(样式,位置和大小,父窗口,组合控件ID)  
//选中第1条记录
m_cZoomCombo.SetCurSel(0);   
m_wndtoolbar.ShowWindow(SW_SHOW);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

2. 映射表中代码;

BEGIN_MESSAGE_MAP(CIntegrityMobileConfiguratorDlg, CDialog)
    ON_CBN_DROPDOWN(IDC_COMBO_COM_PORT, &CIntegrityMobileConfiguratorDlg::OnDropdownComboComPort) 
END_MESSAGE_MAP()

3. 消息响应函数代码;

头文件中:

afx_msg void OnDropdownComboComPort(); //使下拉显示串口

对话框类实现文件中:

void CIntegrityMobileConfiguratorDlg::OnDropdownComboComPort() //读取串口数
{
    // TODO: Add your control notification handler code here
    char comList[128][8]={0};
    int comCount = GetCommList(comList);
    m_cZoomCombo.ResetContent();//消除现有所有内容 <直接用对话框去获取组合框的信息获取不到,需要借用组合框的对象获取,尼玛,这个搞死我了!!>
//  ((CComboBox*)GetDlgItem(IDC_COMBO_COM_PORT))->ResetContent();//消除现有所有内容 <L200组合框在对话框里面,所以可以直接通过ID获取组合框信息>
    for(int i=0;i<comCount;i++)
    {
    //  ((CComboBox*)GetDlgItem(IDC_COMBO_COM_PORT))->AddString(comList[i]); //L200实现代码
        m_cZoomCombo.AddString(comList[i]);  //依次将读取到的串口号添加到组合框的下拉列表中
    }
}

int CIntegrityMobileConfiguratorDlg::GetCommList(char comList[][8]) 
{
    // serial port information is stored in register at key:串口信息存储在密钥的寄存器中
    // HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
    HKEY comKey = NULL;
    LPCTSTR lpSubKey = "HARDWARE\\DEVICEMAP\\SERIALCOMM"; //需要打开的注册表的子键
    LONG ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,lpSubKey,0,KEY_READ,&comKey); 
    //函数功能描述:打开一个指定的注册表键
    /*LONG RegOpenKeyEx(
        HKEY hKey, // 需要打开的主键的名称
        LPCTSTR lpSubKey, //需要打开的子键的名称
        DWORD ulOptions, // 保留,设为0
        REGSAM samDesired, // 安全访问标记,也就是权限
        PHKEY phkResult // 得到的将要打开键的句柄
    ) */
    //返回值 如果函数调用成功,则返回0(ERROR_SUCCESS)。否则,返回值为文件WINERROR.h中定义的一个非零的错误代码。
    if(ret != ERROR_SUCCESS || comKey == NULL)
        return 0;

    char valName[256] = {0};
    BYTE val[256] = {0};
    DWORD idx, valType; //DWORD全称Double Word,是指注册表的键值,每个word为2个字节的长度,DWORD 双字即为4个字节,每个字节是8位,共32位。
    DWORD valBytesCount = sizeof(val)-1;
    DWORD valNameCount = sizeof(valName)-1;
    //枚举注册表中串口个数
    for(idx=0;;idx++)
    {
        //RegEnumValue是用来枚举指定项的值。
        ret = RegEnumValue(comKey,idx,valName,&valNameCount,NULL,&valType,val,&valBytesCount);
        /*
        参数 类型及说明
        RegEnumValue(
        hKey Long,一个已打开项的句柄,或者指定一个标准项名
        dwIndex Long,欲获取值的索引。注意第一个值的索引编号为零
        lpValueName String,用于装载位于指定索引处值名的一个缓冲区
        lpcbValueName Long,用于装载lpValueName缓冲区长度的一个变量。一旦返回,它会设为实际载入缓冲区的字符数量
        lpReserved Long,未用;设为零
        lpType Long,用于装载值的类型代码的变量
        lpData Byte,用于装载值数据的一个缓冲区
        lpcbData Long,用于装载lpData缓冲区长度的一个变量。一旦返回,它会设为实际载入缓冲区的字符数量
        )*/
        if(ret != ERROR_SUCCESS)
            break;
        if( valType != REG_SZ)
            continue;

        strcpy(comList[idx],(char*)val);
        valBytesCount = sizeof(val)-1;
        valNameCount = sizeof(valName)-1;
    }
    RegCloseKey(comKey);
    return idx;
}
展开阅读全文

没有更多推荐了,返回首页