我写了一个串口测试程序,本来一直没什么问题得,可今天在测试通道得时候,
居然发现只要串口名称大于9也就是COM10及其以上得都说打开失败。很郁闷,不知道是为什么!
用超级终端打开是没问题得!还请高手指教!另外想问一下:怎么枚举出一台机子得所有串口啊?谢谢

解决方案 »

  1.   

    我打开串口得方法是:
    CreateFile(lpszPortNum,
    GENERIC_READ|GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
    NULL))==(HANDLE)-1)
    请各位帮忙啊
      

  2.   

    不知道楼主的问题解决了没有。如果没有可以看看我的建议,应该不会白看的
    楼主如果用MSCOMM32.ocx控件的话,就不会有这个问题了。
    如果用CreateFile()来打开串口的话,其中参数lpszPortNum指的就是串口名,如
    "COM1","COM2",,"COM9"。
    为什么只到"COM9",因为从"COM10"以后名字不一样了。
    如串口10,对应的参数为"\\\\.\\COM10",
    至于串口11以后的,我就不说了,楼主应该能想到了。
    至于要枚举出一台机子得所有串口,楼上回答过这个问题,我不说了
      

  3.   

    xx是否与串口的输入输出范围有关03F8-03FF
      

  4.   

    我使用了一个CSerialPort 的串口类,并未见到有何异常
    void CLSComm::Initialize(UINT uBaud, char chParity, UINT uDataBits, float fStopBits)
    {
    m_uBaudRate = uBaud;
    m_chParity = chParity;
    m_uDataBits = uDataBits; if (fStopBits == 1.5) // 1.5 个停止位
    m_uStopBits = 2;
    else if(fStopBits > 1.5) // 2 个停止位
    m_uStopBits = 3;
    else
    m_uStopBits = 1; // 1 个停止位
    }BOOL CLSComm::OpenDevice(UINT uPort, HWND hMsgTarget)
    {
    BOOL bResult = FALSE;
    TCHAR szPort[MAX_PATH];
    TCHAR szBaud[MAX_PATH]; m_uCommPort = uPort;
    m_hTargetWindow = hMsgTarget; CloseDevice(); m_hWriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // 发送数据事件
    m_hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // 关闭线程的事件
    m_ovComm.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // 读取数据事件

    m_hEventArray[USER_EVENT_QUIT] = m_hShutdownEvent;
    m_hEventArray[USER_EVENT_RECEIVE] = m_ovComm.hEvent; 
    m_hEventArray[USER_EVENT_SEND] = m_hWriteEvent; 

    wsprintf(szPort, _T("\\\\.\\COM%d"), m_uCommPort);
    wsprintf(szBaud, _T("baud=%d parity=%c data=%d stop=%d"), m_uBaudRate, m_chParity, m_uDataBits, m_uStopBits); InitializeCriticalSection(&m_csCritical); 
    EnterCriticalSection(&m_csCritical);  // 打开串口设备
    m_hDevice = CreateFile(szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
    if (m_hDevice == INVALID_HANDLE_VALUE)
    {
    m_hDevice = NULL;
    return FALSE; 
    }

    if (SetCommTimeouts(m_hDevice, &m_timeoutComm)) 

    if (SetCommMask(m_hDevice, EV_RXCHAR | EV_TXEMPTY | EV_CTS)) 

    if (GetCommState(m_hDevice, &m_dcbComm)) 

    m_dcbComm.fRtsControl = RTS_CONTROL_ENABLE; 
    //m_dcbComm.fRtsControl = RTS_CONTROL_DISABLE; 
    //m_dcbComm.fDtrControl = DTR_CONTROL_ENABLE;
    if (BuildCommDCB(szBaud, &m_dcbComm)) 

    if (SetCommState(m_hDevice, &m_dcbComm))
    {
    PurgeComm(m_hDevice, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT); 
    m_hCommThread = CreateThread(NULL, 0, _CommThread, this, 0, &m_dwCommThreadID); 
    bResult = (m_hCommThread != NULL) ? TRUE : FALSE;
    }





    LeaveCriticalSection(&m_csCritical);  if (!bResult)
    CloseDevice();
    else
    m_bThreadAlive = TRUE;

    return bResult; 
    }