http://www.vchelp.net/source/submit/rs232_com_test.zip

解决方案 »

  1.   

    看看这里,可能会有所帮助 
     
    BOOL  CDataDlg::OnInitDialog()    
    {  
        CDialog::OnInitDialog();  
          
        m_Send=false;  
        //  TODO:  Add  extra  initialization  here  
        if(m_ComCtrl.GetPortOpen())  
            m_ComCtrl.SetPortOpen(FALSE); 
     
        m_ComCtrl.SetCommPort(1);      //选择com1  
        if(  !m_ComCtrl.GetPortOpen())  
            m_ComCtrl.SetPortOpen(TRUE);//打开串口  
        else  
            AfxMessageBox("不能打开串口"); 
     
        m_ComCtrl.SetSettings("2400,n,8,1");  //波特率2400,无校验,8个数据位,1个停止位  
        m_ComCtrl.SetInputMode(1);  //以二进制方式检到数据  
        m_ComCtrl.SetRThreshold(20);  
        //参数5表示每当串口接收缓冲区中有多于或等于5个字符时将引发一个接收数据的OnComm事件  
        m_ComCtrl.SetInputLen(40);    //设置当前接收区数据长度为0  
        m_ComCtrl.GetInput();//先预读缓冲区以清除残留数据  
          
        m_length=0;  
        return  TRUE;    //  return  TRUE  unless  you  set  the  focus  to  a  control  
                                    //  EXCEPTION:  OCX  Property  Pages  should  return  FALSE  
    }  
    void  CDataDlg::OnComm()    
    {  
        static  int  ErrFlag1=0;  
        static  int  ErrFlag2=0;  
        VARIANT  variant_inp;  
        COleSafeArray  safearray_inp;  
        LONG  len,k;  
    //    BYTE  rxdata[350];  //设置BYTE数组  An  8-bit  integerthat  is  not  signed.  
        CString  strtemp;  
        strtemp="fg";  
        if(m_Send==true)  
        {  
            m_Send=false;  
            CByteArray  Data;  
            Data.SetSize(1);  
            Data[0]=m_CtrlData;  
            m_ComCtrl.SetOutput(COleVariant(Data));  
        }  
        if(m_ComCtrl.GetCommEvent()==2)          //事件值为2表示接收缓冲区内有字符  
        {  
            variant_inp=m_ComCtrl.GetInput();      //读缓冲区  
            safearray_inp=variant_inp;                      //VARIANT型变量转换为ColeSafeArray型变量  
            len=safearray_inp.GetOneDimSize();  //得到有效数据长度  
            {  
                for(k=0;k<len;k++)  
                    safearray_inp.GetElement(&k,m_rxdata+k);//转换为BYTE型数组  
        //        AfxMessageBox((char*)rxdata,NULL,NULL);  
                m_length=len;  
            }  
        int    tmp1;  
        int    tmp2;  
        k=0;  
    ///以下为解码及滤波  
        while(  
            !(m_rxdata[k]==0xF0  
            &&m_rxdata[k+1]==0xF1)  
            &&k+5<m_length)  
            k++;  
        if(k+5>=m_length)  
            return;  
        tmp1=m_rxdata[k+2]*256+m_rxdata[k+3];  
        tmp2=m_rxdata[k+4]*256+m_rxdata[k+5];  
        m_ADData1=tmp1;  
        if(fabs(m_ADData1Last-m_ADData1)>=100&&ErrFlag1==0)  
        {  
            ErrFlag1=1;  
            m_ADData1=m_ADData1Last;  
        }  
        else  
        {  
            ErrFlag1=0;  
        }  
        m_ADData1Last=m_ADData1;  
        m_ADData2=tmp2;  
        if(fabs(m_ADData2Last-m_ADData2)>=100&&ErrFlag2==0)  
        {  
            ErrFlag2=1;  
            m_ADData2=m_ADData2Last;  
        }  
        else  
        {  
            ErrFlag2=0;  
        }  
        m_ADData2Last=m_ADData2;  
        m_Port=m_rxdata[k+6];  
        m_Port=m_Port&3;  
        m_JDQStat=m_rxdata[k+7];  
        m_length=0;  
        }  
      

  2.   

    class CSerial  
    {
    public:
    CSerial();
    virtual ~CSerial(); BOOL Init(int nPort);
    BOOL SetSettings(int nBaudRate, BYTE byParity, BYTE byByteSize, BYTE byStopBits);
    BOOL Read(CString& str);
    BOOL Read(LPTSTR lpsz, int nMax);
    BOOL Write(LPCTSTR szBuf, int nBufLen);private:
    HANDLE m_hComm;
    };CSerial::CSerial()
    {
    m_hComm = INVALID_HANDLE_VALUE;
    }CSerial::~CSerial()
    {
    if (m_hComm != INVALID_HANDLE_VALUE)
    {
    CloseHandle(m_hComm);
    }
    }BOOL CSerial::Init(int nPort)
    {
    char szBuf[10];
    sprintf(szBuf, "COM%d", nPort);
    m_hComm = CreateFile(szBuf,
     GENERIC_READ | GENERIC_WRITE,
     0,    // comm devices must be opened w/exclusive-access 
     NULL, // no security attributes 
     OPEN_EXISTING, // comm devices must use OPEN_EXISTING 
     0,    // not overlapped I/O 
     NULL  // hTemplate must be NULL for comm devices 
     );
    if (m_hComm == INVALID_HANDLE_VALUE)
    {
    return FALSE;
    }
    COMMTIMEOUTS cto;
    // 设置超时
    GetCommTimeouts(m_hComm, &cto);
    cto.ReadIntervalTimeout = 10; // 读间隔时间(毫秒)
    cto.WriteTotalTimeoutConstant = 0;
    cto.WriteTotalTimeoutMultiplier = 0;
    SetCommTimeouts(m_hComm, &cto);
    return TRUE;
    }BOOL CSerial::SetSettings(int nBaudRate, BYTE byParity, BYTE byByteSize, BYTE byStopBits)
    {
    DCB dcb;
    BOOL bSuccess; bSuccess = GetCommState(m_hComm, &dcb); if (!bSuccess) 
    {
    return FALSE;
    } // Fill in the DCB: baud=9600, 8 data bits, no parity, 1 stop bit. 
    dcb.BaudRate = nBaudRate;
    dcb.ByteSize = byByteSize;
    dcb.Parity = byParity;
    dcb.StopBits = byStopBits; bSuccess = SetCommState(m_hComm, &dcb); if (!bSuccess) 
    {
    return FALSE;
    }
    return TRUE;
    }BOOL CSerial::Read(CString& str)
    {
    DWORD n;
    LPSTR p = str.GetBuffer(1024);
    BOOL bSuccess = ReadFile(m_hComm, p, 1024, &n, NULL);
    str.ReleaseBuffer();
    return bSuccess;
    }BOOL CSerial::Read(LPTSTR lpsz, int nMax)
    {
    DWORD n;
    return ReadFile(m_hComm, lpsz, nMax, &n, NULL);
    }BOOL CSerial::Write(LPCTSTR szBuf, int nBufLen)
    {
    DWORD n;
    WriteFile(m_hComm, szBuf, (DWORD)nBufLen, &n, NULL);
    if (n != (DWORD)nBufLen)
    {
    return FALSE;
    }
    return TRUE;
    }
    CSerial serial;
    serial.Init(1);// com1
    serial.Settings(9600,8,ONESTOPBIT,NOPARITY);
    CString str;
    serial.Read(str);
    serial.Write("Test", 4);// 加长度是为了可以发送\0