微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 利用SPComm 控件实现的PC 机与单片机串口通讯

利用SPComm 控件实现的PC 机与单片机串口通讯

时间:02-03 来源:互联网 点击:

没有像单片机一样的串口工作方式,因此不能自动生成地址郑设计软件时应人工生成地址郑单片机串口工作在方式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环境下最优秀的程序设计工具之一,使用它可以方便地编写出非常优美、流畅的应用程序

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top