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

📄 9929.txt

📁 关于编程技术技巧的文章
💻 TXT
📖 第 1 页 / 共 4 页
字号:
				XoffLim之后,XoffChar发送出去
					接收缓冲区接收到代表缓冲区空的
				XonLim之后,XonChar发送出
    DWORD fErrorChar: 1;       // enable error replacement 
				该值为TRUE且fParity为TRUE时,用ErrorChar
				成员指定的字符代替奇偶校验错误的接收字
    DWORD fNull: 1;            // enable null stripping 
				TRUE时,接收时去掉空(0值)字节
    DWORD fRtsControl:2;       // RTS flow control 
				RTS_CONTROL_DISABLE时,RTS置为OFF
				RTS_CONTROL_ENABLE时, RTS置为ON
				RTS_CONTROL_HANDSHAKE时,
				当接收缓冲区小于半满时RTS为ON
				当接收缓冲区超过四分之三满时RTS为OFF
				RTS_CONTROL_TOGGLE时,
				当接收缓冲区仍有剩余字节时RTS为ON
				否则缺省为OFF
    DWORD fAbortOnError:1;     // abort reads/writes on error 
				TRUE时,有错误发生时中止读和写操作
    DWORD fDummy2:17;          // reserved 
				未使用
    WORD wReserved;            // not currently used 
				未使用,必须为0
    WORD XonLim;               // transmit XON threshold 
				指定在XON字符发送这前接收缓冲区中可允许
				的最小字节数
    WORD XoffLim;              // transmit XOFF threshold 
				指定在XOFF字符发送这前接收缓冲区中可允许
				的最小字节数
    BYTE ByteSize;             // number of bits/byte, 4-8 
				指定端口当前使用的数据位
    BYTE Parity;               // 0-4=no,odd,even,mark,space 
				指定端口当前使用的奇偶校验方法,可能为:
				EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY
    BYTE StopBits;             // 0,1,2 = 1, 1.5, 2 
				指定端口当前使用的停止位数,可能为:
				ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS
    char XonChar;              // Tx and Rx XON character 
				指定用于发送和接收字符XON的值
    char XoffChar;             // Tx and Rx XOFF character 
				指定用于发送和接收字符XOFF值
    char ErrorChar;            // error replacement character 
				本字符用来代替接收到的奇偶校验发生错误时
				的值
    char EofChar;              // end of input character 
				当没有使用二进制模式时,本字符可用来指示
				数据的结束
    char EvtChar;              // received event character 
				当接收到此字符时,会产生一个事件
    WORD wReserved1;           // reserved; do not use
				未使用
 } DCB; 

6.改变端口设置
  使用如下的两个方法
  BOOL GetCommState(hComm,&dcb);
  BOOL SetCommState(hComm,&dcb);

7,改变普通设置
  BuildCommDCB(szSettings,&DCB);
  szSettings的格式:baud parity data stop
  例: "baud=96 parity=n data=8 stop=1"
      简写:"96,N,8,1"
  szSettings 的有效值
  baud:
  11 or 110  = 110  bps
  15 or 150  = 150  bps
  30 or 300  = 300  bps
  60 or 600  = 600  bps
  12 or 1200 = 1200 bps
  24 or 2400 = 2400 bps
  48 or 4800 = 4800 bps
  96 or 9600 = 9600 bps
  19 or 19200= 19200bps	
  parity:
  n=none
  e=even
  o=odd
  m=mark
  s=space
  data:
  5,6,7,8
  StopBit
  1,1.5,2

8.COMMCONFIG结构:
  typedef struct _COMM_CONFIG {
    DWORD dwSize;
    WORD  wVersion;
    WORD  wReserved;
    DCB   dcb;
    DWORD dwProviderSubType;
    DWORD dwProviderOffset;
    DWORD dwProviderSize;
    WCHAR wcProviderData[1];
  } COMMCONFIG, *LPCOMMCONFIG;
  可方便的使用BOOL CommConfigDialog(
                   LPTSTR lpszName, 
                   HWND hWnd, 
                   LPCOMMCONFIG lpCC); 
  来设置串行口。

