zoukankan      html  css  js  c++  java
  • PC与单片机串通(串口通信)

    下面是MFC实现的部分关键代码(仅供参考) 

    SendDlg::SendDlg(CWnd*   pParent   /*=NULL*/)  
      :   CDialog(SendDlg::IDD,   pParent)  
      {  
      //{{AFX_DATA_INIT(SendDlg)  
      m_Baud   =   -1;  
      //}}AFX_DATA_INIT  
      CurrentlyDisplayMax   =   0;  
      m_Text0   =   "请确认电缆线已与COM1口正确连接,";  
      m_Text     =   "复位显示屏后,单击“发送”按钮。";  
      IsSend   =   false;  
       
      m_bConnected=false;  
      m_nBaud   =   9600;  
      m_Baud   =   1;  
      m_nDataBits   =   8;  
      m_bEcho   =   FALSE;  
      m_nFlowCtrl   =   0;  
      m_bNewLine   =   FALSE;  
      m_nParity   =   1;  
      m_sPort   =   "COM1";  
      m_nStopBits   =   0;  
      }  
      SendDlg::~SendDlg()  
      {  
      if(m_bConnected)  
      CloseConnection();  
      }  
      BOOL   SendDlg::ConfigConnection()     //打开串口COM1设定  
      {  
      DCB   dcb;  
       
      if(!GetCommState(m_hCom,   &dcb))  
      return   FALSE;  
       
      dcb.fBinary=TRUE;  
      dcb.BaudRate=m_nBaud;   //   波特率  
      dcb.ByteSize=m_nDataBits;   //   每字节位数  
      dcb.fParity=TRUE;  
      switch(m_nParity)   //   校验设置  
      {  
      case   0:   dcb.Parity=NOPARITY;  
      break;  
      case   1:   dcb.Parity=EVENPARITY;  
      break;  
      // case   2:   dcb.Parity=ODDPARITY;  
      // break;  
      // default:;  
      }  
       
      switch(m_nStopBits)   //   停止位  
      {  
      case   0:   dcb.StopBits=ONESTOPBIT;  
      break;  
      case   1:   dcb.StopBits=ONE5STOPBITS;  
      break;  
      case   2:   dcb.StopBits=TWOSTOPBITS;  
      break;  
      // default:;  
      }  
       
      //   硬件流控制设置  
      dcb.fOutxCtsFlow=m_nFlowCtrl==1;  
      dcb.fRtsControl=m_nFlowCtrl==1?  
      RTS_CONTROL_HANDSHAKE:RTS_CONTROL_ENABLE;  
      //   XON/XOFF流控制设置  
      dcb.fInX=dcb.fOutX=m_nFlowCtrl==2;  
      dcb.XonChar=XON;  
      dcb.XoffChar=XOFF;  
      dcb.XonLim=50;  
      dcb.XoffLim=50;  
      return   SetCommState(m_hCom,   &dcb);  
      }  
       
      BOOL   SendDlg::OpenConnection()     //打开COM1  
      {  
      COMMTIMEOUTS   TimeOuts;  
       
      if(m_bConnected)  
      return   FALSE;  
      m_bConnected   =   true;  
       
      m_hCom=CreateFile(m_sPort,   GENERIC_READ   |   GENERIC_WRITE,   0,   NULL,  
      OPEN_EXISTING,   FILE_ATTRIBUTE_NORMAL,NULL);   //   非重叠方式  
       
      if(m_hCom==INVALID_HANDLE_VALUE)  
      return   FALSE;  
       
      SetupComm(m_hCom,MAXBLOCK,MAXBLOCK);  
      SetCommMask(m_hCom,   EV_CTS|EV_DSR|EV_RLSD);  
       
      //   把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作  
      TimeOuts.ReadIntervalTimeout=MAXDWORD;    
      TimeOuts.ReadTotalTimeoutMultiplier=0;    
      TimeOuts.ReadTotalTimeoutConstant=0;    
      /*   设置写超时以指定WriteComm成员函数中的  
      GetOverlappedResult函数的等待时间*/  
      TimeOuts.WriteTotalTimeoutMultiplier=50;    
      TimeOuts.WriteTotalTimeoutConstant=2000;  
      SetCommTimeouts(m_hCom,   &TimeOuts);  
       
      if(!ConfigConnection())  
      {  
      CloseHandle(m_hCom);  
      return   FALSE;  
      }  
      return   TRUE;  
      }  
       
      void   SendDlg::CloseConnection()     //关闭COM1  
      {  
      if(!m_bConnected)    
      return;  
      m_bConnected=false;  
      CloseHandle(m_hCom);  
      }  
       
      DWORD   SendDlg::ReadComm(unsigned   char   *buf,DWORD   dwLength)      
      {                                                                 //读COM1一字节  
      DWORD   length=dwLength;  
      COMSTAT   ComStat;  
      DWORD   dwErrorFlags;  
      ClearCommError(m_hCom,&dwErrorFlags,&ComStat);  
      length=min(dwLength,   ComStat.cbInQue);  
      ReadFile(m_hCom,buf,length,&length,NULL);  
      return   length;  
      }  
       
      DWORD   SendDlg::WriteComm(unsigned   char   buf,DWORD   dwLength)  
      {                                                             //写COM1一字节  
      BOOL   fState;  
      DWORD   length=dwLength;  
      COMSTAT   ComStat;  
      DWORD   dwErrorFlags;  
      OVERLAPPED   m_osWrite;  
       
      ClearCommError(m_hCom,&dwErrorFlags,&ComStat);  
      fState=WriteFile(m_hCom,&buf,length,&length,NULL);  
      if(!fState)  
      {  
      if(GetLastError()==ERROR_IO_PENDING)  
      GetOverlappedResult(m_hCom,&m_osWrite,&length,TRUE);//   等待  
      else  
      length=0;  
      }    
      return   length;  
      }  
       
      void   SendDlg::OnRadio1()    
      {  
      m_nBaud   =   4800;  
      m_Baud   =   0;  
      }  
       
      void   SendDlg::OnRadio2()    
      {  
      m_nBaud   =   9600;  
      m_Baud   =   1;  
      bool   SendDlg::SendData(int   &w)     //发送数据  
      {  
       
      if(!OpenConnection())//连接出错  
      {  
      CloseConnection();  
      return   false;  
      }  
              for(int   y=0;y<2;y++)         //发送信号中断单片机  
      {  
      WriteComm(num,1);  
      }  
       
      if(ComStat1.cbInQue)//有信号发送  
      {  
      ReadComm(ReadCom1V,1);  
      ...  
      }  
       
      CloseConnection();  
      return   false;  
      }  
       
       
      }  

  • 相关阅读:
    java——ArrayList中remove()方法疑问总结
    java——ArrayList中contains()方法中的疑问
    C语言中signed和unsigned理解
    IO流——常用IO流详解
    Lost's revenge
    Searching the String
    DNA repair
    Ring
    Wireless Password
    Censored!
  • 原文地址:https://www.cnblogs.com/buffer/p/1277074.html
Copyright © 2011-2022 走看看