您的位置:首页 > 其它

笔记:做一个MFC串口界面遇到的一些问题和解决思路

2014-08-07 17:20 513 查看
以前没接触过Windows 编程,首先看了《鸡啄米的MFC教材》,文章浅显易懂,深入浅出。

一些问题和解决方案:

1.遇到的问题:m_EditSend发送Unicode的字符接收回来乱码。

解决办法:直接用双引号的字符串。

2.遇到的问题:清屏(m_EditReceive.Empty())后,其他编辑框也被“清空”。

解决办法:不用

m_EditReceive.Empty();

UpdateData(FALSE),

改用  

m_EditReceive.Empty();

SetDlgItemText(IDC_EDIT_RECEIVE,m_EditReceive);因为UpdateData(FALSE)会更新所有编辑框。

3.遇到的问题:编辑框的滚动条始终在最开始,而不会一直显示最低端

  解决办法:在显示之前添加:m_EditScroll.PostMessage(WM_VSCROLL, SB_BOTTOM,0);//让滚动条在低端显示m_EditScroll为编辑框控制变量

4遇到的问题:接收到的字符很乱,清屏后第一页输出的数据都一样而且会乱,譬如,要输出“hello world!”实际输出为“hello hello world!”等等,毫无规律。

  解决办法:不用原来的m_EditScroll.ReplaceSel(m_EditReceive);换成使用SetDlgItemText(IDC_EDIT_RECEIVE,m_EditReceive);

5,遇到的问题:分行很乱

  解决办法:加一个判断

                if(*(rxdata+k) == 10)//回车的ASCII码

                {

                    CString temp=(CString)"\r\n"; //换行

                    strtemp+=temp;

                }

6.遇到的问题:运行软件后,按回车会自动退出

解决方案:原来按回车键默认是运行void OnOK{ },用空函数覆盖原来的OnOK(){ };但我想把焦点放在输入按钮上,按回车时就可以点击输入按钮了。所用最后我没有选择重写OnOK();而是在要设置成焦点的按钮(输入按钮)上的“Default Button”属性改为True即可。

7.遇到的问题:在另外一台新电脑上测试软件,发现打不开

解决办法:用静态链接库编译,并且在新电脑上注册MSCOMM32.OCX。

8.遇到的问题:在测试人员的电脑上测试,发现串口号很大,选择不出来

解决办法:在设备管理那里修改串口号(原来串口号可以修改的)

9.遇到的问题:小的串口端口用完了,大的端口又没得选择(组合框)

解决办法:把原来固定的串口端口改为读注册表得出串口端口名然后转换成组合框对应索引号

在网上找到一个比较清晰的枚举该计算机的所有串口端口代码:

void CMyDlg::FindCommPort(CComboBox *pComboBox )

{

    HKEY hKey;

#ifdef _DEBUG

    ASSERT( pComboBox != NULL );

    pComboBox->AssertValid();

#endif

    if( ::RegOpenKeyEx( HKEY_LOCAL_MACHINE,

        (CString)"Hardware\\DeviceMap\\SerialComm",

        NULL,

        KEY_READ,

        &hKey) == ERROR_SUCCESS) // 打开串口注册表

    {

        int i=0;

        char portName[256],commName[256];

        DWORD dwLong,dwSize;

        while(1)

        {

            dwLong = dwSize = sizeof(portName);

            if( ::RegEnumValue( hKey,

                i,

                (LPTSTR)portName,

                &dwLong,

                NULL,

                NULL,

                (PUCHAR)commName,

                &dwSize ) == ERROR_NO_MORE_ITEMS ) // 枚举串口

                break;

            pComboBox->AddString( (LPCTSTR)commName ); // commName就是串口名字

            i++;

            //MessageBox((LPCTSTR)commName);

        }

        if( pComboBox->GetCount() == 0 )

        {

            AfxMessageBox(_T("在HKEY_LOCAL_MACHINE:Hardware\\DeviceMap\\SerialComm里找不到串口!!!") );

        }

        RegCloseKey(hKey);

    }

}

在获得组合框控制变量后,

    int i;

    i=m_PortCtrl.GetCurSel();

    m_PortCtrl.GetLBText(i,GetSel);

    //MessageBox(GetSel);

    i=GetSel.GetLength();

    switch(i)

    {

    case 4:nSel=(GetSel[3]-'0');break;

    case 5:nSel=10*(GetSel.GetAt(3)-'0')+(GetSel[4]-'0');break;

    case 6:nSel=100*(GetSel.GetAt(3)-'0')+10*(GetSel.GetAt(4)-'0')+(GetSel.GetAt(5)-'0');break;

    default :MessageBox(_T("串口初始化失败!"));

    }

就可以算出串口端口号nSel了。

但是悲剧的是:串口控件最大也只能支持16个端口。用API的CreateFile()好像可以打开所有的端口,这个留给以后再拓展了。

以上某些理解错了,请大家多多指点。刚接触Windows编程,尤其API的一些东西,感觉比较深奥,但是一步步循序渐进的解决过程还是能学到很多东西的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: