为:(1)下位机定时向上传送记录的事件;(2)应答发送,即PC机要得到最新事件记录,而传送时间未到时,PC机发送命令,下位机接收命令后,把最新记录传给上位机;(3)上位机发送其它命令如校时、启动、停止、手/自动等。
2. 通信
程序设计
部分上位机
程序(1)发送命令字
程序,代码如下
void CCommDlg::OnSend()
{
CSerial Serial;
//构造串口类,初始化串行口
if (Serial.Open(2,9600)) //if-1
//打开串行口2,波特率为9600bps
{
static char szMessage="0";
//命令码(可定义各种命令码)
int nBytesSent;
int count=0;
resend:
nBytesSent=Serial.SendData(szMessage,strlen(szMessage));
//发送命令码
char rdMessage [20];
if (Serial.ReadDataWaiting()) //if-2
{
Serial.ReadData(rdMessage,88);
//rdMessage 定义接收字节存储区,为全局变量//
if ((rdMessage[0]!=0x7f)&&(count<3))
{
count++;
goto resend
}
if(count>=3)
MessageBox(“发送命令字失败”);
}
else //if-2
MessageBox("接收数据错误");
}
else //if-1
MessageBox("串行口打开失败");
}
下位机通信
程序:
#include<reg51.h>
#include<stdlib.h>
#include<stdio.h>
#define count 9
#define com_code 0x00
#define com_code1 0xff
unsigned char buffer[count];
int po,year,month,date,hour;
int minute,second,recordID ;
int sum;
main()
{
…
/*初始化串口和定时器*/
TMOD=0×20;
TH1=0×fd;
TR1=0×01;
ET1=0×00;
ES=1;
EA=1;
/*待发送数据送缓冲区*/
buffer[0]=0×ff; //数据特征码
buffer=count+1; //数据长度
buffer=year; //年
buffer=month; //月
buffer=date; //日
buffer=hour; //时
buffer=minute; //分
buffer=second; //秒
buffer=recordID; //事件号
for(po=0;po<count;po++)
sum+=buffer[po];
buffer=sum; //校验和
…
}
/*发送中断服务
程序*/
void send(void) interrupt 4 using 1
{
int i;
RI=0;
EA=0;
do
{
for(i=0;i<=count;i++)
{
SBUF=buffer[i]; //发送数据和校验和//
while(TI==0);
TI=0;
}
while(RI==0);
RI=0;
}while(SBUF!=0); //主机接收不正确,重新发送//
EA=1;
Return;
}
5 应用总结
根据不同需要,选择合适的方法。我们选用的用VC++类实现的上位机和下位机的串行通信方法具有使用简单、编写
程序方便的特点。经过半年多应用于EBM灭火系统的情况来看,该方法实现的系统运行稳定可靠,是一种值得推广的简单易行的通信方法。
参 考 文 献
1 Kate Gregory Visual C++6开发使用手册.北京:机械工业出版社,1999
2 何立民.单片机的C语言应用程序设计.北京:北京航空航天大学出版社,1997
3 马风格.VC控件与串行通讯.1999现代
计算机,2000(4)