利用SPComm 控件实现的PC 机与单片机串口通讯
1.引言
本文引用地址:http://www.amcfsurvey.com/article/172196.htm随着计算机网络通讯与信息技术的高速发展,采用PC与多台单片机构成的分布式系统、工业控制系统、数据传输系统等越来越受到广泛应用。下位机采用运行性能较为可靠的单片机,直接对所控制对象进行实时数据的采集、计算、判断和处理;而上位机则多采用PC机(如Pentium 系列),主要负责对各单片机进行综合管理,以实现测控系统的自动检测与控制。在这类应用系统中,稳定可靠、方便快捷的数据通信是实现应用系统功能的基础和保障。因此,如何根据系统的实际工作环境条件,选择恰当的通信接口和协议,合理设计通信软件和硬件控制电路以获得高可靠性,强抗干扰和容错能力成为衡量此类系统好坏的最重要因素。
本文以某一工程项目通讯系统为例,介绍一种基于Delphi语言利用SPComm控件实现了计算机与下位AT80C51单片机之间通信的软硬件设计与实现,并给出关键环节的具体的实现方法。
2.硬件系统
该系统以PC机作为上位主机,各下位机由AT80C51单片机组成,各下位机之间无数据传输,只与主机产生数据交换。根据该工程的特点,各单片机与PC机以RS-485总线连接。
由于微机串口通常采用RS-232电平,而单片机串口是TTL电平,二者不兼容。所以,接口必须做电平转换处理。单片机串行口的TXD、RXD经MAX485电平转换为RS-485电平,在主机端经MAX485和MAX232转换为RS-232电平,再与微机的RxD、 TxD和GND相连。为了提高可靠性和抗干扰能力。在本项目工程中,可以对下位机主控板上的通信部分进行光电隔离。这样的话,使得即便是有超越 MAX485的ESD保护范围的静电或雷电感应在信号线上,也只会毁坏驱动器或光耦合,不至于破坏整个后级系统。同时,通信总线采用屏蔽线,各段线路屏蔽层相联接,集中到某一处,采用了必要的接地措施。布置总线时尽量避免了与高压电或动力电线路平行,无法避免时,尽量让两者之间距离足够大。其接口系统结构图如图所示:
3.系统软件设计
1) 通讯协议
在本系统中,PC机是主控单元,单片机是PC机信息的接受者。由于涉及到单片机多机通讯,因此串行口工作方式选为方式3,通讯格式为每11位构成一串行帧:1位起始位(0),8位数据位(最低有效位在前),1位地址帧识别位(1),1位停止位(1),无奇偶校验位(其中第9位进到单片机RB8)。该设计中,每次通讯过程总是由上位PC机首先发起,通讯时单片机先进入通讯状态,等待与计算机通讯。其过程分为以下几步:
(1)通讯前每台单片机设置一个地址。所有单片机SCON寄存器中的SM2位置1,准备接收地址帧。
(2)PC机向所有单片机发地址帧,单片机接收到地址帧后与本机地址比较,若不同则不动作,继续等待下一个地址帧;若相同,返回本机地址确认。
(3)主机接收到地址确认后,按要求向目标发送命令字。①传送数据命令:可根据要求单片机发送的数据的不同具体定义,为8位单字节数 ;②接收数据命令:EFh;
(4)目标单片机接收到命令字后:按要求动作。①接收到“请求接收命令”:发FEh(若做好接收准备),发00h(若未准备好发送)。②接收到“请求发送数据”:按指定要求发送数据。
(5)由于数据传输是在强干扰的环境中进行的,而且传输距离又较远,为了保证数据能高速、准确传输,软件编程考虑对大批量数据进行分组传送,同时对每组数据进行和校验,检查其准确性。PC机每次接收到一组数据,均要进行再次和校验,然后将PC机的校验和结果和单片机传送过来的校验和相比较,若两者不等则说明传输有错校验失败,PC机给单片机发重传命令,要求单片机重新发送该组数据。若校验正确,PC机发确认信号,并准备接收下一组采样数据。
在传输过程中上位机发送出去的数据有三类:①从机地址;②命令字;③向下位机发送的数据包;收到的数据有两类:①从下位单片机发来的确认信号;②从下位机传来的数据;下位单片机接收和发送的数据与之对应不再赘述。
2) 上位机软件设计
在Delphi 中进行串行通讯的方法可以分成以下几种:
本文采用了Spcomm 控件, 其功能强大, 使用方便, 具有丰富的与串口通讯密切相关的属性事件和方法, 提供了对串口的各种操作。其主要事件及方法如下:
主要事件:Onrececvedata: 当有数据输入缓存时, 将触发该事件。OnreceiveError: 当接收数据出现错误时, 触发该事件。
主要方法:Startcomm: 用于打开串口, 当打开失败时通常会报错。Stopcomm: 用于关闭串口, 没有返回值。Writecommdata: 用于将一个字符串发送到写进程。
利用Spcomm控件编写上位机程序,简单快捷,灵活方便,实现过程中有以下关键点需要注意:
(1) 地址帧的产生。由于PC机没有像单片机一样的串口工作方式,因此不能自动生成地址帧。设计软件时应人工生成地址帧。单片机串口工作在方式3时地址帧的格式如图2所示:
即八位数据后加一位“1”。因此可以利用Spcomm控件中的奇偶校验位来模拟,方法是:
form1.Comm1.ParityCheck:=false;
form1.Comm1.Parity:=mark;
form1.Comm1.ParityCheck:=true;
这样在发出的一个字节的数据末尾会加上一个“1”,也就形成了地址帧。当然在发送其他数据时,应该先把最后一位清零“0”:
S3C2410 ARM9开发板800
form1.Comm1.ParityCheck:=false;
form1.Comm1.Parity:=space;
form1.Comm1.ParityCheck:=true;
(2) 在PC机端的MAX485芯片的收发状态可以利用DTR(九针串口第四针)引脚来控制。对于Spcomm控件来说,属性中有DtrControl属性,利用该属性可以方便地对DTR引脚进行高低电平控制。该属性可以取三个值,分别为:DtrEnable,DtrDisable,DtrHandshake,本设计中只用到前两个值。
form1.Comm1.DtrControl:=DTREnable; //DTR引脚有效
form1.Comm1.DtrControl:=DTRDisable; //DTR引脚无效
(3) 校验和的产生。为了增强数据传输的准确性,采用校验和的检验方式。本设计里校验和的产生分两部分,一部分是发送数据之前,要对发送的数据进行累加产生校验和发送出去,这个校验和称为源校验和(sorcechksum)。另一部分是在接收数据是,要将接收到的数据累加产生一个目的校验(orgchksum)和用来与接收到的校验和相比较。
此两部分的程序实现如下:
function addchksum(sorstring:string): string;
var
i,j,chksum: integer;
begin
j:=length(sorstring);
chksum:=0;
for i:=1 to j do begin
chksum:=(chksum+ord(sorstring[i])) and $FF; //产生源校验和
result:= sorstring+inttohex(chksum,2)+chr(13); //将源校验和加在发送字符串尾
end;
end;
/*********************************************************************************/
function examchksum(var inbuf:array of char;strlen:WORD):boolean;
var i:integer;
sorchksum,orgchksum:integer;
begin
orgchksum:=0;
for i:= 0 to strlen-4 do begin
orgchksum:=(orgchksum+ord(inbuf[i]))and $FF; //产生目的校验和
end;
sorchksum:=strtoint('$'+copy(inbuf,strlen-3+1,2)); //将源校验和分离出来
if orgchksum=sorchksum then result:=true //比较目的校验和与源校验和
else result:=false;
end;
(4) 数据的接收和发送是将一组数据看成一个String类型数据来操作的,而Delphi中使用的是Pascal字符串,因此在发送之前应该用Pchar()函数对要发送的数据进行转换:
WriteCommData(Pchar(@outstr[i]),1); //参数分别为发送字符串首地址,要发送的字符串数。
Spcomm控件中的数据接收发式是事件触发方式。OnReceiveData : procedure (Sender: TObject;Buffer: Pointer;BufferLength: Word) of object
当输入缓存有数据时将触发该事件,在这里可以对从串口收到的数据进行处理。Buffer中是收到的数据,bufferlength是收到的数据长度。 因此对于PC机来说可以通过bufflength的长度来区分数据和从单片机返回的确认信号。本设计规定命确认信号为一个字节,而数据的传输由于加上校验和至少为两个字节。
(5) 为了防止实际工作中当向某台从机发送地址帧或命令字后,如果失去接收主机发出的地址数据的机会,或因某台从机不工作而使系统陷入“死循环”程序而不能正常工作。为了避免这种情况的发生,在设计时还要考虑一定的容错机制,本设计中采用的方法是在发送完地址帧和命令字后,程序开始计时。如果超过一定时间还没收到返回确认信息,就重发刚刚发送的数据如果重发3确认还没收到确认信息,即报告出错,并记录该出错单片机地址。本设计利用WindowsAPI函数编写一个延时小程序:
procedure TimeDelay(DT:DWORD); //DT为延时时间(ms)
var TT:DWORD;
begin
TT:=GetTickCount(); //调用API函数
while GetTickCount()-TTDT do
Application.ProcessMessages; //系统挂起
end;
3) 下位机软件设计
根据该工程特点,通讯只在特定时间进行,因此下位机只须采用查询方式与主控机通信:当主控机需要发送或读取下位机数据时,事先控制下位机进入通讯状态,初始化串口,等待PC机请求接收和发送数据。本设计采用C51语言进行编写,下位机主程序流图如下图所示。
4 结束语
经过试运行该系统工作稳定,收发数据可靠。Delphi是Windows环境下最优秀的程序设计工具之一,使用它可以方便地编写出非常优美、流畅的应用程序界面。利用第三方Spcomm通讯控件避免了调用API函数,需要设置繁复的参数的麻烦。本文正是应用了二者的长处,实现了微机与单片机的通信。
参考文献
[1] 范逸之,陈立元. Delphi与RS-232串行通信控制[M].北京:清华大学出版社,2002
[2] 吕伟臣. 精通Delphi7.0. 北京:科学出版社[M],2004
[3] 李朝青. PC机及单片机数据通讯技术[M]. 北京:北京航空航天大学出版社,2001
单片机相关文章:单片机教程
单片机相关文章:单片机视频教程
单片机相关文章:单片机工作原理
数字通信相关文章:数字通信原理
通信相关文章:通信原理
评论