⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lc_bcb_60.html

📁 C++Builder教学大全
💻 HTML
字号:


<html>

<head>

<title>Window 95串口通讯函数集合</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>



<body>

<p align=center><b><font size="4">Window 95串口通讯函数集合(只适用于32位)</font> </b></p>  

<p><br>  

  <br>  

  需要说明的是:这是程序的一部分,因此有一些与具体应用无关的部分。 <br>  

  关键是原理,而不是程序本身.后面有些使用介绍,帮助理解这长的程序。 <br>  

  <br>  

  头文件(.H) <br>  

  <br>  

  #include "StdAfx.h" <br>  

  <br>  

  #define GWL_PGPSINFO 0 <br>  

  #define GPSEXTRABYTES sizeof( LONG ) <br>  

  <br>  

  #define MAXPORTS 4 <br>  

  <br>  

  #define CN_SEND WM_USER+100 <br>  

  <br>  

  #define RXQUEUE 4096 <br>  

  #define TXQUEUE 4096 <br>  

  <br>  

  <br>  

  // cursor states <br>  

  <br>  

  #define CS_HIDE 0x00 <br>  

  #define CS_SHOW 0x01 <br>  

  <br>  

  // Flow control flags <br>  

  <br>  

  #define FC_DTRDSR 0x01 <br>  

  #define FC_RTSCTS 0x02 <br>  

  #define FC_XONXOFF 0x04 <br>  

  <br>  

  // ascii definitions <br>  

  <br>  

  #define ASCII_BEL 0x07 <br>  

  #define ASCII_BS 0x08 <br>  

  #define ASCII_LF 0x0A <br>  

  #define ASCII_CR 0x0D <br>  

  #define ASCII_XON 0x11 <br>  

  #define ASCII_XOFF 0x13 <br>  

  <br>  

  // data structures <br>  

  <br>  

  <br>  

  typedef struct tagGPSINFO <br>  

  { <br>  

  HANDLE idComDev; <br>  

  BYTE bPort; <br>  

  BOOL fConnected; <br>  

  BYTE bByteSize,bParity,bStopBits; <br>  

  DWORD dwBaudRate; <br>  

  <br>  

  HANDLE hPostEvent,hWatchThread,hWatchEvent; <br>  

  HWND hTermWnd; <br>  

  DWORD dwThreadID; <br>  

  OVERLAPPED osWrite,osRead; <br>  

  } GPSINFO, *PGPSINFO ; <br>  

  <br>  

  #define COMDEV( x ) (x -&gt; idComDev) <br>  

  #define PORT( x ) (x -&gt; bPort) <br>  

  #define CONNECTED( x ) (x -&gt; fConnected) <br>  

  #define BYTESIZE( x ) (x -&gt; bByteSize) <br>  

  #define PARITY( x ) (x -&gt; bParity) <br>  

  #define STOPBITS( x ) (x -&gt; bStopBits) <br>  

  #define BAUDRATE( x ) (x -&gt; dwBaudRate) <br>  

  <br>  

  <br>  

  #define POSTEVENT( x ) (x -&gt; hPostEvent) <br>  

  #define HTHREAD( x ) (x -&gt; hWatchThread) <br>  

  #define THREADID( x ) (x -&gt; dwThreadID) <br>  

  #define WRITE_OS( x ) (x -&gt; osWrite) <br>  

  #define READ_OS( x ) (x -&gt; osRead) <br>  

  <br>  

  // function prototypes (private) <br>  

  <br>  

  LRESULT NEAR CreateGPSInfo(HWND,BYTE nPort=1); <br>  

  BOOL NEAR DestroyGPSInfo(); <br>  

  <br>  

  int NEAR ReadCommBlock(LPSTR,int); <br>  

  BOOL NEAR WriteCommBlock(LPSTR,DWORD); <br>  

  BOOL NEAR OpenConnection(); <br>  

  BOOL NEAR SetupConnection(); <br>  

  BOOL NEAR CloseConnection(); <br>  

  <br>  

  // function prototypes (public) <br>  

  <br>  

  DWORD FAR PASCAL CommWatchProc(LPSTR); <br>  

  <br>  

  <br>  

  <br>  

  具体实现请看下文(为了这文章,我都段线2次了) <br>  

  <br>  

  CPP实现部分: <br>  

  <br>  

  #include "StdAfx.h" <br>  

  #include "Com.h" <br>  

  <br>  

  HWND hGPSWnd=NULL; <br>  

  PGPSINFO npGPSInfo=NULL; <br>  

  <br>  

  LRESULT NEAR CreateGPSInfo(HWND hWnd,BYTE nPort) <br>  

  { <br>  

  if (NULL==(npGPSInfo=(PGPSINFO)LocalAlloc(LPTR,sizeof(GPSINFO)))) <br>  

  return ((LRESULT)-1) ; <br>  

  <br>  

  hGPSWnd=hWnd; <br>  

  <br>  

  COMDEV(npGPSInfo)=0; <br>  

  CONNECTED(npGPSInfo)=FALSE; <br>  

  PORT(npGPSInfo)=nPort; <br>  

  BAUDRATE(npGPSInfo)=CBR_9600; <br>  

  BYTESIZE(npGPSInfo)=8; <br>  

  PARITY(npGPSInfo)=NOPARITY; <br>  

  STOPBITS(npGPSInfo)=ONESTOPBIT; <br>  

  <br>  

  WRITE_OS(npGPSInfo).Offset=0; <br>  

  WRITE_OS(npGPSInfo).OffsetHigh=0; <br>  

  READ_OS(npGPSInfo).Offset=0; <br>  

  READ_OS(npGPSInfo).OffsetHigh=0; <br>  

  <br>  

  // create I/O event used for overlapped reads / writes <br>  

  <br>  

  READ_OS(npGPSInfo).hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); <br>  

  if (READ_OS(npGPSInfo).hEvent==NULL) <br>  

  { LocalFree( npGPSInfo ) ; <br>  

  return ( -1 ) ; <br>  

  } <br>  

  WRITE_OS(npGPSInfo).hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); <br>  

  if (NULL==WRITE_OS(npGPSInfo).hEvent) <br>  

  { CloseHandle(READ_OS(npGPSInfo).hEvent); <br>  

  LocalFree(npGPSInfo) ; <br>  

  return (-1) ; <br>  

  } <br>  

  <br>  

  <br>  

  return ( (LRESULT) TRUE ) ; <br>  

  } <br>  

  <br>  

  BOOL NEAR DestroyGPSInfo() <br>  

  { <br>  

  if (!npGPSInfo) return (FALSE); <br>  

  <br>  

  if (CONNECTED(npGPSInfo)) CloseConnection(); <br>  

  <br>  

  CloseHandle(READ_OS(npGPSInfo).hEvent); <br>  

  CloseHandle(WRITE_OS(npGPSInfo).hEvent); <br>  

  CloseHandle(POSTEVENT(npGPSInfo)); <br>  

  <br>  

  LocalFree(npGPSInfo); <br>  

  return (TRUE); <br>  

  } <br>  

  <br>  

  BOOL NEAR OpenConnection() <br>  

  { <br>  

  char szPort[15]; <br>  

  BOOL fRetVal; <br>  

  HCURSOR hOldCursor,hWaitCursor; <br>  

  <br>  

  HANDLE hCommWatchThread; <br>  

  DWORD dwThreadID; <br>  

  COMMTIMEOUTS CommTimeOuts; <br>  

  <br>  

  if (!npGPSInfo) return (FALSE); <br>  

  <br>  

  hWaitCursor=LoadCursor(NULL,IDC_WAIT) ; <br>  

  hOldCursor=SetCursor(hWaitCursor) ; <br>  

  <br>  

  wsprintf(szPort,"COM%d",PORT(npGPSInfo)); <br>  

  <br>  

  if <br>  

  ((COMDEV(npGPSInfo)=CreateFile(szPort,GENERIC_READ|GENERIC_WRITE, <br>  

  <br>  

  0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, <br>  

  NULL))==(HANDLE)-1) <br>  

  return ( FALSE ) ; <br>  

  else <br>  

  { SetCommMask(COMDEV(npGPSInfo),EV_RXCHAR); <br>  

  SetupComm(COMDEV(npGPSInfo),4096,4096); <br>  

  <br>  

  <br>  

  PurgeComm(COMDEV(npGPSInfo),PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR| <br>  

  <br>  

  PURGE_R <br>  

  XCLEAR); <br>  

  CommTimeOuts.ReadIntervalTimeout=0xFFFFFFFF; <br>  

  CommTimeOuts.ReadTotalTimeoutMultiplier=0; <br>  

  CommTimeOuts.ReadTotalTimeoutConstant=1000; <br>  

  CommTimeOuts.WriteTotalTimeoutMultiplier=0; <br>  

  CommTimeOuts.WriteTotalTimeoutConstant=1000; <br>  

  SetCommTimeouts(COMDEV(npGPSInfo),&amp;CommTimeOuts); <br>  

  } <br>  

  <br>  

  fRetVal=SetupConnection(); <br>  

  <br>  

  if (fRetVal) <br>  

  { CONNECTED(npGPSInfo)=TRUE; <br>  

  if <br>  

  (NULL==(hCommWatchThread=CreateThread((LPSECURITY_ATTRIBUTES)NULL, <br>  

  <br>  

  0,(LPTHREAD_START_ROUTINE)CommWatchProc, <br>  

  (LPVOID)NULL,0,&amp;dwThreadID))) <br>  

  { CONNECTED(npGPSInfo)=FALSE; <br>  

  CloseHandle(COMDEV(npGPSInfo)); <br>  

  fRetVal=FALSE; <br>  

  } <br>  

  else <br>  

  { THREADID(npGPSInfo)=dwThreadID; <br>  

  HTHREAD(npGPSInfo)=hCommWatchThread; <br>  

  EscapeCommFunction(COMDEV(npGPSInfo),SETDTR); <br>  

  } <br>  

  } <br>  

  else <br>  

  { CONNECTED(npGPSInfo)=FALSE; <br>  

  CloseHandle(COMDEV(npGPSInfo)); <br>  

  } <br>  

  <br>  

  SetCursor(hOldCursor); <br>  

  return (fRetVal); <br>  

  } <br>  

  <br>  

  BOOL NEAR SetupConnection() <br>  

  { BOOL fRetVal; <br>  

  DCB dcb; <br>  

  <br>  

  <br>  

  if (!npGPSInfo) return(FALSE); <br>  

  <br>  

  dcb.DCBlength=sizeof(DCB); <br>  

  <br>  

  GetCommState(COMDEV(npGPSInfo),&amp;dcb); <br>  

  <br>  

  dcb.BaudRate=BAUDRATE(npGPSInfo); <br>  

  dcb.ByteSize=BYTESIZE(npGPSInfo); <br>  

  dcb.Parity=PARITY(npGPSInfo); <br>  

  dcb.StopBits=STOPBITS(npGPSInfo); <br>  

  <br>  

  dcb.fOutxDsrFlow=FALSE; <br>  

  dcb.fDtrControl=DTR_CONTROL_ENABLE; <br>  

  <br>  

  dcb.fOutxCtsFlow=FALSE; <br>  

  dcb.fRtsControl=RTS_CONTROL_ENABLE; <br>  

  dcb.fInX=dcb.fOutX=FALSE; <br>  

  dcb.fBinary=TRUE; <br>  

  dcb.fParity=TRUE; <br>  

  <br>  

  fRetVal=SetCommState(COMDEV(npGPSInfo),&amp;dcb); <br>  

  return (fRetVal); <br>  

  } <br>  

  <br>  

  BOOL NEAR CloseConnection() <br>  

  { <br>  

  if (!npGPSInfo) return(FALSE); <br>  

  <br>  

  CONNECTED(npGPSInfo)=FALSE; <br>  

  <br>  

  SetCommMask(COMDEV(npGPSInfo),0); <br>  

  while(THREADID(npGPSInfo)!=0); <br>  

  <br>  

  EscapeCommFunction(COMDEV(npGPSInfo),CLRDTR); <br>  

  PurgeComm(COMDEV(npGPSInfo),PURGE_TXABORT|PURGE_RXABORT| <br>  

  PURGE_TXCLEAR|PURGE_RXCLEAR); <br>  

  CloseHandle(COMDEV(npGPSInfo)); <br>  

  <br>  

  return (TRUE); <br>  

  } <br>  

  <br>  

  int NEAR ReadCommBlock(LPSTR lpszBlock,int nMaxLength) <br>  

  { <br>  

  BOOL fReadStat ; <br>  

  COMSTAT ComStat ; <br>  

  DWORD dwErrorFlags; <br>  

  DWORD dwLength; <br>  

  DWORD dwError; <br>  

  <br>  

  if (!npGPSInfo) return(FALSE); <br>  

  <br>  

  ClearCommError(COMDEV(npGPSInfo),&amp;dwErrorFlags,&amp;ComStat); <br>  

  dwLength=min((DWORD)nMaxLength,ComStat.cbInQue); <br>  

  <br>  

  if (dwLength&gt;0) <br>  

  { fReadStat=ReadFile(COMDEV(npGPSInfo),lpszBlock, <br>  

  <br>  

  dwLength,&amp;dwLength,&amp;READ_OS(npGPSInfo)); <br>  

  if (!fReadStat) <br>  

  { if (GetLastError()==ERROR_IO_PENDING) <br>  

  { OutputDebugString("\n\rIO Pending"); <br>  

  <br>  

  while(!GetOverlappedResult(COMDEV(npGPSInfo),&amp;READ_OS(npGPSInfo),&amp;dwLe   

  <br>  

  <br>  

  ngth,TR <br>  

  UE)) <br>  

  UE)) <br>  

  { dwError=GetLastError(); <br>  

  if(dwError == ERROR_IO_INCOMPLETE) <br>  

  continue; <br>  

  } <br>  

  <br>  

  } <br>  

  else <br>  

  { dwLength=0; <br>  

  <br>  

  ClearCommError(COMDEV(npGPSInfo),&amp;dwErrorFlags,&amp;ComStat); <br>  

  } <br>  

  } <br>  

  } <br>  

  return ( dwLength ) ; <br>  

  } <br>  

  <br>  

  BOOL NEAR WriteCommBlock(LPSTR lpByte,DWORD dwBytesToWrite) <br>  

  { BOOL fWriteStat; <br>  

  DWORD dwBytesWritten; <br>  

  DWORD dwErrorFlags; <br>  

  DWORD dwError; <br>  

  COMSTAT ComStat; <br>  

  <br>  

  if (!npGPSInfo) return(FALSE); <br>  

  <br>  

  fWriteStat=WriteFile(COMDEV(npGPSInfo),lpByte,dwBytesToWrite, <br>  

  &amp;dwBytesWritten,&amp;WRITE_OS(npGPSInfo)); <br>  

  <br>  

  if (!fWriteStat) <br>  

  { if(GetLastError()==ERROR_IO_PENDING) <br>  

  { while(!GetOverlappedResult(COMDEV(npGPSInfo), <br>  

  &amp;WRITE_OS(npGPSInfo),&amp;dwBytesWritten,TRUE)) <br>  

  { dwError=GetLastError(); <br>  

  if(dwError == ERROR_IO_INCOMPLETE) <br>  

  continue; <br>  

  else <br>  

  { <br>  

  ClearCommError(COMDEV(npGPSInfo),&amp;dwErrorFlags,&amp;ComStat); <br>  

  break; <br>  

  } <br>  

  } <br>  

  } <br>  

  else <br>  

  { <br>  

  { <br>  

  ClearCommError(COMDEV(npGPSInfo),&amp;dwErrorFlags,&amp;ComStat); <br>  

  return ( FALSE ); <br>  

  } <br>  

  } <br>  

  return ( TRUE ) ; <br>  

  <br>  

  } <br>  

  <br>  

  DWORD FAR PASCAL CommWatchProc(LPSTR) <br>  

  { DWORD dwEvtMask; <br>  

  OVERLAPPED os; <br>  

  int nLength; <br>  

  BYTE abIn[1024]; <br>  

  <br>  

  memset(&amp;os,0,sizeof(OVERLAPPED)); <br>  

  <br>  

  // create I/O event used for overlapped read <br>  

  <br>  

  os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); <br>  

  if (os.hEvent==NULL) <br>  

  { MessageBox(NULL,"Failed to create event for thread!","GPS <br>  

  Error!",MB_ICONEXCLAMATION|MB_OK); <br>  

  return ( FALSE ) ; <br>  

  } <br>  

  <br>  

  if (!SetCommMask(COMDEV(npGPSInfo),EV_RXCHAR)) return (FALSE); <br>  

  <br>  

  while (CONNECTED( npGPSInfo)) <br>  

  { dwEvtMask=0 ; <br>  

  WaitCommEvent(COMDEV(npGPSInfo),&amp;dwEvtMask,NULL); <br>  

  <br>  

  if ((dwEvtMask&amp;EV_RXCHAR)==EV_RXCHAR) <br>  

  { do <br>  

  { if <br>  

  (nLength=ReadCommBlock((LPSTR)abIn,1024)) <br>  

  { <br>  

  //WriteCommBlock((LPSTR)abIn,nLength ); <br>  

  *(abIn+nLength)=0; <br>  

  <br>  

  ::SendMessage(hGPSWnd,CN_SEND,nLength,(LONG)(LPSTR)abIn); <br>  

  } <br>  

  } <br>  

  while ((nLength&gt;0)&amp;&amp;(CONNECTED( npGPSInfo))); <br>  

  } <br>  

  } <br>  

  } <br>  

  <br>  

  CloseHandle(os.hEvent); <br>  

  THREADID(npGPSInfo)=0; <br>  

  HTHREAD(npGPSInfo)=NULL; <br>  

  return(TRUE); <br>  

  } <br>  

  <br>  

  <br>  

  就这些了,希望能对问这些问题的朋友有所帮助! <br>  

  <br>  

  一般使用的顺序是: <br>  

  CreateGPSInfo(被通知的窗口句柄,串口端口号1或2); <br>  

  OpenConnection();//建立联结它会调用SetupConnection <br>  

  DestroyGPSInfo();//解除联结它会调用CloseConnection <br>  

  <br>  

  可以用ReadCommBlock/WriteCommBlock来读/写串口 <br>  

  CommWatchProc是监视串口的线程,由OpenConnection建立 <br>  

  <br>  

  <br>  

  当串口有数据来的时侯,它会通知'被通知的窗口句柄'的窗口数据传到的消息(自 <br>  

  <br>  

  定义的) <br>  

  SendMessage(hGPSWnd,CN_SEND,nLength,(LONG)(LPSTR)abIn); <br>  

  <br>  

  好了,文章结束了!希望能帮助你! <br>  

  <br>  

 

</p>  

</body>  

</html>  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -