VC串口通信.docx

上传人:b****8 文档编号:30461037 上传时间:2023-08-15 格式:DOCX 页数:38 大小:31.92KB
下载 相关 举报
VC串口通信.docx_第1页
第1页 / 共38页
VC串口通信.docx_第2页
第2页 / 共38页
VC串口通信.docx_第3页
第3页 / 共38页
VC串口通信.docx_第4页
第4页 / 共38页
VC串口通信.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

VC串口通信.docx

《VC串口通信.docx》由会员分享,可在线阅读,更多相关《VC串口通信.docx(38页珍藏版)》请在冰豆网上搜索。

VC串口通信.docx

VC串口通信

WIN95界面下的VC++串口通讯程序在WIN32下是不建议对端口进行操作的,在WIN32中所有的设备都被看成是文件,串行口也不例外也是作为文件来进行处理的。

 关键词 串行口,DWORD,缓冲区

 WIN95界面下的VC++串口通讯程序在WIN32下是不建议对端口进行操作的,在WIN32中所有的设备都被看成是文件,串行口也不例外也是作为文件来进行处理的。

这是我的一份关于串口编程的读书笔记,对于使用VC进行编程的同行应该有一定的帮助。

1.打开串口:

  在Window95下串行口作为文件处理,使用文件操作对串行口进行处理。

使用CreateFile()打开串口,CreateFile()将返回串口的句柄。

HANDLECreateFile

  LPCTSTRlpFileName,//pointertonameofthefile

  DWORDdwDesiredAccess,//access(read-write)mode

  DWORDdwShareMode,//sharemode

  LPSECURITY_ATTRIBUTESlpSecurityAttributes,//pointertosecurityattributes

  DWORDdwCreationDistribution,//howtocreate

  DWORDdwFlagsAndAttributes,//fileattributes

  HANDLEhTemplateFile//handletofilewithattributestocopy

);

lpFileName:

指明串口制备,例:

COM1,COM2

dwDesiredAccess:

指明串口存取方式,例:

GENERIC_READ|GENERIC_WRITE

dwShareMode:

指明串口共享方式

lpSecurityAttributes:

指明串口的安全属性结构,NULL为缺省安全属性

dwCreateionDistribution:

必须为OPEN_EXISTIN

dwFlagAndAttributes:

对串口唯一有意义的是FILE_FLAG_OVERLAPPED

hTemplateFile:

必须为NULL

2.关闭串口:

CloseHandle(hCommDev);

3.设置缓冲区长度:

BOOLSetupComm(

  HANDLEhFile,//handleofcommunicationsdevice

  DWORDdwInQueue,//sizeofinputbuffer

  DWORDdwOutQueue//sizeofoutputbuffer

);

4.COMMPROP结构:

  可使用GetCommProperties()取得COMMPROP结构,COMMPROP结构中记载了系统支持的各项设置。

  typedefstruct_COMMPROP{//cmmp

  WORDwPacketLength;//packetsize,inbytes

  WORDwPacketVersion;//packetversion

  DWORDdwServiceMask;//servicesimplemented

  DWORDdwReserved1;//reserved

  DWORDdwMaxTxQueue;//maxTxbufsize,inbytes

  DWORDdwMaxRxQueue;//maxRxbufsize,inbytes

  DWORDdwMaxBaud;//maxbaudrate,inbps

  DWORDdwProvSubType;//specificprovidertype

  DWORDdwProvCapabilities;//capabilitiessupported

  DWORDdwSettableParams;//changeableparameters

  DWORDdwSettableBaud;//allowablebaudrates

  WORDwSettableData;//allowablebytesizes

  WORDwSettableStopParity;//stopbits/parityallowed

  DWORDdwCurrentTxQueue;//Txbuffersize,inbytes

  DWORDdwCurrentRxQueue;//Rxbuffersize,inbytes

  DWORDdwProvSpec1;//provider-specificdata

  DWORDdwProvSpec2;//provider-specificdata

  WCHARwcProvChar[1];//provider-specificdata

}COMMPROP;

dwMaxBaud:

BAUD_07575bps

