串口通信
大家好,小弟有个问题向大家请教。单片机与PC机进行串口通信,单片机用的是W78E58B,
PC 机向单片机发一定格式的请求命令,单片机这边用中断做接收程序!下面是我写的程
序:
#include <global.h>
uchar one_temp,net_num=0;
uchar idata comcmd1,datanum1,comlen1;//相关变量的定义
bit net_flag=0;
void serail() interrupt 4 using 1
{
EA=0;
if(RI)
{
one_temp=SBUF;
combuf[net_num]=one_temp;//接收
net_num++;
RI=0;
if(one_temp==0x1B&&net_num==1) net_flag=1;
if(one_temp==0x10&&net_num==2) net_flag=1;
if(net_num==3)
{
comcmd1=one_temp;
net_flag=1;
}
if(net_num==4)
{
datanum1=one_temp;
net_flag=1;
}
if(net_num==5)
{
comlen1=one_temp;
net_flag=1;
}
if(!net_flag)
{
sendpc(0,0,unknow_er);
net_flag=0;
net_num=0;
goto end;
}
if(net_num> =comlen1+2)
{
checkcrc=cal_crc(combuf,comlen1);
if(*(uint *)&combuf[net_num-2]!=checkcrc) //校验
{ net_num=0;
sendpc(0,0,parity_bit_er);
}
else
{
net_num=0;//清零,为下次接收做准备
work();//接收完成,转向处理程序
}
}
}
end: EA=1;
}
void hardware()
{
IE=0x90;
TMOD=0x20;
TL1=0xfa;//初始化
TH1=0xfa;
SCON=0x50;
PCON=0x00;
TR1=1;//启动定时器1
RE=1;
EN=0;
CPUCardInit();
framstop();
XBYTE[0x0000]=0xf0;
IE0=0;
gettsamstate();
gettidstate();
}
void main()
{ uchar i;
hardware();
for(i=0;i <160;i++)
{
combuf[i]=0;
}
for(;;)
{ ; }
}
先硬件初始化,然后对暂存数据的idata类型的数组清零,为接收做好准备。然后循环等
待,随时有中断,直接进入中断程序。
本程序只能成功接收一次,第二次开始就不能正常接收,请高手指点迷津!老板催的急
啊!!!快回复吧,小弟向您鞠躬了!
可以发到我的信箱:savage213@eyou.com
万分感谢!!!!!!1
发表时间:2004年4月7日15:49:26