9.超时设置:
  可通过COMMTIMEOUTS结构设置超时,
  typedef struct _COMMTIMEOUTS {
     DWORD ReadIntervalTimeout; 
     DWORD ReadTotalTimeoutMultiplier;
     DWORD ReadTotalTimeoutConstant;
     DWORD WriteTotalTimeoutMultiplier;
     DWORD WriteTotalTimeoutConstant; 
  } COMMTIMEOUTS,*LPCOMMTIMEOUTS; 
  区间超时:(仅对从端口中读取数据有用)它指定在读取两个字符之间要经历的时间
  总超时:  当读或写特定的字节数需要的总时间超过某一阈值时,超时触发.
  超时公式:
  ReadTotalTimeout = (ReadTotalTimeoutMultiplier * bytes_to_read)
                     + ReadToTaltimeoutConstant
  WriteTotalTimeout = (WriteTotalTimeoutMuliplier * bytes_to_write)
                     + WritetoTotalTimeoutConstant
  NOTE:在设置超时时参数0为无限等待,既无超时
                   参数MAXDWORD为立即返回
  超时设置: 
  GetCommTimeouts(hComm,&timeouts);
  SetCommTimeouts(hComm,&timeouts);

10.查询方式读写数据
  例程:
  COMMTIMEOUTS to;
  DWORD ReadThread(LPDWORD lpdwParam)
  {
  BYTE inbuff[100];
  DWORD nBytesRead;
  if(!(cp.dwProvCapabilities&PCF_INTTIMEOUTS))
	return 1L;
  memset(&to,0,sizeof(to));
  to.ReadIntervalTimeout = MAXDWORD;
  SetCommTimeouts(hComm,&to);
  while(bReading)
  {
	if(!ReadFile(hComm,inbuff,100,&nBytesRead,NULL))
	   locProcessCommError(GetLastError());
        else
	   if(nBytesRead)
               locProcessBytes(inbuff,nBytesRead);
  }
  PurgeComm(hComm,PURGE_RXCLEAR);
  return 0L;
  }
  
  NOTE:
  PurgeComm()是一个清除函数,它可以中止任何未决的后台读或写,并且
可以冲掉I/O缓冲区.
  BOOL PurgeComm(HANDLE hFile,DWORD dwFlags);
  dwFlages的有效值: 
  PURGE_TXABORT: 中止后台写操作
  PRUGE_RXABORT: 中止后台读操作 
  PRUGE_TXCLEAR: 清除发送缓冲区
  PRUGE_RXCLEAR: 清除接收缓冲区
  技巧:
  可通过ClearCommError()来确定接收缓区中处于等待的字节数。
  BOOL ClearCommError( 
	HANDLE hFile, 		// handle to communications device 
	LPDWORD lpErrors, 	// pointer to variable to receive error codes 
	LPCOMSTAT lpStat 	// pointer to buffer for communications status 
	); 
  ClearCommError()将返回一个COMSTAT结构:
  typedef struct _COMSTAT { // cst 
    DWORD fCtsHold : 1;   // Tx waiting for CTS signal 
    DWORD fDsrHold : 1;   // Tx waiting for DSR signal 
    DWORD fRlsdHold : 1;  // Tx waiting for RLSD signal 
    DWORD fXoffHold : 1;  // Tx waiting, XOFF char rec'd 
    DWORD fXoffSent : 1;  // Tx waiting, XOFF char sent 
    DWORD fEof : 1;       // EOF character sent 
    DWORD fTxim : 1;      // character waiting for Tx 
    DWORD fReserved : 25; // reserved 
    DWORD cbInQue;        // bytes in input buffer 
    DWORD cbOutQue;       // bytes in output buffer 
  } COMSTAT, *LPCOMSTAT; 
  其中的cbInQue和cbOutQue中即为缓冲区字节。

11.同步I/O读写数据
 COMMTIOMOUTS to;
 DWORD ReadThread(LPDWORD lpdwParam)
 {
 BYTE inbuff[100];
 DWORD nByteRead,dwErrorMask,nToRead;
 COMSTAT comstat;
 if(!cp.dwProvCapabilities&PCF_TOTALTIMEOUTS)
 	return 1L;
 memset(&to,0,sizeof(to));
 to.ReadTotalTimeoutMultiplier = 5;
 to.ReadTotalTimeoutConstant = 50;
 SetCommTimeouts(hComm,&to);
 while(bReading)
 {
	ClearCommError(hComm,&dwErrorMask,&comstat);
	if(dwErrorMask)
		locProcessCommError(dwErrorMask);
	if(comstat.cbInQue >100)
		nToRead = 100;
    	else
		nToRead = comstat.cbInQue;
	if(nToRead == 0)
		continue;
	if(!ReadFile(hComm,inbuff,nToRead,&nBytesRead,NULL))
		locProcessCommError(GetLastError());
	else
	    if(nBytesRead)
		locProcessBytes(inbuff,nBytesRead);
 }
 return 0L;
 }

