您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于C语言的RS232串行接口通信实现
基于C语言的RS232串行接口通信实现发布:2013-04-02|作者:--|来源:--|查看:212次|用户关注:0前言串行通信在通讯领域被广泛应用,标准的RS232接口已成为计算机、外设、交换机和许多通讯设备的标准接口。虽然近年来随着USB口的日趋流行,RS232接口串口作为一种传统的串口通信口有被取代的趋势。然而由于它具有较高的性价比和传输的可靠性Ⅲ。在传输速率要求不是很高的情况下,串口通信仍然具有其自身的优势。同时RS232标准广泛应用于微型计算机系统和大型系统中,RS232标准还具有连线简单、通0前言串行通信在通讯领域被广泛应用,标准的RS232接口已成为计算机、外设、交换机和许多通讯设备的标准接口。虽然近年来随着USB口的日趋流行,RS232接口串口作为一种传统的串口通信口有被取代的趋势。然而由于它具有较高的性价比和传输的可靠性Ⅲ。在传输速率要求不是很高的情况下,串口通信仍然具有其自身的优势。同时RS232标准广泛应用于微型计算机系统和大型系统中,RS232标准还具有连线简单、通讯距离长等优点,本文将着熏介绍串口通信的连接方式以及利用C语言编程实现串口通讯,最后以实际的工程项目应用,验证了该通讯方式的可靠性。1RS232串行接口1.1RS232接口简介RS232串行接口属于个人计算机(PC)及电信应用领域中最为成功的串行数据标准。它被定义为一种在低速率串行通信中增加通信距离的单端标准,是目前PC机与通信工业中应用最广泛的一种串行接口嗍。现在的Pc机一般至少有两个串行口COMI和COM2.新一代的汁算机主要以9引脚的D型接头接出所有的RS232通信信号及控制线(有的计算机的COM2仍为25引脚)。1.2RS232串口引脚说明(见表1)表1引脚缩写功能说明1.3串口连接器的连接方式串口连接器是两个串行接口的连接器,RS232串口存在9针和25针两种形式,根据连接的针数,串口通信连接方式主要分为:1)无握手连接方式;2)全握手连接方式;3)循环握手回送方式。本文开发的软件运行在全握手连接方式下,该连接方式如表2所示。表2全握手连接2C语言串口通信软件实现2.1测试中的硬件设备。2.1.1单机测试方式如果单机仅仅拥有一个RS232串口,可将RS232连接线的第2引脚(RD)与第3引脚(TD)短路,那么由第3引脚的输出信号就会被发送到第2引脚而送到同一串行端}1的输入缓冲区,即可将数据读入,进入测试过程。如果单机拥有COMl和COM2口两个RS232串口,那么请选择13节表2中的串口连接方式,进入测试过程。2.1.2近距离两台设备通信测试方式如果要在两台PC计算机之间,一台嵌入式系统主控机和一台PC计算机之间,或者上位机和下位机之间进行串口通信,那么请选择1.3节表2中的RS232串口方式连接两台设备,进入测试过程。2.1.3远距离两台通信测试方式RS232标准规定,若不使用Modem,在码元畸变小于4%的情况下,Dte和DCE通信两端之间最大传输距离为15m.若距离较远,须附加调制解调器(Modem)。其连接方式如图1所示。图1远距离串口通信连接方式2.2C语言的串口通信软件实现2.2.1串口通信软件流程图图2数据通信的流程图2.2.2C语言函数具体实现串口通信软件过程由于I/O串行通信口的速度远远低于CPU的速度,在查询工作方式时,CPU长时间处于等待状态,其效率非常低,不利于CPU的资源利用。解决这一矛盾的有效办法是采取中断的通信方式,即当通信口自身准备就绪时,主动提出中断申请,一旦CPU响应此申请,便暂停执行的工作,转向中断服务子程序,与外设进行数据的交换,数据交换完成后返回到主程序中的断点继续执行未完成的任务,这样就避免了CPU资源的浪费㈨。为此必须对异步通信适配器以及中断控制器进行控制。作为系统的外设,异步通信适配器和中断控制器都有其对应的I/O口地址,所以本文采用C语言函数库中的寻址函数outportb()和函数inportb()对上述芯片进行直接读写操作。其控制包括对中断控制器地址的编程,允许IRQ3,IRQ4中断,同时置MODEM控制寄存器地址为有效,这样即可实现中断方式的通信。根据图2的串口通信流程图,其具体实现串口通信的过程如下:1)初始化串口函数。参数说明:ComPortAddr串口端口地址(coMl口是03F8HCOM2口是02F8H)IntVectNum中断处理号(一般选择0X0b)Baud波特率Data数据位STop停止位Parity奇偶校验位voidInit-COM(intComPortAddr,unsignedcharIntVectNum,imBaud,unsignedcharData,unsignedcharStop,unsignedcharParity){unsignedcharHigh,Low;intf.comportaddr=ComPortAddr;intvectnum=IntVectNum;CharslnBuf=0;Circln=0;CircOut=0;/*setbaudrate设置波特率*/f=(Baud/100):f=1152/t;High=f/256;Low=f-High*256;outportb(ComPortAddr+3,0x80);outportb(ComPortAddr,LOW);outportb(ComPortAddr+l,High);/*setdatabits,stopbits,andparity设置数据位。停止位。校验*/Data=(Data-5)|((Stop-1)*4);if(Parity=2)Data=Data|0x18;elseif(Parity==1)Data=Data|0x8;outportb(ComPortAddr+3,Data);/*setMCR(DTR,RTS=0,OUTl,OUT2=1)设置MODEM控制位*/outportb(ComPortAddr+4,0xob);/*setinputdatareadyinterruptmode设置输入数据中断模式*/outportb(ComPortAddr+1,Ox01);/*setOCinterruptvector设置中断源*/disable();OldAsyncInt=getvect(IntVectNum);setvect(ImVectNum,AsyncInt);enable();/*openinterrupt打开中断*/maskb=inp(Port8259+1);if(IntVectNum一0x0c)outport(Port8259+1,maskb&Oxef);/*INT4*/elseoutport(Port8259+1,maskb&0xf7);/*INT3*/}2)握手信号控制。该函数引入递归调用的方式,很好的解决了以往串口通信过程中,在握手信号方面选择发送指定特定字符(例如样)所带来的误传送问题,大大提高了串口通信的成功率。voidwait(charch){if(ReceiveChar(COM232)==ch)return;//确定对方已经成功接受或者发送,就返回空else{SendChar(ch);//把接受或者发送出去的字符重新发送;wait(ch);//递归调用,直到对方确定接受或者发送成功为止;))3)向串行口发送一个字符该函数的思想是先申请占有中断,后进行发送数据通信;intSendChar(unsignedcharChar){do{printf(sendwaiting)://在屏幕上提示用户正在等待中断进行。}while((inportb(comportaddr+5)&0x20)==O);//检查发送端数据线是否准备好outportb(comportaddr,Char://发送数据到缓冲区return(Char);//返回发送完成的字符}4)从串行口接受一个字符该函数的思想是先取得中断控制,后面进行接收数据通信;intReceiveChar(intport){do{printf(receivewaiting);∥在屏幕上提示用户正在等待中断进行。}while((inportb(eomportaddr+5)&0x01)==0);//检查接收端数据线是否准备好return(inportb(pONt);//从接收数据缓冲区取数据}3实例在企业产品测试平台和嵌入式控制系统之间,约定通信双方的协议相同,首先嵌入式EMB主控机通过串El把控制消息发送给产品测试平台,让产品测试平台根据发送来的指令进行相关操作:同时在产品测试平台上的测试结果信息,测试每个单项目的相关信息也通过串口传输数据到嵌入式EMB主控机;嵌入式EMB主控机把测试相关的有效信息进行整理后,通过网络上传到Server,Server把企业所有生产线的嵌入式EMB主控机发送来的信息进行整理和分析,在企业资源管理系统ERP上共享,让企业的高级管理人员实时监视企业生产的进行情况,大大提高企业的办公效率,其整体工作原理图如图3所示。图3企业生产整体工作原理图4结论本文所阐述的RS232串口通信软件,在具体实践中结合功能需要,综合考虑复杂程度、灵活性等因素,选择了合适的方法,实现了串口通信过程,同时在产品测试平台和嵌入式控制系统之间,该软件得到了充分的应用,有效地提升了企业的生产工作效率。上讲通过讲述用单片机控制一个外部的LED闪烁实验来向读者介绍了单片机的工作原理与开发流程。这一讲将介绍单片机内部非常重要的两个资源——定时/计数器和中断系统。通过该讲,读者可以掌握定时器的工作原理和单片机的中断系统。从而设计定时器计数程序和中断服务程序。一、原理简介首先让我们举闹钟为例,将它定时在一分钟后闹铃,这就需要秒针走一圈(60次)。即一分钟时间转化为秒针走的次数,也就是计数的次数,计数到了60次然后闹铃,而每一次计数的时间是1秒。单片机内部的定时/计数器跟闹钟类似,可以通过编程来设定要定时的时间、定时时间到了进行相应的操作。那么在单片机内部计数一次的时间是多少呢,51单片机输入的时钟脉冲是由晶体振荡器的输出经12分频后得到的,所以定时器也可看作是对计算机机器周期的计数器。因为每个机器周期包含12个振荡周期,故每一个机器周期定时器加1,可以把输入的时钟脉冲看成机器周期信号。故其频率为晶振频率的1/12。如果晶振频率为12MHz,则定时器每接收一个输入脉冲的时间刚好为1μs。在本实验套件中采用的是11.0592M的晶振,故每接收一个输入脉冲的时间约为1.085μs。实现精确定时在实际项目应用中非常重要,因为往往需要用到精确定时一段时间,然后定时时间到的时刻做相应的任务。那如何编程实现定时时间呢?首先先简单介绍下本实验板上单片机(STC89C52)内的定时器资源。STC89C52内有三个定时/计数器,分别为T0、T1和T2。其中T0、T1工作方式一样,一并介绍。T2的工作方式稍有区别,这里不做介绍,实验套件光盘中有实际应用程序。同时,单片机中的定时器和计数器是复用的,计数器是记录外部脉冲的个数,而定时器则是由单片机内部时钟提供的一个非常稳定的计数源。本讲中,以T0、T1作为定时器来进行实例介绍使用。了解了单片机内的定时器资源后,接下来我们来对定时器寄存器进行详细介绍。TMOD(见表1)、TCON(见表3)与定时器T0、定时器T1间通过内部总线及逻辑电路连接,TMOD用于设置定时器的工作方式,TCON用于控制定时器的启动、停止,标志定时器的溢出和中断情况。当设置了定时器的工作方式并启动定时器工作后,定时器就按被设定的工作方式独立工作,不再占用CPU的操作时间,只有在计数器计满溢出时才可能中断CPU当前的操作。表1TMOD寄存器表中各位(从左至右为从高位到低位)含义如下。TMOD的低4位为定时器0的方式字段,高4位为定时器1的方式字段,它们的含义完全相同。M1和M0:工作方式控制位,其定义如表2所示(其中i=0,1)。表2定时器工作方式控制位:功能选择位。=0时,设置为定时器工作方式;=1时,设置为计数器工作
本文标题:基于C语言的RS232串行接口通信实现
链接地址:https://www.777doc.com/doc-2533589 .html