我的串口程序 BuildCommDCB("COM1:115200,n,8,1",&dcb);使用了这一句以后,出现
以下问题
             Unhandled exception in callsu.exe (KERNEL32.DLL): 0xC0000005:Access Violation
在2k 和xp下调试均没有次错误,但是在98和me下有。 hCommDev=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
if(hCommDev!=(HANDLE)-1)
                         { flagcom=TRUE;                           dcb.BaudRate=9600;
   dcb.ByteSize=8;
   dcb.Parity=NOPARITY;
   dcb.StopBits=ONESTOPBIT;

                     //  BuildCommDCB("COM1:115200,n,8,1",&dcb);
                           SetCommState(hCommDev,&dcb);   //以上为初始化串口
     
                           COMMTIMEOUTS CommTimeOuts;
                           CommTimeOuts.ReadIntervalTimeout=MAXDWORD;
                           CommTimeOuts.ReadTotalTimeoutMultiplier=0;
                           CommTimeOuts.ReadTotalTimeoutConstant=0;
                           CommTimeOuts.WriteTotalTimeoutMultiplier=0;
                           CommTimeOuts.WriteTotalTimeoutConstant=1000;
                           SetCommTimeouts(hCommDev,&CommTimeOuts);
                           PurgeComm(hCommDev,PURGE_TXCLEAR);
                           PurgeComm(hCommDev,PURGE_RXCLEAR); //设置读写串口超时时间
                       
                         bReturn=WriteFile(hCommDev,strOutMsg,strlen(strOutMsg),&dwBytesWritten,NULL);
                         if(!bReturn)flagmodem=FALSE;
                 else flagmodem=TRUE;
                          }          else flagcom=FALSE;