BAUD_110110bps

BAUD_134_5134.5bps

BAUD_150150bps

BAUD_300300bps

BAUD_600600bps

BAUD_12001200bps

BAUD_18001800bps

BAUD_24002400bps

BAUD_48004800bps

BAUD_72007200bps

BAUD_96009600bps

BAUD_1440014400bps

BAUD_1920019200bps

BAUD_3840038400bps

BAUD_56K56Kbps

BAUD_5760057600bps

BAUD_115200115200bps

BAUD_128K128Kbps

BAUD_USERProgrammablebaudratesavailable

dwProvSubType:

PST_FAX传真设备

PST_LATLAT协议

PST_MODEM调制解调器设备

PST_NETWORK_BRIDGE未指定的网桥

PST_PARALLELPORT并口

PST_RS232RS-232口

PST_RS422RS-422口

PST_RS423RS-432口

PST_RS449RS-449口

PST_SCANNER扫描仪设备

PST_TCPIP_TELNETTCP/IPTelnet协议

PST_UNSPECIFIED未指定

PST_X25X.25标准

dwProvCapabilities

PCF_16BITMODE支持特殊的位模式

PCF_DTRDSR支持DTR(数据终端就绪)/DSR(数据设备就绪)

PCF_INTTIMEOUTS支持区间超时

PCF_PARITY_CHECK支持奇偶校验

PCF_RLSD支持RLSD(接收线信号检测)

PCF_RTSCTS支持RTS(请求发送)/CTS(清除发送)

PCF_SETXCHAR支持可设置的XON/XOFF

PCF_SPECIALCHARS支持特殊字符

PCF_TOTALTIMEOUTS支持总(占用时间)超时

PCF_XONXOFF支持XON/XOFF流控制

标准RS-232和WINDOW支持除PCF_16BITMODE和PCF_SPECIALCHAR外的所有功能

dwSettableParams

SP_BAUD可配置波特率

SP_DATABITS可配置数据位个数

SP_HANDSHAKING可配置握手(流控制)

SP_PARITY可配置奇偶校验模式

SP_PARITY_CHECK可配置奇偶校验允许/禁止

SP_RLSD可配置RLSD(接收信号检测)

SP_STOPBITS可配置停止位个数

标准RS-232和WINDOW支持以上所有功能

wSettableData

DATABITS_55个数据位

DATABITS_66个数据位

DATABITS_77个数据位

DATABITS_88个数据位

DATABITS_1616个数据位

DATABITS_16X通过串行硬件线路的特殊宽度路径

WINDOWS95支持的所有设置

5.DCB结构:

