《现代微机原理与接口技术接口第8章.ppt》由会员分享,可在线阅读,更多相关《现代微机原理与接口技术接口第8章.ppt(97页珍藏版)》请在三一办公上搜索。
1、1,8.1 串行通信的基本概念,串行通信是将数据的各个位一位一位地,通过单条1位宽的传输线按顺序分时传送,即通信双方一次传输一个二进制位。串行通信与并行通信是两种基本的数据通信方式。,发送方在发送前要将并行数据转成串行数据,接收方接收后要完成串行数据到并行数据的转换。,8.1.1 串行通信,第 8 章 串行接口,2,与并行通信相比,串行通信的优势,传输距离长,可达到数千公里,长距离内串行数据传送速率会比并行数据传送速率快,串行通信的通信时钟频率较并行通信容易提高。,抗干扰能力强,串行通信信号间的互相干扰完全可以忽略。,费用低。,3,8.1.2串行通信方式,单工方式,半双工方式,全双工方式,4,
2、8.1.3 波特率与收/发时钟,波特率:单位时间内传送的二进制数据的位数,以位/秒(b/s)表示,也称为数据位率。它是衡量串行通信速率的重要指标。,收/发时钟直接决定了通信线路上数据传输的速率,对于收/发双方之间数据传输的同步有十分重要的作用。,一般在发送端是由发送时钟的下降沿使送入移位寄存器的数据串行移位输出。而接收端则是在接收时钟的上升沿作用下将传输线上的数据逐位打入移位寄存器。,5,为了提高串行通信的抗干扰能力,往往用多个时钟调制一个二进制数据,调制一个二进制数据的收/发时钟个数称为波特率系数n。,收/发时钟频率与波特率之间的关系:收/发时钟频率=n波特率一般n取1,16,32和64等。
3、对于异步通信,常采用n=16;对于同步通信,则必须取n=1。,6,8.1.4 信号调制解调,原因:如果数字信号直接在公用电话网的传输线上传送,高次谐波的衰减会很厉害,从而使信号到了接收端后将发生严重畸变和失真。,解决:发送方使用调制器(Modulator),把要传送的数字信号调制转换为适合在线路上传输的音频模拟信号;接收方则使用解调器(Demodulator)从线路上测出这个模拟信号,并还原成数字信号。,7,调制方法:按照调制技术的不同分为调频(FM)、调幅(AM)和调相(PM)三种,根据传输数字信号的变化规律去调整载波的频率、幅度或相位,8,8.1.5 信道复用,时分多路复用TDM(Time
4、 Division Multiplexing),就是将一条物理传输线路按时间分成若干时间片轮换地为多个信号所占用,每个时间片由复用的一个信号占用。,频分多路复用FDM(Frequency Division Multiplexing)就是利用频率调制原理,将要同时传送的多个信号进行频谱搬移,使它们互不重叠地占据信道频带的不同频率段,然后经发送器从同一信道上同时或不同时地发送出去。,计算机串行数据通信及其接口中使用时分多路复用系统。,9,8.1.6 串行通信基本方式,异步串行通信 在通信的数据流中,字符间异步,字符内部各位间同步。异步通信方式的“异步”主要体现在字符与字符之间通信没有严格的定时要求
5、。然而,一旦传送开始,收/发双方则以预先约定的传输速率,在时钟的作用下,传送这个字符中的每一位。,10,同步串行通信 数据流中的字符与字符之间和字符内部的位与位之间都同步。同步串行通信是以数据块(字符块)为信息单位传送,而每帧信息包括成百上千个字符,因此传送一旦开始,要求每帧信息内部的每一位都要同步。,11,8.2异步串行通信协议,12,为了确保异步串行通信传输正确:,1)采用相反极性的起始位和停止位/空闲位提供准确的时间基准,2)接收器在每位的中心采样,以获得最大的收/发时钟频率偏差容限,3)接收器采用比传送波特率更高频率的时钟来控制采样时间,以提高采样的分辨能力和抗干扰能力。,13,例题:
6、异步传输7位ASCII码,如果需要数据传输速率为240字符/秒,使用1位奇偶校验位和1位停止位,则:1)波特率应该是多少?2)有效数据位传输位是多少?3)传输效率是多少?,答:1)波特率是(7位数据位+1位起始位+1位校验位+1位停止位)240=2400b/s2)有效数据位传输位是:7240=1680b/s3)传输效率是:1680/2400=70%,14,8.3 串行接口RS-232C标准,8.3.1 串行通信系统,数据终端设备DTE数据源和目的地,数据通信设备DCE使数据符合线路要求,15,8.3.2 常用的RS-232C信号线,16,8.3.3 常用的RS-232C连接,1.使用MODEM
7、,17,2.不使用MODEM,18,3.简单连接,4.最简单连接,19,8.3.4 电气特性,1.应保证电平在(515)V之间,对于数据线:逻辑“1”(MARK)=-3V-15V,逻辑“0”(SPACE)=+3V+15V对于控制信号:接通状态(ON)即信号有效的电平=+3V15V断开状态(OUT)即信号无效的电平=-3-15V。,20,2.必须进行电平转换,RS-232C接口采用的是负逻辑,其逻辑电平与TTL电平不一样,不能兼容。因此,为了实现与TTL电路的连接,必须进行电平转换。目前可以使用新型电平转换芯片MAX232和MAX232A(高速)双组RS-232C发送/接收器,实现TTL电平与R
8、S-232C电平双向转换。,21,3.必须抗共模噪声干扰,RS-232C由于在发送器与接收器之间有公共信号地,不可能使用双端信号,因此共模噪声很容易引入信号系统中,且噪声幅度可高达好几伏,这是迫使RS-232C使用较高传输电压的主要原因。另一个原因是为了补偿传输线上的信号衰减和沿线附加电平的影响。,22,4.处理好最大传输速率和最大传输线长度的关系,一般应用情况下,RS-232C的最高传输速率为20Kb/s,最大传输线长度为30m。,23,8.3.4 机械特性,1.连接器,24,25,在通信速率低于20Kb/s时,RS-232C所能直接连接的最大物理距离为15m(50ft)。,2.电缆长度,使
9、用特制的低电容电缆也能有效地提高电缆长度,可以达到150m(500ft)甚至更多。,RS-232C规定,若不使用MODEM,则码元的畸变要小于4%,驱动器的负载电容应该小于2500pF,则单位(1ft)长度的电容值为NpF的电缆的长度应该是:,26,8.4 异步通信适配器,PC微机异步通信适配器是微机与微机、微机与MODEM及微机与外设之间进行异步通信的接口。其核心是UART。,常见的UART主要有INS8250、PC16450和PC16550。此外,还有带更大缓冲的UART,称为PC16650和PC16750。,27,8.4.1 INS8250外部引脚,28,1.并行数据I/O及其控制线,D
10、7D0 8位双向三态数据线。,A0,A1和A2 内部寄存器选择。,CSOUT 片选输出。(为高表示该片被选中),DDIS 驱动器禁止。(禁止处理器和8250在数据线上的收发器动作),29,2.串行数据I/O线,SOUT 串行数据输出。,SIN 串行数据输入。,XTAL1 外部时钟输入端。,XTAL2 基准时钟信号输出端。,F工作时钟=F基准时钟除数寄存器=传送波特率16,30,3.和MODEM的握手信号线,31,4.中断请求,复位输入及其他信号线,INTPRT 中断请求输出。,MR 主复位输入。,32,UART内部结构,33,DLAB是线路控制寄存器的D7位。,34,1.线路控制寄存器LCR,
11、D7 D6 D5 D4 D3 D2 D1 D0,WLS0,WLS1,PEN,STB,EPS,SP,SB,DLAB,字符长度选择005位016位107位118位,停止位选择01位11.5位(D1D0=00)2位(D1D000),11偶校验01奇校验,附加奇偶标志位选择0不附加1附加1位,中止设置1中止0正常,除数寄存器访问允许0禁止1允许,A2A1A0=011,35,2.线路状态寄存器LSR,D7 D6 D5 D4 D3 D2 D1 D0,DR,OE,FE,PE,BI,THRE,TSRE,接收缓冲区满,接收重叠错,接收奇偶错,接收格式错(无正确的停止位),中止识别标志,发送保持器空,发送移位器空
12、,FIFO中接收数据错误(16550),A2A1A0=101,36,3.发送保持寄存器THR 接收缓冲寄存器RBR,D7 D0,CPU来的8位数据并行进THR,THR,低位到高位串行移位到SOUT引脚输出,D7 D0,接收移位寄存器,发送移位寄存器,RBR,低位到高位从SIN引脚串行移位进来,8位数据并行进CPU,发送方,接收方,DLAB=0,A2A1A0=000,37,4.波特率除数锁存器,这是一个软件控制的分频器,输出的工作时钟频率为16倍的波特率。,除数寄存器值=基准时钟频率(16波特率),INS8250芯片输入的基准时钟频率为1.8432MHz,若波特率为4800b/s,则波特率除数为
13、0018H,DLH中应填00H,DLL中应填18H。,思考题:使用INS8250异步传输7位ASCII码,如果需要数据传输速率为240字符/秒,使用1位奇偶校验位和1位停止位,波特率除数锁存器的值是多少?,注意:PC16550的基准时钟一般为18.432MHz。,DLAB=1,A2A1A0=001(高)或000(低),38,5.中断识别寄存器IIR,D7 D6 D5 D4 D3 D2 D1 D0,IP,ID1,ID2,0,未决中断指示0-有1-无,中断类型标识,超时中断0-不超时1-超时,允许64字节FIFO(16750)0-禁止1-允许,FIFO使用指示(16550)01-允许FIFO但不可
14、用11-允许FIFO,A2A1A0=010(读),39,40,6.中断允许寄存器IER,D7 D6 D5 D4 D3 D2 D1 D0,I2E,I1E,I3E,0,类型2中断(接收缓冲器满)1-允许0-屏蔽,类型1中断(发送保持器空)1-允许0-屏蔽,类型3中断(接收出错)1-允许0-屏蔽,进入低功耗模式(16550),进入睡眠模式(16750),DLAB=0,A2A1A0=001,I0E,0,类型0中断(MODEM状态改变)1-运行0-屏蔽,41,7.MODEM控制寄存器MCR,A2A1A0=100,D7 D6 D5 D4 D3 D2 D1 D0,DTR,RTS,OUT1,0,数据终端就绪,
15、请求发送,辅助输出1,自动流量控制(16750),环路检测(内部自循环),OUT2,0,辅助输出2,PC用做中断,LOOP,注意这里的OUTi位极性和OUTi引脚相反。,42,8.MODEM状态寄存器MSR,A2A1A0=110,D7 D6 D5 D4 D3 D2 D1 D0,CTS,DSR,TERI,RLSD,CTS位发生改变,DSR位发生改变,收到“振铃指示”后沿(下降沿),收到“数传机就绪”,收到“清除发送”,RLSD,RI,RLSD位发生改变,CTS,DSR,收到“振铃指示”,收到“接收线载波检测”,43,9.FIFO控制寄存器(FCR),A2A1A0=010(写)16550后才有,D
16、7 D6 D5 D4 D3 D2 D1 D0,允许FIFO缓冲器工作,清除接收FIFO缓冲器,清除发送FIFO缓冲器,允许64字节FIFO(16750),保留,DMA方式选择,接收端中断触发器水平(LSB),接收端中断触发器水平(MSB),44,触发器水平即是指示在中断产生之前,接收缓冲器应该装满多少个字节。,45,常用UART比较,46,8.4.3 采用UART的异步通信适配器硬件逻辑,1.PC机的串行口,47,2.PC机的串行口电路,48,815芯片组中串口电平转换电路,49,8.4.4 INS8250初始化,通过写除数寄存器(端口0和端口1)设置波特率,通过写线路控制寄存器(端口3)设置
17、通信数据格式。,通过写MODEM控制寄存器MCR(端口4)设置MODEM控制字。,通过写中断允许寄存器(端口1)设置中断允许控制字。,50,movdx,3fbh;线路控制寄存器地址moval,80houtdx,al;使DLAB=1,以便下面写除数;寄存器movdx,3f8h;低位除数寄存器moval,0ch;9600波特率的除数低8位outdx,almoval,00incdx;高位除数寄存器outdx,al,51,mov al,00011011b;偶校验、1位停止位;8位数据位mov dx,3fbh;线路控制寄存器地址out dx,almov al,03h;mov dx,3fch;MODEM控
18、制寄存器地址out dx,almov al,0;禁止中断mov dx,3f9h;中断允许寄存器地址out dx,al,52,8.4.5 查询方式串行通信程序设计,1.查询方式发送,初始化8250,读LSR,D5=1?,发送一个字符,发完?,结束,Y,Y,N,N,53,2.查询方式接收,初始化8250,读LSR,D0=1?,接收一个字符,收完?,结束,Y,Y,N,N,有错?,N,Y,错误处理,54,1.通信中断初始化,8.4.6 中断方式串行通信程序设计,修改中断向量,按使用的端口COM1或COM2,接管中断0CH或中断0BH。确定INS8250操作方式,设置中断允许寄存器相应位的允许或禁止,并
19、允许中断操作(置MCR的D3=1)。确定起止式通信协议,设置通信波特率及数据帧传输格式。开放通信中断,对8259A中断控制器的屏蔽寄存器编程(OCW1),允许中断IRQ4或IRQ3。,55,2.通信中断服务程序,首先读取中断识别寄存器,判断中断源,然后转向对应的处理子程序。判断中断源,应该按照中断优先级别次序进行。当中断识别寄存器D2D1=11时,表明接收出错中断,需要再读取线路状态寄存器,分析错误原因,再进行错误处理。,可能出现多个中断源同时引发中断。因此,每处理完一种中断源后,应继续读取中断识别寄存器,检测D0是否为“0”,当D0=0时,表明还有未决中断,应该继续分析中断源并进行中断处理。
20、从中断程序返回的条件是中断识别寄存器的D0=1。,56,8.5 Win32串口编程,8.5.1 Win32串口编程方法,以文件方式打开串口使用Win32 API中文件操作的有关函数来完成对串口的访问。使用现有的ActiveX控件实现现在一般使用的是微软公司的MSComm控件,它是作为一个ocx来提供的。直接嵌入汇编法这种方法只能用在Windows 98和Windows 95操作系统下。在嵌入式汇编中,可直接对串口进行操作。,57,(1)应用CreateFile()来打开串口HANDLE CreateFile(LPCTSTR lpFileName,/文件名 DWORD dwDesiredAcce
21、ss,/存取模式 DWORD dwShareMode,/共享模式 LPSECURITY_ATTRIBUTES lpSecurityAttributes,/NULL DWORD dwCreationDisposition,/创建方法 DWORD dwFlagsAndAttributes,/文件属性和标志 HANDLE hTemplateFile/临时文件句柄);其中,lpFileName指定要打开的串口逻辑名,用字符串表示,“COM1”表示串口1,“COM2”表示串口2。由于串口是硬件,所以dwCreationDisposition一般为OPEN_EXISTING。,8.5.2以文件方式打开串口
22、法,58,(2)初始化串口BOOL SetupComm(HANDLE hFile,/通信设备句柄DWORD dwInQueue,/输入缓冲区大小 DWORD dwOutQueue/输出缓冲区大小);,(3)关闭窗口BOOL CloseHandle(HANDLE hObject/需要关闭的设备句柄);,59,(4)串口配置BOOL GetCommState(HANDLE hFile,/通信设备句柄LPDCB lpDCB/设备控制块);BOOL SetCommState(HANDLE hFile,/通信设备句柄LPDCB lpDCB/设备控制块);,60,61,(5)串口属性BOOL GetCom
23、mProperties(HANDLE hFile,/通信设备句柄 LPCOMMPROP lpCommProp/通信属性结构);,62,(6)读串口操作BOOL ReadFile(HANDLE hFile,/设备句柄 LPVOID lpBuffer,/数据缓冲 DWORD nNumberOfBytesToRead,/读取的字节数 LPDWORD lpNumberOfBytesRead,/实际读的字节数 LPOVERLAPPED lpOverlapped/overlapped结构);,(7)写串口操作BOOL WriteFile(HANDLE hFile,/设备句柄 LPVOID lpBuffer
24、,/数据缓冲 DWORD nNumberOfBytesToWrite,/写的字节数 LPDWORD lpNumberOfBytesWrite,/实际写的字节数 LPOVERLAPPED lpOverlapped/overlapped结构);,63,(8)异步I/O操作异步(重叠)I/O操作是指应用程序可以在后台读或写数据,而在前台做其他事情。要异步操作,需要使用,这首先要CreateFile()函数的dwFlagAndAttributes参数中使用FILE_FLAG_OVERLAPPED标识,读写串口必须指定OVERLAPPED结构:typedef struct _OVERLAPPED ULO
25、NG_PTR Internal;/操作系统保留ULONG_PTR InternalHigh;/操作系统保留 DWORD Offset;/文件传输的初始位置DWORD OffsetHigh;/文件传输的高位字HANDLE hEvent;/I/O操作完成后触发的事件 OVERLAPPED;,64,异步I/O操作可以用GetOverlappedResult()函数来获得结果BOOL GetOverlappedResult(HANDLE hFile,/设备句柄 LPOVERLAPPED lpOverlapped,/overlapped结构 LPDWORD lpNumberOfBytesTransfer
26、red,/传送的字节数 BOOL bWait/指定函数是否等待挂起的异步操作完成);异步I/O的时候,Windows可以用WaitForSingleObject()函数来检查事件对象。DWORD WaitForSingleObject(HANDLE hHandle,/对象句柄 DWORD dwMilliseconds/内部超时时间);,65,(9)超时设置异步(重叠)I/O操作读写串口引入超时结构,在超时时间到的时候,如果读写还没结束,则读写会强行终止。异步时,强行终止的读写动作实际传输的字符数在OVERLAPPED结构中返回。超时结构如下:typedef struct _COMMTIMEOU
27、TS DWORD ReadIntervalTimeout;/两字符间的最大时间间隔DWORD ReadTotalTimeoutMultiplier;/计算读操作总超时的超时系数DWORD ReadTotalTimeoutConstant;/计算读操作总超时的超时常数DWORD WriteTotalTimeoutMultiplier;/计算写操作总超时的超时系数DWORD WriteTotalTimeoutConstant;/计算写操作总超时的超时常数 COMMTIMEOUTS,*LPCOMMTIMEOUTS;,66,总超时计算公式是:总超时超时系数读或写字节数超时常数BOOL SetCommT
28、imeouts(HANDLE hFile,/通信设备句柄 LPCOMMTIMEOUTS lpCommTimeouts/超时结构);BOOL GetCommTimeouts(HANDLE hFile,/通信设备句柄 LPCOMMTIMEOUTS lpCommTimeouts/超时结构);,67,(10)通信状态和通信错误如果串口发生奇偶错误等错误的时候,I/O操作会终止。如果程序要继续执行I/O操作,就需要调用ClearCommError()函数,该函数清除错误条件,并确定串口的通信状态:BOOL ClearCommError(HANDLE hFile,/通信设备句柄 LPDWORD lpErr
29、ors,/错误代码 LPCOMSTAT lpStat/communications结构);,68,错误代码,69,typedef struct _COMSTAT DWORD fCtsHold:1;/是否等待CTS信号DWORD fDsrHold:1;/是否等待DSR信号DWORD fRlsdHold:1;/是否等待RLSD信号DWORD fXoffHold:1;/收到XOFF字符后发送是否等待DWORD fXoffSent:1;/发送完XOFF字符后发送是否等待DWORD fEof:1;/EOF字符送出DWORD fTxim:1;/字符是否正等待被发送DWORD fReserved:25;/系
30、统保留DWORD cbInQue;/串口接收的字符数DWORD cbOutQue;/串口发送的字符数 COMSTAT,*LPCOMSTAT;,70,(11)通信事件Windows有以下的通信事件:,71,应用程序可用SetCommMask()函数来建立事件掩模来监视指定通信资源上的事件。BOOL SetCommMask(HANDLE hFile,/通信设备句柄DWORD dwEvtMask/事件掩模);,72,在用SetCommMask()指定了有用的事件后,应用程序就调用WaitCommEvent()函数来等带其中的一个事件发生。BOOL WaitCommEvent(HANDLE hFile
31、,/设备句柄 LPDWORD lpEvtMask,/事件类型 LPOVERLAPPED lpOverlapped,/overlapped结构);,73,举例:,在中MainFrm.cpp定义全局变量HANDLEhCom;/准备打开的串口的句柄HANDLEhCommWatchThread;/辅助线程的全局函数,打开串口,设置串口hCom=CreateFile(“COM2”,GENERIC_READ|GENERIC_WRITE,/允许读写0,/此项必须为0NULL,/no security attrsOPEN_EXISTING,/设置产生方式FILE_FLAG_OVERLAPPED,/使用异步通信
32、NULL);if(hCom=INVALID_HANDLE_VALUE)dwError=GetLastError();/处理错误,74,/检测打开串口操作是否成功ASSERT(hCom!=INVALID_HANDLE_VALUE);/设置事件驱动的类型SetCommMask(hCom,EV_RXCHAR|EV_TXEMPTY);/设置输入、输出缓冲区的大小SetupComm(hCom,1024,512);/清干净输入、输出缓冲区PurgeComm(hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);/定义超时结构,填写该结构
33、,并设置超时COMMTIMEOUTS TimeOuts;TimeOuts.ReadIntervalTimeouts=1000;TimeOuts.ReadTotalTimeMultiolier=500;TimeOuts.ReadTotalTimeConstant=5000;TimeOuts.WriteTotalTimeMultiolier=500;TimeOuts.WriteTotalTimeConstant=5000;SetCommTimerouts(hCom,75,DCBdcb;/定义数据控制块结构GetCommState(hCom,/串口参数配置/上述的COMMTIMEOUTS结构和DCB
34、都很重要,实际工作中需要仔细选择参数。,76,启动一个辅助线程,用于串口事件的处理。Win32提供了两种线程,辅助线程和用户界面线程。区别在于:辅助线程没有窗口,所以它没有自己的消息循环。但是辅助线程很容易编程,通常也很有用。其次,我们使用辅助线程,主要用它来监视串口状态,看有无数据到达、通信有无错误;而主线程则可专心进行数据处理、提供友好的用户界面等重要的工作。hCommWatchThread=CreateThread(LPSECURITY_ATTRIBUTES)NULL,/安全属性0,/初始化线程栈的大小,缺省为与主线程大小相同(LPTHREAD_START_ROUTINE)CommWat
35、chProc,/线程的全局函数GetSafeHwnd(),/此处传入了主框架的句柄 0,77,为辅助线程写一个全局函数,主要完成数据接收的工作。注意OVERLAPPED结构的使用,以及怎样实现了异步通信。UINT CommWatchProc(HWND hSendWnd)DWORD dwEvtMask=0;/设置要监视的事件SetCommMask(hCom,EV_RXCHAR|EV_TXEMPTY);/等待串口通信事件的发生 WaitCommEvent(hCom,/输入缓冲区有多少数据?,78,if(dwLength 0)BOOL fReadStat;fReadStat=ReadFile(hCo
36、m,lpBuffer,dwLength,/读数据/注:在CreareFile()时使用了FILE_FLAG_OVERLAPPED,现在ReadFile()也必须使用LPOVERLAPPED结构.否则,函数会不正确地报告读操作已完成了.使用LPOVERLAPPED结构,ReadFile()立即返回,不必等待读操作完成,实现异步通信.此时,ReadFile()返回FALSE,GetLastError()返回ERROR_IO_PENDING.,79,if(!fReadStat)if(GetLastError()=ERROR_IO_PENDING)while(!GetOverlappedResult(
37、hCom,/通知主线程,串口收到数据,80,在主线程中放入发送命令。BOOLfWriteStat;char szBuffercount;/准备好发送的数据,放在szBuffer中fWriteStat=WriteFile(hCom,szBuffer,dwBytesToWrite,/写数据,81,int err=GetLastError();if(!fWriteStat)if(GetLastError()=ERROR_IO_PENDING)while(!GetOverlappedResult(hCom,.,82,8.5.3使用MSComm控件进行串口编程,在当前Project中插入MSComm控件
38、,83,84,85,86,87,88,89,90,91,92,93,在MainFrm.h中加入MSComm控件:protected:CMSComm m_ComPort;在Mainfrm.cpp:OnCreare()中:DWORD style=WS_VISIBLE|WS_CHILD;if(!m_ComPort.Create(NULL,style,CRect(0,0,0,0),this,ID_COMMCTRL)TRACE0(Failed to create OLE Communications Controln);return-1;/fail to create,94,.初始化串口m_ComPor
39、t.SetCommPort(1);/选择COM?m_ComPort.SetInBufferSize(1024);/设置输入缓冲区的字节数m_ComPort.SetOutBufferSize(512);/设置输入缓冲区的字节数if(!m_ComPort.GetPortOpen()/打开串口m_ComPort.SetPortOpen(TRUE);m_ComPort.SetInputMode(1);/设置输入方式为二进制方式m_ComPort.SetSettings(9600,n,8,1);/设置波特率等参数m_ComPort.SetRThreshold(1);/为1表示有一个字符引发一个事件m_C
40、omPort.SetInputLen(0);,95,捕捉串口事项。MSComm控件可以采用轮询或事件驱动的方法从端口获取数据。下面介绍事件驱动方法:有事件(如接收到数据)时通知程序。在程序中需要捕获并处理这些通讯事件。在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)/映射Acti
41、veX控件事件END_EVENTSINK_MAP(),96,串口读。void CMainFrame:OnCommMscomm()VARIANT vResponse;int k;if(m_commCtrl.GetCommEvent()=2)k=m_commCtrl.GetInBufferCount();/接收到的字符数目if(k0)vResponse=m_commCtrl.GetInput();/读SaveData(k,(unsigned char*)vResponse.parray-pvData);/接收到字符,MSComm控件发送事件/处理其他MSComm控件,97,串口写。void CMainFrame:OnCommSend()/准备需要发送的命令,放在TxData中CByteArray array;array.RemoveAll();array.SetSize(Count);for(i=0;iCount;i+)array.SetAt(i,TxDatai);m_ComPort.SetOutput(COleVariant(array);/发送数据,
链接地址:https://www.31ppt.com/p-5789750.html