<nobr id="zkazv"></nobr>

      午夜精品一区二区三区成人,中文字幕av一区二区,亚洲AVAV天堂AV在线网阿V,肥臀浪妇太爽了快点再快点,国产网友愉拍精品视频手机,国产精品无码a∨麻豆,久久中文字幕一区二区,a级国产乱理伦片在线观看al

       用 VC 在win95下編寫用于串行通訊的程序


      源自http://www.sixthnet.com/netech/articles/195.htm

      頭文件(.H)

      #include "StdAfx.h"

      #define GWL_PGPSINFO 0
      #define GPSEXTRABYTES sizeof( LONG )

      #define MAXPORTS 4

      #define CN_SEND WM_USER+100

      #define RXQUEUE 4096
      #define TXQUEUE 4096

      // cursor states

      #define CS_HIDE 0x00
      #define CS_SHOW 0x01

      // Flow control flags

      #define FC_DTRDSR 0x01
      #define FC_RTSCTS 0x02
      #define FC_XONXOFF 0x04

      // ascii definitions

      #define ASCII_BEL 0x07
      #define ASCII_BS 0x08
      #define ASCII_LF 0x0A
      #define ASCII_CR 0x0D
      #define ASCII_XON 0x11
      #define ASCII_XOFF 0x13

      // data structures

      typedef struct tagGPSINFO
      {
      HANDLE idComDev;
      BYTE bPort;
      BOOL fConnected;
      BYTE bByteSize,bParity,bStopBits;
      DWORD dwBaudRate;

      HANDLE hPostEvent,hWatchThread,hWatchEvent;
      HWND hTermWnd;
      DWORD dwThreadID;
      OVERLAPPED osWrite,osRead;
      } GPSINFO, *PGPSINFO ;

      #define COMDEV( x ) (x -> idComDev)
      #define PORT( x ) (x -> bPort)
      #define CONNECTED( x ) (x -> fConnected)
      #define BYTESIZE( x ) (x -> bByteSize)
      #define PARITY( x ) (x -> bParity)
      #define STOPBITS( x ) (x -> bStopBits)
      #define BAUDRATE( x ) (x -> dwBaudRate)

      #define POSTEVENT( x ) (x -> hPostEvent)
      #define HTHREAD( x ) (x -> hWatchThread)
      #define THREADID( x ) (x -> dwThreadID)
      #define WRITE_OS( x ) (x -> osWrite)
      #define READ_OS( x ) (x -> osRead)

      // function prototypes (private)

      LRESULT NEAR CreateGPSInfo(HWND,BYTE nPort=1);
      BOOL NEAR DestroyGPSInfo();

      int NEAR ReadCommBlock(LPSTR,int);
      BOOL NEAR WriteCommBlock(LPSTR,DWORD);
      BOOL NEAR OpenConnection();
      BOOL NEAR SetupConnection();
      BOOL NEAR CloseConnection();

      // function prototypes (public)

      DWORD FAR PASCAL CommWatchProc(LPSTR);
      CPP實現部分:

      #include "StdAfx.h"
      #include "Com.h"

      HWND hGPSWnd=NULL;
      PGPSINFO npGPSInfo=NULL;

      LRESULT NEAR CreateGPSInfo(HWND hWnd,BYTE nPort)
      {
      if (NULL==(npGPSInfo=(PGPSINFO)LocalAlloc(LPTR,sizeof(GPSINFO))))
      return ((LRESULT)-1) ;

      hGPSWnd=hWnd;

      COMDEV(npGPSInfo)=0;
      CONNECTED(npGPSInfo)=FALSE;
      PORT(npGPSInfo)=nPort;
      BAUDRATE(npGPSInfo)=CBR_9600;
      BYTESIZE(npGPSInfo)=8;
      PARITY(npGPSInfo)=NOPARITY;
      STOPBITS(npGPSInfo)=ONESTOPBIT;

      WRITE_OS(npGPSInfo).Offset=0;
      WRITE_OS(npGPSInfo).OffsetHigh=0;
      READ_OS(npGPSInfo).Offset=0;
      READ_OS(npGPSInfo).OffsetHigh=0;

      // create I/O event used for overlapped reads / writes

      READ_OS(npGPSInfo).hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
      if (READ_OS(npGPSInfo).hEvent==NULL)
      { LocalFree( npGPSInfo ) ;
      return ( -1 ) ;
      }
      WRITE_OS(npGPSInfo).hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
      if (NULL==WRITE_OS(npGPSInfo).hEvent)
      { CloseHandle(READ_OS(npGPSInfo).hEvent);
      LocalFree(npGPSInfo) ;
      return (-1) ;
      }

      return ( (LRESULT) TRUE ) ;
      }

      BOOL NEAR DestroyGPSInfo()
      {
      if (!npGPSInfo) return (FALSE);

      if (CONNECTED(npGPSInfo)) CloseConnection();

      CloseHandle(READ_OS(npGPSInfo).hEvent);
      CloseHandle(WRITE_OS(npGPSInfo).hEvent);
      CloseHandle(POSTEVENT(npGPSInfo));

      LocalFree(npGPSInfo);
      return (TRUE);
      }

      BOOL NEAR OpenConnection()
      {
      char szPort[15];
      BOOL fRetVal;
      HCURSOR hOldCursor,hWaitCursor;

      HANDLE hCommWatchThread;
      DWORD dwThreadID;
      COMMTIMEOUTS CommTimeOuts;

      if (!npGPSInfo) return (FALSE);

      hWaitCursor=LoadCursor(NULL,IDC_WAIT) ;
      hOldCursor=SetCursor(hWaitCursor) ;

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

      if ((COMDEV(npGPSInfo)=CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,
      0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
      NULL))==(HANDLE)-1)
      return ( FALSE ) ;
      else
      { SetCommMask(COMDEV(npGPSInfo),EV_RXCHAR);
      SetupComm(COMDEV(npGPSInfo),4096,4096);
      PurgeComm(COMDEV(npGPSInfo),PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
      CommTimeOuts.ReadIntervalTimeout=0xFFFFFFFF;
      CommTimeOuts.ReadTotalTimeoutMultiplier=0;
      CommTimeOuts.ReadTotalTimeoutConstant=1000;
      CommTimeOuts.WriteTotalTimeoutMultiplier=0;
      CommTimeOuts.WriteTotalTimeoutConstant=1000;
      SetCommTimeouts(COMDEV(npGPSInfo),&CommTimeOuts);
      }

      fRetVal=SetupConnection();

      if (fRetVal)
      { CONNECTED(npGPSInfo)=TRUE;
      if (NULL==(hCommWatchThread=CreateThread((LPSECURITY_ATTRIBUTES)NULL,
      0,(LPTHREAD_START_ROUTINE)CommWatchProc,
      (LPVOID)NULL,0,&dwThreadID)))
      { CONNECTED(npGPSInfo)=FALSE;
      CloseHandle(COMDEV(npGPSInfo));
      fRetVal=FALSE;
      }
      else
      { THREADID(npGPSInfo)=dwThreadID;
      HTHREAD(npGPSInfo)=hCommWatchThread;
      EscapeCommFunction(COMDEV(npGPSInfo),SETDTR);
      }
      }
      else
      { CONNECTED(npGPSInfo)=FALSE;
      CloseHandle(COMDEV(npGPSInfo));
      }

      SetCursor(hOldCursor);
      return (fRetVal);
      }

      BOOL NEAR SetupConnection()
      { BOOL fRetVal;
      DCB dcb;

      if (!npGPSInfo) return(FALSE);

      dcb.DCBlength=sizeof(DCB);

      GetCommState(COMDEV(npGPSInfo),&dcb);

      dcb.BaudRate=BAUDRATE(npGPSInfo);
      dcb.ByteSize=BYTESIZE(npGPSInfo);
      dcb.Parity=PARITY(npGPSInfo);
      dcb.StopBits=STOPBITS(npGPSInfo);

      dcb.fOutxDsrFlow=FALSE;
      dcb.fDtrControl=DTR_CONTROL_ENABLE;

      dcb.fOutxCtsFlow=FALSE;
      dcb.fRtsControl=RTS_CONTROL_ENABLE;
      dcb.fInX=dcb.fOutX=FALSE;
      dcb.fBinary=TRUE;
      dcb.fParity=TRUE;

      fRetVal=SetCommState(COMDEV(npGPSInfo),&dcb);
      return (fRetVal);
      }

      BOOL NEAR CloseConnection()
      {
      if (!npGPSInfo) return(FALSE);

      CONNECTED(npGPSInfo)=FALSE;

      SetCommMask(COMDEV(npGPSInfo),0);
      while(THREADID(npGPSInfo)!=0);

      EscapeCommFunction(COMDEV(npGPSInfo),CLRDTR);
      PurgeComm(COMDEV(npGPSInfo),PURGE_TXABORT|PURGE_RXABORT|
      PURGE_TXCLEAR|PURGE_RXCLEAR);
      CloseHandle(COMDEV(npGPSInfo));

      return (TRUE);
      }

      int NEAR ReadCommBlock(LPSTR lpszBlock,int nMaxLength)
      {
      BOOL fReadStat ;
      COMSTAT ComStat ;
      DWORD dwErrorFlags;
      DWORD dwLength;
      DWORD dwError;

      if (!npGPSInfo) return(FALSE);

      ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat);
      dwLength=min((DWORD)nMaxLength,ComStat.cbInQue);

      if (dwLength>0)
      { fReadStat=ReadFile(COMDEV(npGPSInfo),lpszBlock,
      dwLength,&dwLength,&READ_OS(npGPSInfo));
      if (!fReadStat)
      { if (GetLastError()==ERROR_IO_PENDING)
      { OutputDebugString("\n\rIO Pending");
      while(!GetOverlappedResult(COMDEV(npGPSInfo),&READ_OS(npGPSInfo),&dwLength,TRUE))
      { dwError=GetLastError();
      if(dwError == ERROR_IO_INCOMPLETE) continue;
      }

      }
      else
      { dwLength=0;
      ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat);
      }
      }
      }
      return ( dwLength ) ;
      }

      BOOL NEAR WriteCommBlock(LPSTR lpByte,DWORD dwBytesToWrite)
      { BOOL fWriteStat;
      DWORD dwBytesWritten;
      DWORD dwErrorFlags;
      DWORD dwError;
      COMSTAT ComStat;

      if (!npGPSInfo) return(FALSE);

      fWriteStat=WriteFile(COMDEV(npGPSInfo),lpByte,dwBytesToWrite,
      &dwBytesWritten,&WRITE_OS(npGPSInfo));

      if (!fWriteStat)
      { if(GetLastError()==ERROR_IO_PENDING)
      { while(!GetOverlappedResult(COMDEV(npGPSInfo),
      &WRITE_OS(npGPSInfo),&dwBytesWritten,TRUE))
      { dwError=GetLastError();
      if(dwError == ERROR_IO_INCOMPLETE) continue;
      else
      { ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat);
      break;
      }
      }
      }
      else
      { ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat);
      return ( FALSE );
      }
      }
      return ( TRUE ) ;

      }

      DWORD FAR PASCAL CommWatchProc(LPSTR)
      { DWORD dwEvtMask;
      OVERLAPPED os;
      int nLength;
      BYTE abIn[1024];

      memset(&os,0,sizeof(OVERLAPPED));

      // create I/O event used for overlapped read

      os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
      if (os.hEvent==NULL)
      { MessageBox(NULL,"Failed to create event for thread!","GPS Error!",MB_ICONEXCLAMATION|MB_OK);
      return ( FALSE ) ;
      }

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

      while (CONNECTED( npGPSInfo))
      { dwEvtMask=0 ;
      WaitCommEvent(COMDEV(npGPSInfo),&dwEvtMask,NULL);

      if ((dwEvtMask&EV_RXCHAR)==EV_RXCHAR)
      { do
      { if (nLength=ReadCommBlock((LPSTR)abIn,1024))
      { //WriteCommBlock((LPSTR)abIn,nLength );
      *(abIn+nLength)=0;
      ::SendMessage(hGPSWnd,CN_SEND,nLength,(LONG)(LPSTR)abIn);
      }
      }
      while ((nLength>0)&&(CONNECTED( npGPSInfo)));
      }
      }

      CloseHandle(os.hEvent);
      THREADID(npGPSInfo)=0;
      HTHREAD(npGPSInfo)=NULL;
      return(TRUE);
      }
      一般使用的順序是:
      CreateGPSInfo(被通知的窗口句柄,串口端口號1或2);
      OpenConnection();//建立聯結它會調用SetupConnection
      DestroyGPSInfo();//解除聯結它會調用CloseConnection

      可以用ReadCommBlock/WriteCommBlock來讀/寫串口
      CommWatchProc是監視串口的線程,由OpenConnection建立

      當串口有數據來的時侯,它會通知'被通知的窗口句柄'的窗口數據傳到的消息(自定義的)
      ∶:SendMessage(hGPSWnd,CN_SEND,nLength,(LONG)(LPSTR)abIn);
      (2001-8-3 23:57:38)

      主站蜘蛛池模板: 中文字幕无码免费久久99| 亚洲男女羞羞无遮挡久久丫| 在线播放深夜精品三级| 国产jizzjizz视频| 国产精品亚洲二区亚瑟| 强奷乱码中文字幕| 国产一区二区三区亚洲精品| 国产精品多p对白交换绿帽| 日韩中文字幕V亚洲中文字幕| 国产系列丝袜熟女精品视频| 激情综合色综合久久丁香| 日本一区二区三区小视频| 无码精品人妻一区二区三区中| 亚洲精品成人综合色在线| 亚洲精品美女一区二区| 五月天国产成人AV免费观看| 国产成人无码区免费内射一片色欲 | 国产精品九九九一区二区| 在线中文字幕国产一区| 日韩一区二区三区日韩精品| 亚洲啪啪精品一区二区的| 亚洲欧美日韩精品久久| 久久亚洲国产成人精品性色| 国产亚洲综合欧美视频| 神马久久亚洲一区 二区| 午夜福利高清在线观看| 人妻夜夜爽天天爽三区麻豆av| 激情综合网激情五月激情| 超碰成人人人做人人爽| 狠狠色噜噜狠狠狠狠av不卡| 国产成人精品区一区二区| 国产精品亚欧美一区二区三区| 精品精品亚洲高清a毛片| yw尤物av无码国产在线观看| 国产精品爽爽爽一区二区| 成人av午夜在线观看| 国产亚洲精品成人av一区| 无码人妻人妻经典| 色综合 图片区 小说区| 国产高跟黑色丝袜在线| 一本色道久久—综合亚洲|