typedefstruct_DCB{//dcb

DWORDDCBlength;//sizeof(DCB)

DWORDBaudRate;//currentbaudrate指定当前的波特率

DWORDfBinary:

1;//binarymode,noEOFcheck指定是否允许二进制模式,

WINDOWS95中必须为TRUE

DWORDfParity:

1;//enableparitychecking指定奇偶校验是否允许

DWORDfOutxCtsFlow:

1;//CTSoutputflowcontrol指定CTS是否用于检测发送控制。

当为TRUE是CTS为OFF,发送将被挂起。

DWORDfOutxDsrFlow:

1;//DSRoutputflowcontrol

指定CTS是否用于检测发送控制。

当为TRUE是CTS为OFF,发送将被挂起。

DWORDfDtrControl:

2;//DTRflowcontroltype

DTR_CONTROL_DISABLE值将DTR置为OFF,DTR_CONTROL_ENABLE值将DTR置为ON,DTR_CONTROL_HANDSHAKE允许DTR"握手",DWORDfDsrSensitivity:

1;//DSRsensitivity当该值为TRUE时DSR为OFF时接收的字节被忽略

DWORDfTXContinueOnXoff:

1;//XOFFcontinuesTx

指定当接收缓冲区已满,并且驱动程序已经发

送出XoffChar字符时发送是否停止。

TRUE时,在接收缓冲区接收到缓冲区已满的字节XoffLim且驱动程序已经发送出XoffChar字符中止接收字节之后,发送继续进行。

FALSE时,在接收缓冲区接收到代表缓冲区已空的字节XonChar且驱动程序已经发送出恢复发送的XonChar之后,发送继续进行。

DWORDfOutX:

1;//XON/XOFFoutflowcontrol

TRUE时,接收到XoffChar之后便停止发送

接收到XonChar之后将重新开始

DWORDfInX:

1;//XON/XOFFinflowcontrol

TRUE时,接收缓冲区接收到代表缓冲区满的XoffLim之后,XoffChar发送出去

接收缓冲区接收到代表缓冲区空的XonLim之后,XonChar发送出去

DWORDfErrorChar:

1;//enableerrorreplacement

该值为TRUE且fParity为TRUE时,用ErrorChar成员指定的字符代替奇偶校验错误的接收字符

DWORDfNull:

1;//enablenullstripping

TRUE时,接收时去掉空(值)字节

DWORDfRtsControl:

2;//RTSflowcontrol

RTS_CONTROL_DISABLE时,RTS置为OFF

RTS_CONTROL_ENABLE时,RTS置为ON

RTS_CONTROL_HANDSHAKE时,

当接收缓冲区小于半满时RTS为ON

当接收缓冲区超过四分之三满时RTS为OFF

RTS_CONTROL_TOGGLE时,

当接收缓冲区仍有剩余字节时RTS为ON,否则缺省为OFF

DWORDfAbortOnError:

1;//abortreads/writesonerrorTRUE时,有错误发生时中止读和写操作

DWORDfDummy2:

17;//reserved未使用

WORDwReserved;//notcurrentlyused未使用,必须为

WORDXonLim;//transmitXONthreshold指定在XON字符发送这前接收缓冲区中可允许的最小字节数

WORDXoffLim;//transmitXOFFthreshold指定在XOFF字符发送这前接收缓冲区中可允许的最小字节数

BYTEByteSize;//numberofbits/byte,4-8指定端口当前使用的数据位

BYTEParity;//0-4=no,odd,even,mark,space指定端口当前使用的奇偶校验方法,可能为:

EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY

BYTEStopBits;//0,1,2=1,1.5,2指定端口当前使用的停止位数,可能为:

  ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS

charXonChar;//TxandRxXONcharacter指定用于发送和接收字符XON的值

charXoffChar;//TxandRxXOFFcharacter指定用于发送和接收字符XOFF值

charErrorChar;//errorreplacementcharacter本字符用来代替接收到的奇偶校验发生错误时的值

charEofChar;//endofinputcharacter当没有使用二进制模式时,本字符可用来指示数据的结束

charEvtChar;//receivedeventcharacter当接收到此字符时,会产生一个事件

WORDwReserved1;//reserved;donotuse未使用

}DCB;

6.改变端口设置

使用如下的两个方法

BOOLGetCommState(hComm,&dcb);

BOOLSetCommState(hComm,&dcb);

7.改变普通设置

BuildCommDCB(szSettings,&DCB);

szSettings的格式:

baudparitydatastop

例:

"baud=96parity=ndata=8stop=1"

简写:

"96,N,8,1"

szSettings的有效值

baud:

or110=110bps

or150=150bps

or300=300bps

or600=600bps

or1200=1200bps

or2400=2400bps

or4800=4800bps

or9600=9600bps

or19200=19200bps

parity:

n=none

e=even

o=odd

m=mark

s=space

data:

6,7,8

StopBit

1.5,2

8.COMMCONFIG结构:

typedefstruct_COMM_CONFIG

{

  DWORDdwSize;

  WORDwVersion;

  WORDwReserved;

  DCBdcb;

  DWORDdwProviderSubType;

  DWORDdwProviderOffset;

  DWORDdwProviderSize;

  WCHARwcProviderData[1];

}COMMCONFIG,*LPCOMMCONFIG;

可方便的使用

BOOLCommConfigDialog

LPTSTRlpszName,

HWNDhWnd,

LPCOMMCONFIGlpCC

);

来设置串行口。

9.超时设置:

可通过COMMTIMEOUTS结构设置超时,

