随着计算机技术的快速发展和广泛应用,上位机和下位机的主从工作方式为工业控制及自动控制系统所采用。由于PC机分析能力强、处理速度更快及单片机使用灵活方便等特点,所以一般都将PC机作为上位机,单片机作为下位机,二者通过RS2232或者RS2485接收、发送数据和传送指令。单片机可单独处理数据和控制任务,同时也将数据传送给PC机,由PC机对这些数据进行处理或显示。
本文介绍PC机和单片机通信在一种基于C8051F单片机的波形发生器中的应用,在上位机上显示正弦波的幅值和频率,由上位机发送指令可以改变波形幅度及频率。
1 硬件电路的设计
MCS251 单片机有一个全双工的串行通讯口UART,利用其RXD和TXD与外界进行通信,其内部有2 个物理上完全独立的接收、发送缓冲器SBUF,可同时发送和接收数据。所以单片机和PC机之间可以方便地进行串口通讯。单片机串口有3条引线: TXD (发送数据) 、RXD (接收数据)和GND(信号地) .因此在通信距离较短时可采用零MO2DEM方式,简单三连线结构。IBM2PC机有两个标准的RS2232串行口,其电平采用的是E IA电平,而MCS251单片机的串行通信是由TXD (发送数据)和RXD (接收数据)来进行全双工通信的,它们的电平是TTL电平;为了PC机与MCS251机之间能可靠地进行串行通信,需要用电平转换芯片,我们采用了MAXIM公司生产的专用芯片MAX232 进行转换。
电路如图1所示。
图1 转换芯片电路
2 系统软件设计
软件设计分上位机软件设计和下位机软件设计。这两部分虽然在不同的机器上编写和运行,但它们要做的工作是对应的:一个发送,另一个接收。
为了保证数据通信的可靠性,要制定通信协议,然后各自根据协议分别编制程序。现约定通信协议如下: PC机和单片机都可以发送和接收。上位机和下位机均采用查询方式发送控字符和数据、中断方式接收控制字符和数据。采用RS2232串口异步通信,1位起始位, 8位数据位, 1位停止位,无奇偶校验,波特率9 600 b / s.每次PC机向单片机发送数据时,先发送握手信号"FF",下位单片机收到握手信号则发送应答信号"EE"至PC机,上位PC机收到应答信号后即发送数据。同样,当单片机要向PC机发送数据时,也先向PC机发联络信号"EB90",PC机收到联络信号后发应答信号"EBOO",单片机收到应答信号后则发送数据。
2.1 上位机通信程序设计
PC机的串口都采用的是INS8250芯片。PC机中有2个异步通信口,一个是COM1,其端口地址范围是3F8H-3 FFH,另一个是COM2,其端口地址是2F8H-2FFH.其与MODEM配合可以实现远距离通信。其波特率是标准波特率(50-9 600) b / s。
8250内部有10个寄存器端口,其中有一个除数锁存器,可以通过编程除数的大小来确定异步通信的波特率。8250使用的频率是2 MHz的基准时钟输入信号,所以必须用分频的方法产生所需要的波特率(移位脉冲) .除数锁存器的值必须在8250初始化时设置, 即把通信线路控制器的最高位(DLAB)置1,然后分两次把除数锁存器的高8位和低8位分别写入端口地址3F8H和3F9H (COM1) ,8250传送或接收串行数据时使用的时钟信号的频率是数据传输波特率的16 倍,即波特率= 16 ×除数/1 843 200.
在Windows平台上的串行通信多使用其提供的AP I函数来实现,这种方法使用起来需要许多底层设置,因而较为繁琐,并且难以理解。Microsoft推出的ActiveX技术提供了另外一种实现串行通信的方法。这种方法不仅相对较为简单,而且非常实用。
尤其是Visual C + +这种可视化面向对象的编程环境中,可以真正把串口看作一个对象,编程时只需简单的设置,理解起来也很容易。本文上位机通信程序使用VC + +提供的串行通信控件MSComm (Mi2crosoft Communication Control) ,主要步骤如下:打开VC + + 610集成开发环境,选择菜单项File /New,在出现的对话框中选中Projects标签中的MFC App2Wizard ( exe) ,生成一个基于对话框的应用程序。选择菜单项Project/Add to p roject/Components andControls?,在弹出的对话框中选择Registered Ac2tiveX Controls文件夹下的Microsoft CommunicationsControl, 选择Registered ActiveX Controls 来注册MSComm,将该控件从工具箱中拉到对话框中即可实现控件的插入。选择ClassWizard为新创建的通信控件加入一个成员变量,将其命名为m_commute.
通过该成员变量便可以对串口属性进行设置。以下是通过设置控件属性对串口进行初始化:
BOOL CMyCOMMDlg: : OnlnitDialog( )
{
CDialog: : OnlnitDialog( ) ;
/ /此处为应用框架自动生成代码
m_commute. SetCommPort(1) ; / /使用串口1
m_commute. SetSettings("9600,N, 8, 1") ; / /波特率为9600,无奇偶校验, 8位数据位, 1位停止位
m_commute. SetRThreshold (10) ; / /每接收10个字符就触发1次接收事件
m_commute. SetSThreshold (0) ; / /不触发发送事件
m_commute. SetInputLen (10) ; / /每次读操作从缓冲区中取10个字符
m_commute. SetInputMode (1) ; / /二进制数据传输形式
m_commute. SetPortOpen ( TRUE) ; / /打开串口
return TRUE; / /返回
}
事件驱动是处理串行端口交互作用的一种非常有效的方法。OnComm 事件的CommEvent属性可以捕捉并检查通信事件和错误。发生通信事件或错误时,将触发OnComm 事件, CommEvent属性的值将被改变,应用程序检查CommEvent属性值并作出相应的反应。双击对话框中CMSComm控件,添加OnComm事件的代码:
if (m_commute. GetCommEvent( ) = = 2) / /判断comEvReceive事件发生否
{
shortm_size =m_commute. GetinBufferCount( ) ;
if (m_size = = 11) / /缓冲区为11个字符为满
{
m_commute. SetInputLen (L) ; / /读取接收到的数据
VAR IANT vRep ly =m_commute. GetInput ( ) ; / /处理接收到的数据
}
}
2.2 下位机通信程序设计
在上位机与多片单片机通信中,要保证主机与从机间可靠的通信,必须保证通信接口具有识别功能。而单片机串行口控制寄存器SCON中的控制位SM2就是为了满足这一要求而设置的。且SM2控制位只在MCS51单片机的串行工作方式2与方式3才起作用。在串行口以方式2或方式3接收时,若SM2 =1,表示置多机通信功能位,这时出现两种可能情况:接收到第9位数据为1时,数据才装入SBUF,并置R I = 1向CPU发出中断请求;如果接收到第9位数据为0时,则不发生中断,信息被掉失。若SM2=0,则接收到的第9位数据无论是0还是1都产生R I =1中断标志,接收到的数据装入SBUF中。根据上述情况MCS - 51多机通信过程安排如下:
(1)开始时设所有的从机SM2位为1 ,处于只接收地址帧的状态(串行帧的第9位为1 ) ,对数据帧(串行口的第9位为0)则不做响应。
(2)当从机接收到主机发来的地址帧后,将所接收的地址与本机地址相比较,若地址与本机地址相符,便使SM2清零以接收主机随后发来的数据,对于地址不相符合的从机,仍保持SM2 = 1状态,故不能接收主机随后发来的数据信息。
(3)当主机改为与另外从机联系时,可再发出地址帧来寻找其它从机。而先前被寻址过的从机在分析出主机是对其它从机寻址时,恢复其SM2 = 1,等待主机的再一次寻址。
(4)从机要呼叫主机时,可先发送握手信号,主机检测到有从机呼叫后,发出应答信号,从机接收到主机应答后,便可发送数据给主机。主机通过该信号来判断从机所处的状态,从而作出相应的反应。
设计单片机通信程序时,必须充分发挥单片机的效率。由于单片机多应用于实时性较强的控制场合,因此,应将及时响应和控制对象的动作放在优先考虑的位置,以尽量减少通信等辅助性操作所占用的CPU时间。基于上述考虑,笔者在设计单片机通信程序时,将通信程序分为接收中断处理程序、发送中断处理程序和通信处理程序3部分,并将这3部分程序巧妙地进行组合,从而构成整个单片机的通信程序。图2给出了接收中断处理子程序,图3给出了发送中断子程序。
图2 接收中断处理程序
图3 发送中断处理程序
3 结束语
本文给出了上位PC机与下位单片机之间进行异步串行通信的解决方案,上位机通过友好的用户界面,可给下位机发送控制指令。此方案在实际运行过程中,运行稳定,效果良好,从而较好地解决了上位机与下位机之间的通信问题。
全部0条评论
快来发表一下你的评论吧 !