用VC编了一串口通信的程序,用CreateFile打开COM3返回无效句柄,但虚拟串口软件显示COM3已经打开,不知到什么原因??
我用的虚拟串口软件是VSPD XP 5,
BOOL CDevice::OpenDevice()
{

if (!m_bDevOpened) 
{        m_hDevice = CreateFile( "COM3",   
GENERIC_READ | GENERIC_WRITE,       
0,                                  
NULL,                               
OPEN_EXISTING,                      
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //把此参数改为0结果一样                                 
NULL);                    if (m_hDevice = INVALID_HANDLE_VALUE)
{
m_bDevOpened=false;
}
 
if (GetCommState(m_hDevice,&config_) == 0)
{          
AfxMessageBox("Get configuration port has problem.");
m_bDevOpened=false;
return m_bDevOpened;
}

config_.ByteSize = 8;          
config_.StopBits = ONESTOPBIT; 
config_.Parity = NOPARITY;     
config_.BaudRate = CBR_9600;  
if (SetCommState(m_hDevice,&config_) == 0)
{
AfxMessageBox("Set configuration port has problem.");
m_bDevOpened=false;
return m_bDevOpened;
}

解决方案 »

  1.   

    看过了LastError返回的是句柄无效,不知道十不是虚拟串口软件是VSPD XP 5, 的问题啊
      

  2.   

    非常感谢大家的热心解答!!
    其他串口也一样,都试了。多次打开了同一个串口,这个可能可以排除。我又写了一简单的只有串口操作的程
    序,串口可以打开但无法配置串口,VSPM和VSPD XP 5都是这样,
    if(!handlePort)
    {handlePort = CreateFile("COM2",  
        GENERIC_READ | GENERIC_WRITE,       
        0,                                  
        NULL,                              
        OPEN_EXISTING,                      
        0,                                 
        NULL);       
    if (GetCommState(handlePort,&config) == 0)
        {
          AfxMessageBox("Get configuration port has problem.");
      
          return FALSE;
        }
        
        config.BaudRate = CBR_9600;    
        config.StopBits = 1;    
        config.Parity = 1;        
        config.ByteSize = 8;    
       
        if (SetCommState(handlePort,&config) == 0)
        {
           AfxMessageBox("Set configuration port has problem.");
           return FALSE;
        }
    SetCommState返回0值,是不是我的虚拟串口配置有问题啊?
    我现在写的串口程序是读取单片机发送的数据,是不是我用的虚拟串口软件不对啊?
      

  3.   

    我也遇到这个问题了
    其实只要在"COM2"后面增加一个“COM2:”,追加一个冒号就可以了