typedefstruct_COMMTIMEOUTS

{

  DWORDReadIntervalTimeout;

  DWORDReadTotalTimeoutMultiplier;

  DWORDReadTotalTimeoutConstant;

  DWORDWriteTotalTimeoutMultiplier;

  DWORDWriteTotalTimeoutConstant;

}COMMTIMEOUTS,*LPCOMMTIMEOUTS;

区间超时:

(仅对从端口中读取数据有用)它指定在读取两个字符之间要经历的时间

总超时:

当读或写特定的字节数需要的总时间超过某一阈值时,超时触发.

超时公式:

ReadTotalTimeout=(ReadTotalTimeoutMultiplier*bytes_to_read)

+ReadToTaltimeoutConstant

WriteTotalTimeout=(WriteTotalTimeoutMuliplier*bytes_to_write)

+WritetoTotalTimeoutConstant

NOTE:

在设置超时时参数为无限等待,既无超时参数MAXDWORD为立即返回

超时设置:

GetCommTimeouts(hComm,&timeouts);

SetCommTimeouts(hComm,&timeouts);

10.查询方式读写数据

例程:

  COMMTIMEOUTSto;

  DWORDReadThread(LPDWORDlpdwParam)

  {

  BYTEinbuff[100];

  DWORDnBytesRead;

  if(!

(cp.dwProvCapabilities&PCF_INTTIMEOUTS))

  return1L;

  memset(&to,0,sizeof(to));

  to.ReadIntervalTimeout=MAXDWORD;

  SetCommTimeouts(hComm,&to);

  while(bReading)

  {

  if(!

ReadFile(hComm,inbuff,100,&nBytesRead,NULL))

  locProcessCommError(GetLastError());

  elseif(nBytesRead)

  locProcessBytes(inbuff,nBytesRead);

  }

  PurgeComm(hComm,PURGE_RXCLEAR);

  return0L;

}

  NOTE:

  PurgeComm()是一个清除函数,它可以中止任何未决的后台读或写,并且可以冲掉I/O缓冲区.

  BOOLPurgeComm(HANDLEhFile,DWORDdwFlags);

  dwFlages的有效值:

  PURGE_TXABORT:

中止后台写操作

  PRUGE_RXABORT:

中止后台读操作

  PRUGE_TXCLEAR:

清除发送缓冲区

  PRUGE_RXCLEAR:

清除接收缓冲区

  技巧:

  可通过ClearCommError()来确定接收缓区中处于等待的字节数。

  BOOLClearCommError(

  HANDLEhFile,//handletocommunicationsdevice

  LPDWORDlpErrors,//pointertovariabletoreceiveerrorcodes

  LPCOMSTATlpStat//pointertobufferforcommunicationsstatus

  );

  ClearCommError()将返回一个COMSTAT结构:

  typedefstruct_COMSTAT{//cst

  DWORDfCtsHold:

1;//TxwaitingforCTSsignal

  DWORDfDsrHold:

1;//TxwaitingforDSRsignal

  DWORDfRlsdHold:

1;//TxwaitingforRLSDsignal

  DWORDfXoffHold:

1;//Txwaiting,XOFFcharrec`d

  DWORDfXoffSent:

1;//Txwaiting,XOFFcharsent

  DWORDfEof:

1;//EOFcharactersent

  DWORDfTxim:

1;//characterwaitingforTx

  DWORDfReserved:

25;//reserved

  DWORDcbInQue;//bytesininputbuffer

  DWORDcbOutQue;//bytesinoutputbuffer

  }COMSTAT,*LPCOMSTAT;

  其中的cbInQue和cbOutQue中即为缓冲区字节。

11.同步I/O读写数据

  COMMTIOMOUTSto;

  DWORDReadThread(LPDWORDlpdwParam)

  {

  BYTEinbuff[100];

  DWORDnByteRead,dwErrorMask,nToRead;

  COMSTATcomstat;

  if(!

cp.dwProvCapabilities&PCF_TOTALTIMEOUTS)

  return1L;

  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());

  elseif(nBytesRead)

  locProcessBytes(inbuff

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1