本帖最后由 bihan163 于 2014-11-29 14:53 编辑
想请教各位我现在做的程序 我用STC89单片机写的程序T0作为定时器用(上电就工作,这个定时器要控制一个IO口的高低转换,时间可调)、T1作为计数器配合定时器0计算外部输入的频率(并且显示在数码管上)、定时器2作为波特率发生器(串口通讯);现在想在现有的程序上改动,模仿modbus,实现一个主机(迪文modbus屏)与多个从机(STC89)通讯,主机不断的循环读取从机的数据(时间、频率等),现在我改的程序开始的时候能通讯正常,但是过段时间或者修改单片机内部分参数单片机就不往外发送数据了!感觉是串口通讯出了问题。想问下我这个程序还怎么加接收数据超时?或者接受数据的地方该如何改呢?我的程序比较乱(程序都是从上写到下),只把一部分我觉得有问题的程序贴出来,大家帮忙给点建议。
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////向触摸屏发送数据和指令//////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
/////////////////
/////////////////
/***************************************************** /////////////////
函数功能:向上位机发送数据包(数据) /////////////////
入口参数:uint Addr(地址), uint Dat(数据) /////////////////
/////////////////
/////////////////
***************************************************/ /////////////////
void SendData_xie(uchar Comm, uint Dat)//SendData(0x04, gongzuo); /////////////////
{ /////////////////
uchar i; /////////////////
table_data[0]=(uchar)ID_cong; /////////////////
table_data[1]=(uchar)Comm; /////////////////
table_data[2]=(uchar)0x02;//读取字节数 /////////////////
table_data[3]=(uchar)(Dat>>8); /////////////////
table_data[4]=(uchar)(0x00ff&Dat);
crc = GetCRC16(table_data, 5); //计算CRC校验值
crch = crc >> 8;//CRC校验高八位
crcl = crc & 0xFF;//CRC校验低八位 /////////////////
table_data[5]=crch; /////////////////
table_data[6]=crcl;
//delayX10us(1); ///////////////// /////////////////
for (i=0;i<7;i++) /////////////////
{ /////////////////
ES=0; /////////////////
SBUF=table_data; /////////////////
while(!TI); /////////////////
TI=0; /////////////////
ES=1; /////////////////
} /////////////////
} /////////////////
void chuli_uart()//在主函数处理
{
if(RXFRMOK==1)
{
crc = GetCRC16(RXBUF, 6); //计算CRC校验值
crch = crc >> 8;//CRC校验高八位
crcl = crc & 0xFF;//CRC校验低八位
if((RXBUF[6]==crch)&(RXBUF[7]==crcl ))
{
if(RXBUF[1]==0x03)
{
if((RXBUF[3]==0x01)&(RXBUF[5]==0x01))//上位机读取工作周期
{
SendData_xie(0x03,zhouqi);
}
if((RXBUF[3]==0x02)&(RXBUF[5]==0x01))//上位机读取工作时间
{
SendData_xie(0x03,gongzuo);
}
if((RXBUF[3]==0x03)&(RXBUF[5]==0x01))//上位机读取停止时间
{
SendData_xie(0x03,tingzhi);
}
if((RXBUF[3]==0x04)&(RXBUF[5]==0x01))//上位机读取工作频率
{
SendData_xie(0x03,plv);
}
if((RXBUF[3]==0x05)&(RXBUF[5]==0x01))//上位机读取功率
{
SendData_xie(0x03,glv);
}
}
if(RXBUF[1]==0x06)
{
if((RXBUF[2]==0x00)&(RXBUF[3]==0x01))//上位机写工作周期
{
zhouqi=RXBUF[4]*256+RXBUF[5];
t5=zhouqi;
savezhouqi_stc();
SendData_du(0x01,zhouqi);
}
if((RXBUF[2]==0x00)&(RXBUF[3]==0x02))//上位机写工作时间
{
gongzuo=RXBUF[4]*256+RXBUF[5];
t2=gongzuo;
readgongzuo_stc();
SendData_du(0x02,gongzuo);
}
if((RXBUF[2]==0x00)&(RXBUF[3]==0x03))//上位机写停止时间
{
tingzhi=RXBUF[4]*256+RXBUF[5];
t3=tingzhi;
savetingzhi_stc();
SendData_du(0x03,tingzhi);
}
if((RXBUF[2]==0x00)&(RXBUF[3]==0x04))//上位机写工作频率
{
if(RXBUF[5]==0x01)//01为加频率
{
h++;
if(h==201)
{
h=200;
}
savepinlv_stc();
DA_PL(h*4);
SendData_du(0x04,0x0001);
}
if(RXBUF[5]==0x02)//02为减频率
{
h--;
if(h==0)
{
h=1;
}
savepinlv_stc();
DA_PL(h*4);
SendData_du(0x04,0x0002);
}
}
if((RXBUF[2]==0x00)&(RXBUF[3]==0x05)&(RXBUF[5]==0x00))//上位机写功率
{
i++;
if(i==9)
{
i=8;
}
SendData_du(0x05,0x0000);
gonglv();
write_add(3,i);
DA_GL(675+40*i);
}
if((RXBUF[2]==0x00)&(RXBUF[3]==0x06)&(RXBUF[5]==0x00))//02为减功率
{
i--;
if(i==0)
{
i=1;
}
SendData_du(0x06,0x0000);
gonglv();
write_add(3,i);
DA_GL(675+40*i);
}
}
}
for (i=0;i<8;i++) /////////////////
{ ///////////////// /////////////////
RXBUF=0; ///////////////// /////////////////
}
}
Rx_P=0;
RXFRMOK=0;
}
void UART1_ISR() interrupt 4//串口通讯 ////////
{ ////////
unsigned char i; ////////
if(RI) //串口接收中断 ////////
{ ////////
i=SBUF; ////////
RI=0; ////////
if(RXFRMOK==0) //如果 RXFRMOK=1 表示前台程序未处理完当前数据,丢弃 ////////
{ ////////
if(RXIDOK) //接收到 0x5A ////////
{ ////////
RXBUF[Rx_P]=i;
Rx_P++;
if((RXBUF[1]==0x03)|(RXBUF[1]==0x06))
{
if((RXBUF[2]==0x00)&(RXBUF[4]==0x00))
{
if(Rx_P>=8)
{
RXFRMOK=1; ////////
RXIDOK=0;
Rx_P=0;
}
}
else if((RXBUF[2]!=0x00)|(RXBUF[4]!=0x00))
{
Rx_P=0;
RXIDOK=0;
}
}
else if((RXBUF[1]!=0x03)&(RXBUF[1]!=0x06))
{
Rx_P=0;
RXIDOK=0;
} ////////
} ////////
if(!RXIDOK&&(i==ID_cong)) ////////
{ ////////
RXBUF[0]=i;
RXIDOK=1; ////////
Rx_P=1;
////////
} ////////
} ////////
} ////////
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>