综合分析VC串口编程.doc_第1页
综合分析VC串口编程.doc_第2页
综合分析VC串口编程.doc_第3页
综合分析VC串口编程.doc_第4页
综合分析VC串口编程.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

接口的基本功能CPU与I/O设备进行数据交换时存在以下问题:1)速度不匹配;2)时序不匹配;3)信息格式不匹配;4)信息类型不匹配。CPU与外设之间的数据交换必须通过接口来完成,通常情况下,接口应具备以下功能:1)数据缓冲功能;2)信号转换功能;3)设备选择功能;4)接受、解释并执行微处理器的命令功能;5)中断管理功能;6)数据宽度变换的功能;7)楞编程功能。常用接口简介1、并行接口主机与接口、接口与外设之间都是以并行方式传送数据,即每次传送一个字或字节的全部代码。其特点是:1) 接口中具有与系统总线直接相连的输入/输出数据缓冲器和一组数据线;2) 接口中具有与外部设备进行联络的应答信号。3) 接口中有地址译码电路、产生片选信号和内部寄存器地址选择。4) 接口可使用程序传送方式或程序中断传送方式实现外设与主机之间的信息交换。5) 简单并行接口只有一个I/O通路驱动外设,对于复杂的、可编程并行接口可有几个I/O通路驱动不同外设的输入/输出。并行接口的数据通路宽度是按字或字节设置,其数据传送速率高。当外设的工作方式是并行传送数据,并且与主机系统距离较近时,则选用并行接口。由于并行接口可以直接和各种I/O设备的数据线相连,所以用它来连接外设组成系统非常方便,故在慢速设备中使用很普遍。2、串行接口串行口不同于并行口之处在于它的数据和控制信息是一位接一位串行地传送下去。虽然速度会慢一些,但传送距离较并行口更长,因此,长距离的通信应使用串行口。3、磁盘接口1) IDE(Integrated Driver Electronics,集成驱动器电子部件)接口2) EIDE接口:所支持的设备除了硬盘,还包括CD-ROM、磁盘备份设备等,通常提供两个插座(主插座和辅插座),每个插座又可连接主、从两个设备。主插座通常与高速的局部总线相连,供硬盘使用;而辅插座则与ISA总线相边,供磁带机或CD-ROM使用。4、SCSI(Small Computer System Interface)接口除了硬盘外,SCSI接口还可以连接CD-ROM驱动器、扫描仪和打印机等,它有以下特点:1)SCSI是一个多任务接口,具有总线仲裁功能,因此,SCSI总线上的适配器和控制器可以并行工作,在同一个SCSI控制器控制下的多台外设也可以并行工作。SCSI可以按同步方式和异步方式传输数据。SCSI总线上的设备没有主从之分,双方平等。2)SCSI可分为单端传送方式和差分传送方式。单端SCSI的电缆不能超过6m,如果数据传送距离超过6m,应采用差分传送方式。3)SCSI接口是智能化的,可以彼此通信而不增加CPU的负担。在IDE和EIDE设备之间传输数据时,CPU必须介入,而SCSI设备在数据传输过程中起主动作用,并能在SCSI总线内部具体执行,直到完成再通知CPU。5、USB接口接口的控制方式CPU通过接口对外设进行控制的方式有以下几种:1) 程序查询方式2) 中断处理方式3) DMA(直接存储器存取)传送方式9针串口(DB9)信号脚说明针号功能说明缩写1数据载波检测DCD2接收数据RXD3发送数据TXD4数据终端准备DTR5信号地GND6数据设备准备好DSR7请求发送RTS8清除发送CTS9振铃指示DELL串口通信接线原则:接收数据针脚与发送数据针脚相连,彼此交叉,信号地对应相接。COM缺省端口地址和IRQ号端口地址中断请求号(IRQ)COM13F8H4COM22F8H3COM33E8H4或11COM42E8H3或10端口可以使用硬件支持的任何地址和IRQ号,每个端口保留8个连续地址,从基址开始。串行接口输入输出过程描述串行接口包括4个主要寄存器,即控制寄存器、状态寄存器、数据输入寄存器及数据输出寄存器。控制寄存器用来接收CPU送给此接口的各种控制信息,而控制信息决定接口的工作方式。状态寄存器的各位叫状态位,每一个状态位都可以用来指示传输过程中的某一种错误或当前传输状态。数据输入寄存器总是和串行输入/并行输出移位寄存器配对使用的。在输入过程中,数据一位一位从外部设备进入接口的寄存器,当接收完一个数据后,数据就从移位寄存器送到输入寄存器,再等待CPU来取走。输出的情况与输入过程类似,在输出过程中,数据输出寄存器与并行输入/串行输出移位寄存器配对使用。当CPU往数据输出寄存器中输出一个数据后,数据便传输到移位寄存器,然后一位一位地通过输出线送到外设。串行通信数据的收发方式分为异步通信方式与同步通信方式。并行打印机适配器信号适配器信号DB-25信号方向名称寄存器功能说明11输出nSTROBECONTROL低电平有效,表明数据线上有效数据到达2至92至9输出DATA_1至DATA_8DATA8位数据线,只有当SPP为零时才输出数据1010输入NACKSTATUS以插入低电平的形式出现,表明最后一个字符接收完毕1111输入BUSYSTATUS缺打印纸1212输入PESTATUS以插入高电平的形式出现,表明打印机处理在线等待1313输入SELECTSTATUS低电平有效,通知打印机对遇到的每一回车自动换行1414输入AUTOFEEDCONTROL由打印机发送至计算机,表明打印机处理错误状态3215输出NERRORSTATUS低电平有效,对打印机复位3116输入NINITCONTROL低电平有效,表明已经选中的打印机3617输出NSELECT-INCONTROL19、21、23、25、27、29、30、3418至25GROUND打印机适配器三个端口的缺省典型地址端口PC:LPT1PC:LPT2PC:LPT3DATA3BCH378H278HSTATUS3BDH379H279HCONTROL3BEH37AH27AH并行接口输入输出过程描述输入过程在并行接口中应该有一个控制寄存器用来接收CPU对它的控制命令,有一个状态寄存器提供各种状态位供CPU查询。为了实现输入输出,并行接口中还必定有相应的输入缓冲寄存器和输出缓冲寄存器。当并行接口处于输入过程时,使状态线“数据输入准备好”成为高电平,作为对外设的响应。外设接到此信号,便撤除数据和“数据输入准备好”信号。数据到达接口后,接口会在状态寄存器中设置“输入准备好信号”状态位,以便CPU进行查询,接口也可以在此时向CPU发送一个中断请求。所以,CPU既可以用软件查询方式,也可用中断方式来设法读取接口中的数据。CPU从并行接口中读取数据后,接口会自动清除状态寄存器中“输入准备好”状态位,并使数据总线处于高阻状态。此后,又开始下一个输入过程。输出过程每当外设从并行接口取走一个数据后,接口就会将状态寄存器中“输入准备好”状态位置1,以表示CPU当前可以往接口中输出数据,这个状态位可供CPU进行查询。此时,接口也可以向CPU发送一个中断请求。所以CPU既可用软件查询方式,也可用中断方式往接口中输出一个数据。当CPU输出数据到达接口的输出缓冲寄存器后,接口会自动清除“输入准备好”的状态位,并且将数据送往外设,同时,接口往外设发送一个“驱动信号”来启动外设接收数据。外设被启动后,开始接收数据,并往接口发一个“数据输出回答”信号。接口收到此信号,便将状态寄存器中的“输入准备好”状态位置1,以便CPU输出下一个数据。并行接口与串行接口通信比较并行通信是把一个字符的各数位用几条线同时传输,传输速度快、效率高。但它比串行通信所用的传输线多,因此,并行通信常用在传输距离较短、数据传输速率较高的场合。由于串行通信是按数据一位一位地依次传输,每一位数据占据一个固定的时间长度。所以,只要少数几条线就可以在系统之间交换信息,较少的传输线使通信成本降低,尤其在远程传输时更为突出,但是,啬了数据格式的转换、位计数及传送时控制等技术,使其技术比并行通信更为复杂。同步传输方式采用同步传输时,将许多字符组成一个信息组,这样,字符可以一个接一个地传输,但是,在每组信息(通常称为帧)的开始要加上同步字符,在没有信息要传输时,要填上空字符,因为同步传输不允许有间隙。在同步传输过程中,一个字符可以对应5至8bit。当然,对同一个传输过程,所有字符对应同样的比特数,比如说n比特。这样,传输时,按每n比特划分为一个时间片,发送端在一个时间片发送一个字符,接收端则在一个时间片中接收一个字符。同步传输时,一个信息帧中包含许多字符,每个信息帧有同步字符作为开始,一般将同步字符和空字符用同一个代码。在整个系统中,由一个统一的时钟控制发送端的发送和空字符。接收端当然是应该能识别同步字符的,当检测到有一串比特和同步字符相匹配时,就认为开始一个信息帧,于是,把此后的比特作为实际传输信息来处理。异步传输方式异步传输方式指比特被划分成小组独立传送。发送方可以在任何时刻发送这些比特组,而接收方不知道它们会在什么时候到达。异步传输存在一个潜在的问题,即接收方并不知道数据会在什么时候到达。在它检测到数据并作出响应之前,第一个比特已经过去了。因此这个问题需要通过通信协议加以解决。如每次异步传输都以一个开始比特开头,它通知接收方数据已经到达了。这就给了接收方响应、接收和缓存数据比特的时间。在传输结束时,一个停止比特表示一次传输的终止。同步传输方式和异步传输方式的简单比较1) 从通信效率的角度看,同步传输方式接收方不必对每个字符进行开始和停止的操作,因此同步传输通信效率高,异步传输效率低。2) 异步传输简单,双方时钟可允许一定误差。同步传输较复杂,双方时钟的允许误差较小。3) 异步传输只适用于点到点的数据传输,而同步传输可用于点和多点之间的数据传输。通信协议:是指通信双方的一种约定。约定包括对数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题作出统一规定,通信双方必须共同遵守。因此,也叫做通信控制规程。目前,采用的通信协议有两类:异步协议和同步协议。同步协议又有面向字符和面向比特以及面向字节计数三种。比特率=波特率n=串口编程常用的IBM-PC的IRQ线IRQ设备NMI非屏幕中断0定时器1键盘2保留3串口24串口15硬盘6软盘7并口1COM1和COM2的I/O地址偏移量主适配器次适配器寻址寄存器03F82F8TX缓存器03F82F8RX缓存器03F82F8因子锁存器LSB13F92F9因子锁存器MSB13F92F9中断使能寄存器23FA2FA中断标识寄存器33FB2FB线路控制寄存器43FC2FCModem控制寄存器53FD2FD线路状态寄存器63FE2FEModem状态寄存器端口编程概述在DOS的系统接口中DOS INT21H的03H和04H号功能调用为异步串行通信的接收和发送功能,而BIOS INT14H有4组功能调用为串行通信服务,所以在DOS中采用寄存器直接读写、BIOS调用、通信中断程序等方法可较容易实现串口通信。但在Windows中由于Windows采用消息驱动和设备统一管理,以及利用消息队列进行程序控制,所以DOS下的方法都不宜采用。在Windows中为实现串口通信,Windows的SDK提供了完备的API函数和以中断方式驱动的通信驱动程序,使编程变得较为容易。一般来说,要完成串口通信,在32位模式下,有以下四种方法:1、以文件方式打开串口(1)应用CreateFile()打开串口如:HANDLE hCom;DWORD dwError;hCom=CreatFile(“COM1”,/文件名GENERIC_READ | GENERIC_WRITE, /允许读和写0, /独占方式NULL, OPEN_EXISTING, /打开而不是创建FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, /重叠方式NULL);if(hCom=INVALID_HANDLE_VALUE)dwError=GetLastError();./处理错误一旦端口处理打开状态,就可以分配一个发送缓冲区和接收缓冲区,并通过调用SetupComm()实现其他初始化工作。(2)串行口的初始化调用GetCommState()函数可以获得串口的配置,该函数把当前配置填充到一个DCB结构中。DCB结构包含了诸如数据传输速率、每个字符的数据位数、奇偶校验和停止位数等信息。在查询或配置串行口的属性时,都要用DCB结构来作为缓冲区。要修改串行口的配置,应该先修改DCB结构,然后再调用SetCommState()函数用指定的DCB结构来设置串行口。DCB最经常改变的参数是数据传输速率、奇偶校验的方法以及数据位和停止位数,Windows为改变这些参数提供了BuildCommDCB()函数。Win32还提供了BuildCommDCBAndTimeouts()函数来设置DCB,该函数可进一步设置超时结构。(3)利用ReadFile()或ReadFileEx()和WriteFile()或WriteFileEx()对串行口进行读写操作,完成数据传输过程。ReadFile()、WriteFile()对同步或异步操作都支持,而ReadFileEx()、WriteFileEx()只支持异步操作。Windows系统提供TransmitCommChar()函数,该函数可以在发送时指定一字符的传递权限级别最高,使该字符可在缓冲区的其他字符发送之前发送。(4)关闭串口,调用CloseHandle()即可。其他Windows串口通信相关API函数:(1)串口属性:通过GetCommProperties()函数获得。(2)通用通信设备配置:CommConfigDialog()函数。(3)缓冲区控制:PurgeComm()函数和FlushFileBuffers()函数。(4)异步I/O操作:异步(重叠)I/O操作是指应用程序可在后台读或写数据,而在前台做其他事情。异步I/O操作可由GetOverLappedResult()函数获取结果,也可使用Windows信号函数来处理。Windows也使用等待函数来检查事件对象的当前状态或等待windows状态信号,在WaitForSingleObject()函数,WaitForSingleObjectEx()函数,以及WaitForMultipleObject()函数,WaitForMultipleObjectsEx()函数中指定OVERLAPPED结构中的hEvent,即可获得函数返回事件。(5)超时设置:GetCommTimeouts()、SetCommTimeouts()函数。(6)通信状态和通信错误:ClearCommError()函数的第一个作用是清除错误条件,第二个作用是确定串口通信状态。(7)通信事件:(7a)操作通信事件:SetCommMask()函数、GetCommMask()函数。(7b)监视通信事件:WaitCommEvent()函数。(8)设备控制命令(8a)控制握手信号:EscapeCommFunction()函数。(8b)设备操作:使用SetCommBreak()、ClearCommBreak()函数实现对通信设备的挂起和恢复。2、使用现有的ActiveX控件实现一般使用微软件公司的MSComm控件,它是作为一个OCX提供的。基本使用流程和直接使用API函数类似。3、直接嵌入汇编这种方法不能在Windows NT操作系统下使用,由于Windows 98的非完全保护,可以在Windows 98系统下使用这种操作方式。利用C/C+汇编嵌入功能,可以直接对串口进行操作。如下程序可实现将COM1端口的线控制寄存器的最高位置1的操作:_asmmov dx,3FBHmov al,80Hout dx,al4、编写VXD或WDM实现MSComm控件提供两种处理通信问题的方法:一是事件驱动方法,一是查询法。1、事件驱动方式事件驱动通信是处理串行端口交互作用的一种有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符或CD或 RTS线上一个字符到达,在这些情况下,可利用MSComm的OnComm事件捕获并处理这些通信事件。OnComm事件还可以检查和处理通信错误(参CommEvent属性)。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm控件对应一个串口。如果应用程序要访问多个串口,必须使用多个MSComm控件。2、查询方式在程序的每个关键功能之后,可通过检查CommEvent属性的值来查询事件和错误,中要其属性值有了变化,就表明一个通信事件或错误发生。如果应用程序较小,且是自成一体的,这种方法可能更可取。利用MSComm控件开发串口通信软件,至少要了解5条线的名称及其作用,这5条线的高低电平状态分别对应MSComm控件相应属性的True/False值。DTR线:用于传输PC机发往串口Modem等设备的信号线,该信号表示PC机是否已经准备好。RTS线:用于传输PC机发往串口Modem等设备的信号,该信号表示PC机是否允许Modem发数据。DSR线:用于传输串口Modem等设备发往PC机的信号,该信号表示Modem等设备上否已作好操作准备。CTS线:用于传输串口Modem等设备发往PC机的信号,该信号表示Modem上否允许发送数据。CD线:用于传输串口Modem等设备发往PC机的信号,该信号表示Modem已和远方的设备建立了联系。MSComm控件的通信功能的实现,实际上是调用API函数,而API函数是由Comm.drv解释并传递给设备驱动程序进行的。MSComm控件的属性1) CommPort属性void SetCommPort(short nNewValue);short GetCommPort();用于设置并返回连接的串口号,Windows将利用该串口和外界通信。在设计时,nNewValue可设置成1至16的任何数(默认值为1)。但如果用PortOpen属性打开一个并不存在的端口时,MSComm控件会产生错误68(设备无效)。2) Settings属性void SetSettings(LPCTSTR lpszNewValue);CString GetSettings();用于设置并返回数据传输速率、奇偶校验、数据比特、停止比特参数。当端口打开时,如果lpszNewValue非法,则MSComm控件产生错误380(非法属性值)。其中lpszNewValue用字符串表示,基格式如下:“BBBB,P,D,S”BBBB为数据传输速率,P为奇偶校验,D为数据比特数,S为停止比特数。LpszNewValue的缺省值为“9600,N,8,1”,表示传输速率为9600bit/s,无奇偶校验,8bit数据比特,1bit停止比特。数据传输速率的合法值:110、300、600、1200、2400、4800、9600、14400、19200、28800、38400、56000、57600、115200、12800、25600。奇偶校验设定值设定值描述E偶校验(EVENT)M标号校验(MARK)N无校验(NONE)O奇校验(ODD)S空格校验(SPACE)数据比特数可以是4、5、6、7、8。停止比特数可以是1、1.5、2。只有当通信的双方的Settings属性值都一样,通信连接才能生效。3) Handshaking属性用于设置或者返回硬件握手协议,也就是PC机和通信设备之间为了控制流速而设定的内部协议。硬件握手协议设定值设定值值描述ComNone0默认值,无握手协议comXOnXOff1XON/XOFF握手ComRTS2Request-to-Send/Clear-to-Send握手comRtsXOnXOff3Request-to-Send和Clear-to-Send握手皆可4) RThreshold属性void SetRThreshold(short nNewValue);short GetRThreshold();在MSComm控件设置CommEvent属性为comEvReceive并产生OnComm之前,RThreshold属性设置并返回要接收的字符数。nNewValue说明在产生OnComm事件之前要接收的字符数。当接收字符后,若RThreshold属性设置为0,则不产生OnComm事件。否则该属性为一阈值,当接收缓冲区内字节数达到或超过该值后就会产生OnComm事件。5) CTSHolding属性void SetCTSHolding(BOOL bNewValue)BOOL GetCTSHolding() 该属性确定是否可通过查询Clear to Send(CTS)线的状态发送数据。该属性在设计时无效,在运行时为只读。 如果Clear To Send线为低电平(CTSHolding=FALSE)并且超时时,MSComm控件设置CommEvent属性为comEventCTSTO并产生OnComm事件。Clear To Send线用于RTS/CTS硬件握手。6) SThreshold属性void SetSThreshold(short nNewValue);short GetSThreshold();MSComm控件设置CommEvent属性为comEvSend并产生OnComm之前,设置并返回传输缓冲区中允许的最小字符数。NNewValue代表在OnComm事件产生之前在传输缓冲区中的最小字符数。若SThreshold属性设置为0,数据传输事件不会产生OnComm事件。若SThreshold属性设置为1,当传输缓冲区完全空时,MSComm控件产生OnComm事件。7) InputMode属性void SetInputMode(long nNewValue);long GetInputMode();该属性用于设置或返回传输数据的类型。设定值值描述ComInputModeText(缺省)0通过Input属性以文本方式取回数据ComInputModeBinary1通过Input属性以二进制方式取回数据8) InputLen属性void SetInputLen(short nNewValue);short GetInputLen();该属性用于设置并返回Input属性从接收缓冲区读取的字符数。当设置InputLen为0时,使用Input将使MSComm控件读取接收缓冲区中全部的内容。若接收缓冲区中InputLen字符无效,Input属性返回一个零长度字符串。在使用Input前,用户可以选择检查InBufferCount属性来确定缓冲区中是否已有需要数目的字符。该属性在从输出格式为定长数据的机器读取数据时非常有用。9) InBuffersize属性void SetInBufferSize(short nNewValue);short GetInBufferSize();该属性用于设置或返回输入缓冲区的大小,默认值为1024字节。10)InBufferCount属性void SetInBufferCount (short nNewValue);short GetInBufferCount ();该属性用于返回输入缓冲区内的等待读取的字节个数,可以通过该属性值为0来清除接收缓冲区。11)Input属性VARIANT GetInput();Input属性表示从接收缓冲区移走一串字符,将缓冲区中收到的数据读入变量。该属性在端口未打开时不可用,在运行时是只读的。注:当InputMode属性值为0时,变量中含String型数据。当InputMode属性值为1时,变量中含Byte型数据。12)PortOpen属性void SetPortOpen(BOOL bNewValue);BOOL GetPortOpen(); 该属性用于打开或关闭端口。如果bNewValue设为True,可以打开端口;否则关闭端口。一般情况下在程序开始时打开端口,在程序结束时关闭端口。当应用程序终止时,MSComm控件将自动关闭串口。在打开端口前,确定CommPort属性设置为正确的端口号。13)OutBuffersize属性void SetOutBufferSize(short nNewValue);short GetOutBufferSize();该属性用于设置或返回发送缓冲区的大小,表示传输缓冲区的字节数,默认值为512字节。对发送缓冲区的设置越大,应用程序可使用的内存就越少。如发送缓冲区太小,缓冲区将会溢出,除非使用握手协议。14)OutBufferCounter属性该属性用于返回发送缓冲区内等待发送的字节数,可用来清空发送缓冲区。15)OutPut属性void SetOutPut(const VARIANT& newValue);该属性用于向发送缓冲区写数据流。该属性在端口未打开时不可用,在运行时只写。注:该属性可发送文本数据或二进制数据。传输文本数据时,应将字符型数据放入variant型变量中;传输二进制数据时,应将字节型数据放入variant型变量中。如果通常给应用程序发送ANSI字符串,可以文本方式发送。如果数据包含了内嵌控制字符、NULL字符等,必须将其作为二进制传递过去。16)CommEvent属性short GetCommEvent();如果在通信过程中发生错误或事件,将引发OnComm事件并改变其属性值。CommEvent属性值反映错误或事件类型,通信程序的设计中可根据该属性值执行不同的操作。该属性在端口未打开时不可用,在运行时是只读的。通信错误设定值设定值值描述comEventBreak1001接收到中断信号comEventCTSTO1002Clear-to-send超时comEventDSRTO1003Data-set ready超时comEventFrame1004帧错误,硬件检测到一个帧出错,当双方设置的格式不一致时,就会引发此错误。comEventOverrun1006端口超速。一个字符没有在下一个字符到达之前被硬件读取,该字符丢失。comEventCDTO1007Carrier detect超时comEventRxOver1008接收缓冲区溢出comEventRxParity1009奇偶校验错误comEventTxFull1010传输缓冲区溢出,表明输出缓冲区已满,不能再将字符排入输出缓冲区comEventDCB1011检测索端口、设备控制块(DCB)时的意外错误通信事件设定值设定值值描述comEvSend1发送事件。发送缓冲区的内容少于SThreshold指定的值comEvReceive2接收事件。接收缓冲区内字符数达到RThreshold值,该事件在缓冲区内数据被移走前将持续产生,利用此事件可编写接收数据的过程comEvCTS3Clear-to-send线变化comEvDSR4Data-set-ready线变化comEvCD5Carrier detect线变化comEvRing6振铃检测comEvEOF7文件结束。接收数据中出现文件结束字符。17)DTREnable属性void SetDTREnable(BOOL bNewValue);BOOL GetDTREnable(); 该属性确定在通信时是否使DTR线有效,DTR是计算机发送到调制解调器的信号,表明计算机在等待数据传输。18)RTSEnalbe属性void SetRTSEnable(BOOL bNewValue);BOOL GetRTSEnable(); 该属性确定是否使RTS线有效,一般情况下,由计算机发送RTS信号到连接的调制解调器,请求允许发送数据。19)EOFEnable属性void SetEOFEnable(BOOL bNewValue);BOOL GetEOFEnable(); 该属性确定在输入过程中MSComm控件是否寻找文件结尾字符。当bNewValue为TRUE时,EOF字符找到时OnComm事件被激活。20)CDHolding属性void SetCDHolding (BOOL bNewValue);BOOL GetCDHolding (); 通过查询CD线的状态确定当前是否有传输。Carrier Detect是从调制解调器发送到相联计算机的一个信号,指示调制解调器正在联机。该属性在设计时无效,在运行时为只读。21)DSRHolding属性void SetDSRHolding (BOOL bNewValue);BOOL GetDSRHolding ();确定DSR线的状态。Data Set Ready信号由调制解调器发送到相连计算机,指示作好操作准备。该属性在设计时无效,在运行时为只读。利用MSComm控件编写的应用程序在通信时如果发生错误或事件,将会引发OnComm事件并且改变其属性值,通过GetCommEvent()可获得OnComm产生事件或错误的代码。在通信程序设计中可根据CommEvent属性值来执行不同的操作。MSComm控件所能捕捉的错误值描述380无效属性值comInvalidPropertyValue383属性为只读comSetNotSupported394属性为只读comGetNotSupported8000端口打开时操作不合法comPortOpen8001超时值必须大于08002无效端口号comPortInvalid8003属性只在运行时有效8004属性在运行时为只读8005端口已经打开comPortAlreadyOpen8006设备标识符无效或不支持该标识符8007不支持设备的数据传输速率8008指定的字节大小无效8009缺省参数错误8010硬件不可用(被其他设备锁定)8011函数不能分配队列8012设备没有打开comNoOpen8013设备已经打开8014不能使用comm通知8015不能设置comm状态comSetCommStateFailed8016不能设置comm事件屏蔽8018仅当端口打开时操作才有效comPortNotOpen8019设备忙8020读comm设备错误comReadError8021为该端口检索设备控制块时的内部错误comDCBErrorMSComm控件串口编程基本流程1、在当前Project中插入MSComm控件打开“Project-Add to Project-Componets and Controls-Registered ActiveX Controls”菜单选择Components:Microsoft Communications Control,version 6.0命令插入到当前的Project中。结果就添加了类CMSComm。类CMSComm的相关文件mscomm.h和mscomm.cpp也一并加入Project中。2、初始化并打开串口1) 设定通信端口号,即CommPort属性;2) 设定通信协议,即HandShaking属性;3) 设定传输速率等参数,即Settings属性;4) 设定其他参数,有必要时再加上其他的属性设定;5) 打开通信端口,即将PortOpen属性设为TRUE。3、捕捉串口事项在MainFrm.h中添加:protected:afx_msg void OnCommMscomm();DECLARE_EVENTSINK_MAP()在MainFrm.cpp中添加:BEGIN_EVENTSINK_MAP(CMainFrame,CFrameWnd)ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE)/映射ActiveX控件事件END_EVENTSINK_MAP()4、串口读写使用GetInput()和 SetOutPut()函数即可。5、关闭串口SetPortOpen(FALSE);ASCII控制字符1、逻辑通信控制字符SOH(Start of Heading)STX(Start of Text)ETX(End of Text)EOT(End of Transmission)ENQ(Enquiry)ACK(Acknowledge)DLE(Data Line Escape)NAK(Negative Acknowledge)SYN(Synchronous)EOB(End of Block)2、物理通信控制字符NULL(NULL)DEL(Delete)CAN(Cancel)EM(End of Medium)SUB(Substitute)3、信息分隔符FS(File

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论