帮我看看并行通讯程序。。。。。。
我用三根信号线Ready_U4、RD、WR作为两片单片机的联络信号(当然数据线是直接相连的),主机首先检查Ready_U4信号线是否为低(即是否申请了发送数据),如果发现Ready_U4信号线为低,则认为从机申请了发送数据,即进入接收数据状态与从机进行通讯,否则置Ready_U4为低,向从机申请发送数据。从机也是这样使用Ready_U4信号线的。
当主机接收从机的数据时,首先置RD=0,并查询WR,当从机回复WR=0时意味着从机已经将数据送到端口线上了,于是主机从端口线上读数据,并置RD=1,从机判断主机回复的RD=1时即进入下一个数据的发送。
当主机向从机发送数据时,首先置Ready_U4为低电平表明有数据要发送,然后等待从机发送回复信号WR=0,收到回复信号后,将数据写入端口,并等待从机回复WR=1取走数据,并开始下一个数据的发送。
具体程序为:
主机部分:
while(1){
Ready_U4 = 1;
if(!Ready_U4) //如果从机申请了发送数据,则接收数据
{
i=0;
do{
RD = 0; //应答从机,通知从机准备好数据
WR = 1;
while(WR){} //等待从机回复
P2 = 0xFF;
data_buf[i] = P2;//取走数据
i++;
RD = 1; //回复从机数据已经取走
WR = 1;
while(!WR){} //等待从机应答
Ready_U4 = 1;
}while(Ready_U4 == 0); //如果从机还有数据发送则继续
f_newdata = 1; //接收到新数据标志
}
else
{ //否则申请发送数据,将接收到的数据发送给仿真计算机
if(f_newdata) //将新接收到的数据发送给仿真计算机
{
f_newdata =0;
Ready_U4 = 0; //表示数据准备好,等待仿真CPU查询并向仿真CPU发送数据
for(i=0;i <22;i++){
WR = 1;
while(WR){}; //等待从机应答
P2 = data_buf[i];//发送数据
RD = 0;//通知从机数据可以取走了
WR = 1;
while(!WR){};//等待从机取走数据后的应答
RD = 1;//准备发下一数据
};
Ready_U4 = 1; //数据发完
}
}
}
从机部分:
while(1){
if(seek_header == 3) //如果串行口接收完一组串行数据
{
seek_header = 0;
frame_header = 0x00;
N_send = 0;
Ready_U4 = 1;//查询主机看看是否有发送数据请求
if(Ready_U4) //若无则请求发送数据
{
Ready_U4 = 0; //同时向主控CPU传送数据
for(i=0;i <22;i++){
RD = 1;
while(RD){};//等待主机回复
P1 = Recv_buf[i]; //发送数据
Recv_buf[i] = 0; //清空接收数组
WR = 0;
RD = 1;
while(!RD){}; //等待主机取走数据后的回复
WR = 1;//继续下一数据的发送
};
Ready_U4 = 1;//数据发完
}
}
Ready_U4 = 1;
if(!Ready_U4) //查询主控CPU是否有发送数据请求
{
i=0;//如有,则接收数据
do{
WR = 0;//回应准备好
RD = 1;
while(RD){;} //等待对方数据准备好握手信号
P1 = 0xFF;
Recv_buf[i] = P1; //接收数据
i++;
RD = 1;//回应数据已接收
WR = 1;
while(!RD){;} //等待对方应答
Ready_U4 = 1;
}while(Ready_U4 == 0);//数据传送完则退出
}
}
我现在的问题是:第一次循环时是正确的,可两个或者三个循环后就死了,程序死在从机的某一个地方(我的仿真器不支持keil C,只好写片后在系统板上运行,也不知道死在哪里了)。请高手指点迷津。这里想补充一句:从机里还运行着串行中断服务程序,谢谢!!!
发表时间:2006年3月22日21:07:35