用VC++6.0实现PC机与单片机之间的数据交换
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)(count3))
{
count++;
goto resend
}
if(count>=3)
MessageBox(“发送命令字失败”);
}
else //if-2
MessageBox("接收数据错误");
}
else //if-1
MessageBox("串行口打开失败");
}
下位机通信程序:
#includereg51.h>
#includestdlib.h>
#includestdio.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[1] = count+1; //数据长度
buffer[2] = year; //年
buffer[3] = month; //月
buffer[4] = date; //日
buffer[5] = hour; //时
buffer[6] = minute; //分
buffer[7] = second; //秒
buffer[8] = recordID; //事件号
for(po=0;pocount;po++)
sum+=buffer[po];
buffer[9]=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灭火系统的情况来看,该方法实现的系统运行稳定可靠,是一种值得推广的简单易行的通信方法。
c语言相关文章:c语言教程
单片机相关文章:单片机教程
c++相关文章:c++教程
单片机相关文章:单片机视频教程
单片机相关文章:单片机工作原理
评论