CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  网络编程

关于串口通信问题???

楼主zyqwk2003()2003-09-01 15:49:21 在 VC/MFC / 网络编程 提问

我要做一个用串口实现两台机的通信问题,请给写意见,有没有一些介绍串口的网站。 问题点数:0、回复次数:7Top

1 楼stevenclj(stevenclj)回复于 2003-09-08 17:58:48 得分 0

up,我也想知道Top

2 楼cernet(二黑)回复于 2003-09-08 18:10:55 得分 0

这个串口类是网上下的.拿来分享,真的不错.  
   
  //   Serial.h  
   
  #ifndef   __SERIAL_H__  
  #define   __SERIAL_H__  
   
  #define   FC_DTRDSR               0x01  
  #define   FC_RTSCTS               0x02  
  #define   FC_XONXOFF             0x04  
  #define   ASCII_BEL               0x07  
  #define   ASCII_BS                 0x08  
  #define   ASCII_LF                 0x0A  
  #define   ASCII_CR                 0x0D  
  #define   ASCII_XON               0x11  
  #define   ASCII_XOFF             0x13  
   
  class   CSerial  
  {  
   
  public:  
  CSerial();  
  ~CSerial();  
   
  BOOL   Open(   int   nPort   =   2,   int   nBaud   =   9600   );  
  BOOL   Close(   void   );  
   
  int   ReadData(   void   *,   int   );  
  int   SendData(   const   char   *,   int   );  
  int   ReadDataWaiting(   void   );  
   
  BOOL   IsOpened(   void   ){   return(   m_bOpened   );   }  
   
  protected:  
  BOOL   WriteCommByte(   unsigned   char   );  
   
  HANDLE   m_hIDComDev;  
  OVERLAPPED   m_OverlappedRead,   m_OverlappedWrite;  
  BOOL   m_bOpened;  
   
  };  
   
  #endif  
   
   
   
  //   Serial.cpp  
   
  #include   "stdafx.h"  
  #include   "Serial.h"  
   
  CSerial::CSerial()  
  {  
   
  memset(   &m_OverlappedRead,   0,   sizeof(   OVERLAPPED   )   );  
    memset(   &m_OverlappedWrite,   0,   sizeof(   OVERLAPPED   )   );  
  m_hIDComDev   =   NULL;  
  m_bOpened   =   FALSE;  
   
  }  
   
  CSerial::~CSerial()  
  {  
   
  Close();  
   
  }  
   
  BOOL   CSerial::Open(   int   nPort,   int   nBaud   )  
  {  
   
  if(   m_bOpened   )   return(   TRUE   );  
   
  char   szPort[15];  
  char   szComParams[50];  
  DCB   dcb;  
   
  wsprintf(   szPort,   "COM%d",   nPort   );  
  m_hIDComDev   =   CreateFile(   szPort,   GENERIC_READ   |   GENERIC_WRITE,   0,   NULL,   OPEN_EXISTING,   FILE_ATTRIBUTE_NORMAL   |   FILE_FLAG_OVERLAPPED,   NULL   );  
  if(   m_hIDComDev   ==   NULL   )   return(   FALSE   );  
   
  memset(   &m_OverlappedRead,   0,   sizeof(   OVERLAPPED   )   );  
    memset(   &m_OverlappedWrite,   0,   sizeof(   OVERLAPPED   )   );  
   
  COMMTIMEOUTS   CommTimeOuts;  
  CommTimeOuts.ReadIntervalTimeout   =   0xFFFFFFFF;  
  CommTimeOuts.ReadTotalTimeoutMultiplier   =   0;  
  CommTimeOuts.ReadTotalTimeoutConstant   =   0;  
  CommTimeOuts.WriteTotalTimeoutMultiplier   =   0;  
  CommTimeOuts.WriteTotalTimeoutConstant   =   5000;  
  SetCommTimeouts(   m_hIDComDev,   &CommTimeOuts   );  
   
  wsprintf(   szComParams,   "COM%d:%d,n,8,1",   nPort,   nBaud   );  
   
  m_OverlappedRead.hEvent   =   CreateEvent(   NULL,   TRUE,   FALSE,   NULL   );  
  m_OverlappedWrite.hEvent   =   CreateEvent(   NULL,   TRUE,   FALSE,   NULL   );  
   
  dcb.DCBlength   =   sizeof(   DCB   );  
  GetCommState(   m_hIDComDev,   &dcb   );  
  dcb.BaudRate   =   nBaud;  
  dcb.ByteSize   =   8;  
  unsigned   char   ucSet;  
  ucSet   =   (unsigned   char)   (   (   FC_RTSCTS   &   FC_DTRDSR   )   !=   0   );  
  ucSet   =   (unsigned   char)   (   (   FC_RTSCTS   &   FC_RTSCTS   )   !=   0   );  
  ucSet   =   (unsigned   char)   (   (   FC_RTSCTS   &   FC_XONXOFF   )   !=   0   );  
  if(   !SetCommState(   m_hIDComDev,   &dcb   )   ||  
  !SetupComm(   m_hIDComDev,   10000,   10000   )   ||  
  m_OverlappedRead.hEvent   ==   NULL   ||  
  m_OverlappedWrite.hEvent   ==   NULL   ){  
  DWORD   dwError   =   GetLastError();  
  if(   m_OverlappedRead.hEvent   !=   NULL   )   CloseHandle(   m_OverlappedRead.hEvent   );  
  if(   m_OverlappedWrite.hEvent   !=   NULL   )   CloseHandle(   m_OverlappedWrite.hEvent   );  
  CloseHandle(   m_hIDComDev   );  
  return(   FALSE   );  
  }  
   
  m_bOpened   =   TRUE;  
   
  return(   m_bOpened   );  
   
  }  
   
  BOOL   CSerial::Close(   void   )  
  {  
   
  if(   !m_bOpened   ||   m_hIDComDev   ==   NULL   )   return(   TRUE   );  
   
  if(   m_OverlappedRead.hEvent   !=   NULL   )   CloseHandle(   m_OverlappedRead.hEvent   );  
  if(   m_OverlappedWrite.hEvent   !=   NULL   )   CloseHandle(   m_OverlappedWrite.hEvent   );  
  CloseHandle(   m_hIDComDev   );  
  m_bOpened   =   FALSE;  
  m_hIDComDev   =   NULL;  
   
  return(   TRUE   );  
   
  }  
   
  BOOL   CSerial::WriteCommByte(   unsigned   char   ucByte   )  
  {  
  BOOL   bWriteStat;  
  DWORD   dwBytesWritten;  
   
  bWriteStat   =   WriteFile(   m_hIDComDev,   (LPSTR)   &ucByte,   1,   &dwBytesWritten,   &m_OverlappedWrite   );  
  if(   !bWriteStat   &&   (   GetLastError()   ==   ERROR_IO_PENDING   )   ){  
  if(   WaitForSingleObject(   m_OverlappedWrite.hEvent,   1000   )   )   dwBytesWritten   =   0;  
  else{  
  GetOverlappedResult(   m_hIDComDev,   &m_OverlappedWrite,   &dwBytesWritten,   FALSE   );  
  m_OverlappedWrite.Offset   +=   dwBytesWritten;  
  }  
  }  
   
  return(   TRUE   );  
   
  }  
   
  int   CSerial::SendData(   const   char   *buffer,   int   size   )  
  {  
   
  if(   !m_bOpened   ||   m_hIDComDev   ==   NULL   )   return(   0   );  
   
  DWORD   dwBytesWritten   =   0;  
  int   i;  
  for(   i=0;   i<size;   i++   ){  
  WriteCommByte(   buffer[i]   );  
  dwBytesWritten++;  
  }  
   
  return(   (int)   dwBytesWritten   );  
   
  }  
   
  int   CSerial::ReadDataWaiting(   void   )  
  {  
   
  if(   !m_bOpened   ||   m_hIDComDev   ==   NULL   )   return(   0   );  
   
  DWORD   dwErrorFlags;  
  COMSTAT   ComStat;  
   
  ClearCommError(   m_hIDComDev,   &dwErrorFlags,   &ComStat   );  
   
  return(   (int)   ComStat.cbInQue   );  
   
  }  
   
  int   CSerial::ReadData(   void   *buffer,   int   limit   )  
  {  
   
  if(   !m_bOpened   ||   m_hIDComDev   ==   NULL   )   return(   0   );  
   
  BOOL   bReadStatus;  
  DWORD   dwBytesRead,   dwErrorFlags;  
  COMSTAT   ComStat;  
   
  ClearCommError(   m_hIDComDev,   &dwErrorFlags,   &ComStat   );  
  if(   !ComStat.cbInQue   )   return(   0   );  
   
  dwBytesRead   =   (DWORD)   ComStat.cbInQue;  
  if(   limit   <   (int)   dwBytesRead   )   dwBytesRead   =   (DWORD)   limit;  
   
  bReadStatus   =   ReadFile(   m_hIDComDev,   buffer,   dwBytesRead,   &dwBytesRead,   &m_OverlappedRead   );  
  if(   !bReadStatus   ){  
  if(   GetLastError()   ==   ERROR_IO_PENDING   ){  
  WaitForSingleObject(   m_OverlappedRead.hEvent,   2000   );  
  return(   (int)   dwBytesRead   );  
  }  
  return(   0   );  
  }  
   
  return(   (int)   dwBytesRead   );  
   
  }  
  Top

3 楼qingfeng5899()回复于 2003-09-08 18:12:29 得分 0

到啸峰工作室看看,串口知识挺多www.gjwtech.comTop

4 楼xiao_potato(小土豆)回复于 2003-09-10 00:47:25 得分 0

www.gjwtech.com  
  用他的调试工具先熟悉熟悉Top

5 楼zyqwk2003()回复于 2003-09-10 10:30:49 得分 0

啸峰工作室上的原码怎么都下载不下来Top

6 楼lif2000(阿飞)回复于 2003-09-16 08:07:53 得分 0

http://www.gjwtech.com/Top

7 楼lashengcrh(憨头鱼)回复于 2003-09-16 10:59:46 得分 0

好类。Top

相关问题

  • 串口通信
  • 串口通信
  • pb串口通信
  • C#串口通信
  • 串口通信-HELP
  • VC++的串口通信
  • 串口通信的问题:
  • 串口通信问题。
  • 求教!串口通信
  • 关于串口通信!急。。。。

关键词

  • cserial
  • bopened
  • 串口
  • serial
  • ascii
  • overlapped
  • define
  • fc
  • bool

得分解答快速导航

  • 帖主:zyqwk2003

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo