我在机子上装了多串口卡以及它的驱动(MOXA C320Turbo/PCI Series(PCI Bus)),扩展了16个串口(从4到19),可是用下面的代码打开串口的时候,总是报错:系统找不到指定的文件,我应该怎么办?    HANDLE hFile = NULL;
    hFile = ::CreateFile(
                  "COM10",
                  GENERIC_READ | GENERIC_WRITE,
                  0,
                  0,
                  OPEN_EXISTING,
                  FILE_FLAG_OVERLAPPED,
                  NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        // Display error
        LPVOID lpMsgBuf;
        FormatMessage(
             FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
             NULL,
             GetLastError(),
             0,
             (LPTSTR) &lpMsgBuf,
             0,
             NULL);
        MessageBox((LPTSTR) lpMsgBuf, "错误", MB_OK | MB_ICONERROR);        LocalFree(lpMsgBuf);
        return NULL;
    }

解决方案 »

  1.   

    函数应该没有什么大问题.按照普通串口做就可以了.
    你可以用这个函数打开串口1,2吗?如果可以的话,问题应该还是出在驱动上.你的型号和你装的卡匹配吗?重新装一次试试.
    还有,换台机器再试试.我用过moxa的4串口卡,没有如何问题.就是不能用_inp得到状态而已了
      

  2.   

    Moxa卡的四串口我用过,跟其他的串口一样,不过可能端口地址有改变!
      

  3.   

    bool CSerial::Open(char mport[15], int nBaud, int nData, int nStop, int parity)
    {
    if( m_bOpened ) return(true ); char szPort[15];
    // char szComParams[50];
    DCB dcb; wsprintf( szPort, "%s", &mport[0] );
    m_hIDComDev = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL );
    if( m_hIDComDev == NULL ) return( FALSE ); memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
      memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) ); COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout = 10;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
    CommTimeOuts.ReadTotalTimeoutConstant = 2000;
    //CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
    //CommTimeOuts.WriteTotalTimeoutConstant = 5000;
    SetCommTimeouts( m_hIDComDev, &CommTimeOuts ); //wsprintf( szComParams, "COM%d:%d,n,8,1", nPort, nBaud ); m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
    m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); dcb.DCBlength = sizeof( DCB );
        GetCommState( m_hIDComDev, &dcb );

    dcb.fParity=FALSE;
    // dcb.fOutxCtsFlow=FALSE;
    // dcb.fOutxDsrFlow=FALSE;
    // dcb.fDtrControl=DTR_CONTROL_ENABLE;
    // dcb.fRtsControl=RTS_CONTROL_ENABLE;
    dcb.BaudRate =nBaud;
    dcb.ByteSize = nData;
    dcb.StopBits =nStop;
    dcb.Parity =parity;
        unsigned char ucSet;
    ucSet = (unsigned char) ( ( FC_RTSCTS & FC_DTRDSR ) != 0 );
    ucSet = (unsigned char) ( ( FC_RTSCTS & FC_RTSCTS ) != 0 );
    ucSet = (unsigned char) ( ( FC_RTSCTS & FC_XONXOFF ) != 0 ); if( !SetCommState( m_hIDComDev, &dcb ) ||
    !SetupComm( m_hIDComDev, 3000, 512 ) ||
    m_OverlappedRead.hEvent == NULL ||
    m_OverlappedWrite.hEvent == NULL ){
    DWORD dwError = GetLastError();
    if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent );
    if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent );
    CloseHandle( m_hIDComDev );
    return( false );
    } m_bOpened = true; return(m_bOpened );
      

  4.   

    BOOL CWf_yangDlg::InitCom()
    {
    CString ComName;
    DCB     lpDCB;    switch( m_ComParameter.ComPort){
                case 1:  ComName="Com1";break;
    case 2:  ComName="Com2";break;
                case 3:  ComName="Com3";break;
                case 4:  ComName="Com4";break; 
                case 5:  ComName="Com5";break;
                case 6:  ComName="Com6";break;
    case 7:  ComName="Com7";break;
    case 8:  ComName="Com8";break;
    default : return FALSE;
    }
    hCom = CreateFile(ComName, GENERIC_READ|GENERIC_WRITE, 0, NULL, 
                      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if ( hCom== INVALID_HANDLE_VALUE )
     return FALSE;
    SetupComm(hCom,m_ComParameter.BufferSize,m_ComParameter.BufferSize);
    GetCommState(hCom, &lpDCB);
    lpDCB.BaudRate = m_ComParameter.BaudRate;
    if(m_ComParameter.StopBit==0) lpDCB.StopBits=ONESTOPBIT; //1
    if(m_ComParameter.StopBit==1) lpDCB.StopBits=ONE5STOPBITS;//1.5
    if(m_ComParameter.StopBit==2) lpDCB.StopBits=TWOSTOPBITS;//2

    lpDCB.ByteSize = m_ComParameter.DataBit;
    //0-4=no,odd,even,,space 
    if(m_ComParameter.ParityBit==0) lpDCB.Parity=NOPARITY;
    if(m_ComParameter.ParityBit==1) lpDCB.Parity=ODDPARITY;
    if(m_ComParameter.ParityBit==2) lpDCB.Parity=EVENPARITY; if( !SetCommState(hCom, &lpDCB) )
     return FALSE;
    return TRUE;
    }
      

  5.   

    该公司产品(MOXA C320Turbo/PCI Series(PCI Bus))包装中有配套通用开发包,含例子,用改动态库编写快捷稳定。我用它开发用于商业大量监控数据收发,同时使用32口,很稳定。
      

  6.   

    问题的根本:
    当COM口号>=10的时候要用以下的方式打开CreateFile("\\\\.\\com10",.......否则...."总是报错:系统找不到指定的文件!"
    快去试试吧!
      

  7.   

    同意lin6194() 可是我现在还是没有搞明白怎么回事,想知道为什么要这么用的。
    关注!
      

  8.   

    感谢lin6194和li_guohua,你们说的方法都能实现。但是我曾经用lin6194说的方法试过,没有打开文件句柄,所以才发的帖子。
    是不是用WinAPI CreateFile会不稳定?当COM口号<10也可以用lin6194说的方法打开,为什么?
      

  9.   

    感谢lin6194和li_guohua,你们说的方法都能实现。但是我曾经用lin6194说的方法试过,没有打开文件句柄,所以才发的帖子。
    是不是用WinAPI CreateFile会不稳定?当COM口号<10也可以用lin6194说的方法打开,为什么?
      

  10.   

    具体原因我也不知道,但我这样用一直都没有问题,我用的也是MOXA的卡,有ISA的有PCI的。用他们提供的包编写,估计不能兼容其他公司的卡吧,通用性不如自己直接COM口操作的好,但是简单一些。
    CreateFile不稳定?应该不会吧,用到的地方太多了,如果不稳定的话,肯定早就发现了吧!打开失败,还是要检查一下软硬件的设置。
      

  11.   

    关注中,我正在研究串口的问题\,可我比较菜,只能来学习啦!!!各位大虾,
    另外,当你用串口接收数据时,是否用的多线程呢?假如是的话请指教一点,我用readfileex中的OVERLAPPED 结构创建事件,单步调试的时候能正确接收数据,而且创建事件也是成功的,可我在辅助线程中就是等不到事件。我用的是waitvomment函数?能指点一下吗?可不可以把你们的接受到数据后的创建事件部分的程序贴出来教教我呀,还有串口线程的查询部分.谢谢啦.由于我家不能上网,所以不能贴出代码来,遗憾
      

  12.   

    感谢lin6194和li_guohua,你们说的方法都能实现。但是我曾经用lin6194说的方法试过,没有打开文件句柄,所以才发的帖子。
    是不是用WinAPI CreateFile会不稳定?当COM口号<10也可以用lin6194说的方法打开,为什么?
      

  13.   

    当COM口号>=10的时候要用以下的方式打开CreateFile("\\\\.\\com10",.......MSDN上不是说的很清楚吗?呵呵