PC与单片机串通(串口通信)

来源:互联网 发布:电子商务美工是什么 编辑:程序博客网 时间:2024/05/01 17:17

下面是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;  
  }  
   
   
  }  

原创粉丝点击