解决方案 »

  1.   

    操作系统不一样,98和me的api也不同吧
      

  2.   

    这个一般不用BuildCommDCB,而用SetCommState、GetCommState 
    注意在SetCommState前要调用GetCommState;
    BOOL NEAR SetupConnection() 
    {       BOOL fRetVal; 
            DCB dcb; 
             
            if (!npGPSInfo) return(FALSE);         dcb.DCBlength=sizeof(DCB);         GetCommState(COMDEV(npGPSInfo),&dcb);         dcb.BaudRate=BAUDRATE(npGPSInfo); 
            dcb.ByteSize=BYTESIZE(npGPSInfo); 
            dcb.Parity=PARITY(npGPSInfo); 
            dcb.StopBits=STOPBITS(npGPSInfo);         dcb.fOutxDsrFlow=FALSE; 
            dcb.fDtrControl=DTR_CONTROL_ENABLE;         dcb.fOutxCtsFlow=FALSE; 
            dcb.fRtsControl=RTS_CONTROL_ENABLE; 
            dcb.fInX=dcb.fOutX=FALSE; 
            dcb.fBinary=TRUE; 
            dcb.fParity=TRUE;         fRetVal=SetCommState(COMDEV(npGPSInfo),&dcb); 
            return (fRetVal); 
    }
      

  3.   

    还有很多办法,无非是打开COM口,用ms的MSCOMM控件也行!参考VCKBASE.COM下面是摘录的打开函数,一看就清楚了:
    void CSerialPort::Open(int nPort, DWORD dwBaud, Parity parity, BYTE DataBits, StopBits stopbits, FlowControl fc, BOOL bOverlapped)
    {
      //Validate our parameters
      ASSERT(nPort>0 && nPort<=255);  Close(); //In case we are already open  //Call CreateFile to open up the comms port
      CString sPort;
      sPort.Format(_T("\\\\.\\COM%d"), nPort);
      DWORD dwCreateProperty;
      if(bOverlapped) 
      {
         dwCreateProperty=FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED;
      }
      else
      {
     dwCreateProperty=FILE_ATTRIBUTE_NORMAL;
      }
      // bOverlapped ? FILE_FLAG_OVERLAPPED : 0
      m_hComm = CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,dwCreateProperty, NULL);
      if (m_hComm == INVALID_HANDLE_VALUE)
      {
        TRACE(_T("Failed to open up the comms port\n"));
        AfxThrowSerialException();
      }  this->m_CurPortNum = nPort;
      //Create the event we need for later synchronisation use
      /*
      if(bOverlapped)
      {
    m_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    if (m_hEvent == NULL)
    {
    Close();
    TRACE(_T("Failed in call to CreateEvent in Open\n"));
    AfxThrowSerialException();
    }
      }
      */
     
      m_bOverlapped = bOverlapped;
      
      //Get the current state prior to changing it
      DCB dcb;
      dcb.DCBlength = sizeof(DCB);
      GetState(dcb);  //Setup the baud rate
      dcb.BaudRate = dwBaud;   //Setup the Parity
      switch (parity)
      {
        case EvenParity:  dcb.Parity = EVENPARITY;  break;
        case MarkParity:  dcb.Parity = MARKPARITY;  break;
        case NoParity:    dcb.Parity = NOPARITY;    break;
        case OddParity:   dcb.Parity = ODDPARITY;   break;
        case SpaceParity: dcb.Parity = SPACEPARITY; break;
        default:          ASSERT(FALSE);            break;
      }  //Setup the data bits
      dcb.ByteSize = DataBits;  //Setup the stop bits
      switch (stopbits)
      {
        case OneStopBit:           dcb.StopBits = ONESTOPBIT;   break;
        case OnePointFiveStopBits: dcb.StopBits = ONE5STOPBITS; break;
        case TwoStopBits:          dcb.StopBits = TWOSTOPBITS;  break;
        default:                   ASSERT(FALSE);               break;
      }  //Setup the flow control 
      dcb.fDsrSensitivity = FALSE;
      switch (fc)
      {
        case NoFlowControl:
        {
          dcb.fOutxCtsFlow = FALSE;
          dcb.fOutxDsrFlow = FALSE;
          dcb.fOutX = FALSE;
          dcb.fInX = FALSE;
          break;
        }
        case CtsRtsFlowControl:
        {
          dcb.fOutxCtsFlow = TRUE;
          dcb.fOutxDsrFlow = FALSE;
          dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
          dcb.fOutX = FALSE;
          dcb.fInX = FALSE;
          break;
        }
        case CtsDtrFlowControl:
        {
          dcb.fOutxCtsFlow = TRUE;
          dcb.fOutxDsrFlow = FALSE;
          dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
          dcb.fOutX = FALSE;
          dcb.fInX = FALSE;
          break;
        }
        case DsrRtsFlowControl:
        {
          dcb.fOutxCtsFlow = FALSE;
          dcb.fOutxDsrFlow = TRUE;
          dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
          dcb.fOutX = FALSE;
          dcb.fInX = FALSE;
          break;
        }
        case DsrDtrFlowControl:
        {
          dcb.fOutxCtsFlow = FALSE;
          dcb.fOutxDsrFlow = TRUE;
          dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
          dcb.fOutX = FALSE;
          dcb.fInX = FALSE;
          break;
        }
        case XonXoffFlowControl:
        {
          dcb.fOutxCtsFlow = FALSE;
          dcb.fOutxDsrFlow = FALSE;
          dcb.fOutX = TRUE;
          dcb.fInX = TRUE;
          dcb.XonChar = 0x11;
          dcb.XoffChar = 0x13;
          dcb.XoffLim = 100;
          dcb.XonLim = 100;
          break;
        }
        default:
        {
          ASSERT(FALSE);
          break;
        }
      }
      
      //Now that we have all the settings in place, make the changes
      SetState(dcb);
    }
      

  4.   

    同意xiaohedou(小黑豆)的,再看看baudrate 115200是否可行
      

  5.   

    问题已解决,SetCommState、GetCommState 可以正常运行,可是奇怪的是,在还是在98下
    如果在对话框程序中使用BuildCommDCB是一切正常的,可是在D/V下就不行,而sk/xp中,对话框
    和d/v中都正常,可能是microsoft的bug