我用CSerialPort串口类做通讯程序,我用注册表得到我想要的串口号,例如是COM3。并在CCombobox的下拉列表中显示出来,当我选中COM3后,点打开串口按钮,总是显示:未发现此串口。我把我的按钮程序粘贴在下面,请大家指教指教我这个菜鸟。本人分很少请大家见谅O(∩_∩)O~
void CPropPageReaddate::OnButton1() 
{
// TODO: Add your control notification handler code here
int index;
        CString str;
index=m_memoCOM.GetCurSel();//得到当前是第几项
if(index==CB_ERR)
{
         MessageBox("没有串口被选中");
         return;
}
        m_memoCOM.GetWindowText(str); char m_cParity;
DWORD m_dwCommEvents;
m_cParity='N';
m_dwCommEvents = EV_RXFLAG | EV_RXCHAR;
if (m_Port.InitPort(this, index+1, 9600,m_cParity,8,1,m_dwCommEvents,512))
{
m_Port.StartMonitoring();//启动串口监视线程
str.Format("串口%d已经准备好,请发送数据…………",index+1);
char *szout;
szout=str.GetBuffer(str.GetLength());//把str这个字符串转换成char型的数组
m_List1.AddString(szout);//添加一个字符串到列表中
char aa[20]=" ";
sprintf(aa,"串口%d已经打开",index+1);//在按钮上写字儿,打印一个字符串保存在aa中
m_openCOM.SetWindowText(aa);//更新按钮字
}
else
{
str.Format("没有发现此串口%d…………",index+1);
char *szout;
szout=str.GetBuffer(str.GetLength());
MessageBox(szout);
}
}

解决方案 »

  1.   

    请大家帮帮忙啊~~~~(>_<)~~~~ 我分数很少,请大家见谅啊
      

  2.   

    你再单步进去,看看这个函数?if (m_Port.InitPort(this, index+1, 9600,m_cParity,8,1,m_dwCommEvents,512))
      

  3.   

    Debug下进入InitPort函数中看看,为什么失败??
      

  4.   

    我先前是直接在CCombobox里固化了几个COM口,然后自己一个一个的选择试,要是选对了,点击按钮后就显示:串口打开。没选对就显示:未发现此串口。这样执行时程序就是对的。后来觉得这样不好,于是就想弄个函数自动寻找串口,我把这个函数也粘到这儿。然后运行时就不再执行InitPort这个函数了,直接就显示:未发现此串口。真不知道怎么改。
    下面是寻找串口的函数
    int CPropPageReaddate::GetSeriNum()
    {
        int reg;

    // CStringArray strCommArr; 
        HKEY hKey;  
        int rtn; 
        //m_cmbComm.ResetContent();  
        rtn = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Hardware\\DeviceMap\\SerialComm",  
    NULL, KEY_READ, &hKey);  //  打开串口注册表 
    if( rtn == ERROR_SUCCESS)    
    {  
            int  i=0;  
            char  portName[256],commName[256];  
            DWORD  dwLong,dwSize;  
            while(1)  
    {  
                dwSize =  sizeof(portName);  
                dwLong  =  dwSize; 
                rtn = RegEnumValue( hKey, i, portName, &dwLong,  
    NULL, NULL, (PUCHAR)commName, &dwSize ); 

    //  
                if( rtn == ERROR_NO_MORE_ITEMS )  //  枚举串口  
    {
    break;  
    }
             //   strCommArr.Add(commName); 
                m_memoCOM.AddString(commName);
    i++;   
            }
            reg=i;

    RegCloseKey(hKey);  
        return reg;
    }
    请大家指教。是不是这个COM口得存到CCombobox里啊?怎么存呢?
      

  5.   

    那个类 串口中有 1 到 4 的限制,不知你打开是多少
    this 指针对吗?是串口拥有者的CWnd* pWnd
    你的串口有没有被其它程序 占用呢 ,有没有这个串口呢
    跟踪到InitPort函数里边进去,看看那个地址返回错了呢。
      

  6.   

    这个与你的串口查找函数没有关系 ,先前对,现在不对,可能是你传的参数有关,跟踪到InitPort函数里边进去看看
      

  7.   

    恩,是我想要的值。InitPort里的参数分别为this,1+1,9600,‘N’8,1,3,512。我觉得参数是对的啊
      

  8.   

    m_Port.InitPort(this, index+1, 9600,m_cParity,8,1,m_dwCommEvents,512)
    中的参数值分别为index=1,m_cParity=78'N',m_dwCommEvents=3(但是这个3在信息区显示是红色的),我的com口就是COM3。所以我觉得函数传递应该是对的吧?
      

  9.   

    IF 断点,F11 到  InitPort内部你会不?这样进到函数内看看,再不行,你发过来我看看,
      

  10.   

    m_Port.InitPort(this, index+1, 9600,m_cParity,8,1,m_dwCommEvents,512)
    中的参数值分别为index=1,m_cParity=78'N',m_dwCommEvents=3(但是这个3在信息区显示是红色的),我的com口就是COM3。所以我觉得函数传递应该是对的吧? 你的COM 口是 3 那么 InitPort 第二个参数是 3才对啊,而不是 INDEX +1 等于 2 啊,你说对不?
     
      

  11.   

    m_memoCOM.GetLBText(m_nCom, str);
        str = str.Right(1);
        m_nCom = atoi(str); 
    //以 9600 COM 1 打开串口 
        
    if (m_SerialPort.InitPort(this, m_nCom,
      

  12.   


    if(index==CB_ERR)
    {
      MessageBox("没有串口被选中");
      return;
    }你自动查找串口后,确实没有看到你有操作过CCombox你确定你自动查找到的Comname和你CCombox选择的Comname是一致的么?自动查找串口后比较combox中的候选项,然后选中匹配项。
      

  13.   

    问题解决了,谢谢大家!谢谢LZNJ06的提示!