12.异步I/O读写数据
  当CreateFile()中的fdwAttrsAndFlags参数为FILE_FLAG_OVERLAPPEN时,
  端口是为异步I/O打开的,此时可以在ReadFile的最后一个参数中指定一个
  OVERLAPPED结构,使数据的读操作在后台进行。WINDOWS 95包括了异步
  I/O的许多变种。
  typedef struct _OVERLAPPED {  
    DWORD  Internal; 
    DWORD  InternalHigh; 
    DWORD  Offset; 
    DWORD  OffsetHigh; 
    HANDLE hEvent; 
  } OVERLAPPED; 
  对于串行口仅hEvent成员有效,其于成员必须为0。
  例程:
  COMMTIMEOUTS to;
  ...
  DWORD ReadThread((LPDWORD lpdwParam)
  {
  BYTE inbuff[100];
  DWORD nRytesRead,endtime,lrc;
  static OVERLAPPED o;
  if(!cp.dwProvCapabilities & PCF_TOTALTIMEOUTS)
	return 1L;
  memset(&to,0,sizeof(to));
  to.ReadTotalTimeoutMultiplier = 5;
  to.ReadTotalTimeoutConstant = 1000;
  SetCommTimeouts(hComm,&to);
  o.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
  while(bReading)
  {
	if(!ReadFile(hComm,inbuff,10,&nBytesRead,&o))
	{
	  nBytesRead = 0;
	  if(lrc=GetLastError() == ERROR_IO_PENDING)
	  {
	    endtime = GetTickCount() + 1000;
	    while(!GetOverlappedResult(hComm,&o,&nBytesRead,FALSE))
	      if(GetTickCount() > endtime) break;
	  }
	  if(nBytesRead) locProcessBytes(inbuff,nBytesRead);
	}
	else
	{
	  if(nBytesRead) locProcessBytes(inbuff,nBytesRead);
	  ResetEvent(o.hEvent);
	}
  }
  PurgeComm(hComm,PURGE_RXCLEAR);
  return 0L;
}

  这一例程是对一开始读缓冲区就读到所需的字节时的处理:
  while(bReading)
  {
 	if(!ReadFile(hComm,inbuff,10,&nBytesRead,&o))
	{	
	  if((lrc=GetLastError()) ==ERROR_IO_PENDING)
	  {
	    if(GetOverlappedResult(hComm,&o,&nBytesRead,TRUE))
	    {		
	    	if(nBytesRead)
		  locProcessBytesa(inbuff,nBytesRead);
 	    }
	    else
	      locProcessCommError(GetLastError());
          }
	  else
            locProcessCommError(GetLastError));
	}
	else
	  if(nBytesRead) locProcessBytes(inbuff,nBytesRead);
	ResetEvent(o.hEvent);
  }
	
13.事件驱I/O读写:
  GetCommMask(hComm,&dwMask)
  Windows 95报告给应用程序的事件由此方法返回。
  SetCommMasl(hComm,&dwMask)
  添加或修改Windows 95所报告的事件列表。
  事件掩码如下:
  EV_BREAK	检测到输入为止
  EV_CTS	CTS(清除发送)信号改变状态
  EV_DSR 	DSR(数据设置就绪)信号改变状态
  EV_ERR	发生了线路状态错误.
		线路状态错误为:
  		CE_FRAME(帧错误)
 		CE_OVERRUN(接收缓冲区超限)
		CE_RXPARITY(奇偶校验错误)
  EV_RING	检测到振铃
  EV_RLSD	RLSD(接收线路信号检测)信号改变状态
  EV_EXCHAR	接收到一个字符,并放入输入缓冲区
  EV_RXFLAG 	接收到事件字符(DCB成员的EvtChar成员),度放入输入缓冲区
  EV_TXEMPTY	输出缓冲区中最后一个字符发送出去
  在用SetCommMask指定了有用的事件后,应用程序可调用WaitCommEvent()来等
  待事件发生.
  BOOL WaitCommEvent(
 	HANDLE hFile,   	    // handle of communications device 
 	LPDWORD lpEvtMask,  	    // address of variable for event that occurred 
     	LPOVERLAPPED lpOverlapped,  // address of overlapped structure 

⌨️ 快捷键说明

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