/中断响应
void interrupt ISR(void)
{
if(RC2IF) //串口2中断处理
{
recv_buff[recv_pt++]=RCREG2; //所有数据接收下来
recv_cnt=0; //超时计数器清0
if(recv_pt>=USART_RECV_MAX)recv_pt=0; //防止溢出
}
if(TMR0IF) //定时器溢出中断
{
TMR0IF = 0; //清除T0IF
TMR0=0xF3; //20ms
asm("nop");
asm("nop");
time_us++;
}
}
void senddata1(uchar byte)
{
while(!TRMT2) //串口2的发送中断标记
continue;
TXREG2 = byte;
}
void comm_recv(uint time)
{
uint crc_num;
static uchar cnter=0;
uchar send_arr[50],i;
if(cnter!=time) //20ms
{
cnter=time;
//通过时间超时 判断串口2接收完毕
if(recv_ok==0)
{
if(recv_pt>0)
{
recv_cnt++;
if(recv_cnt>=USART_OVER_TIME) //100ms 超时 表面接收完成
{
recv_cnt=0;
recv_ok=1; //接收完成标记
}
}
}
if(OERR2==1) //溢出错误
{
CREN2=0;Delay(10);CREN2=1; //清除溢出错误
}
if(recv_ok==1)
{
crc_num=crc16(recv_buff,recv_pt-2); //计算CRC16值
if(recv_buff[0]==0xAA)//开头正确 AA
{
if(recv_buff[1]==0xBB)
{
senddata1(13);//发送温度
senddata1(13);//发送土壤湿度
if(recv_buff[2]==0xCC)
{
senddata1(real_light/256);//发送光照
senddata1(real_light%256);
}
if(recv_buff[3]==0xDD)
{
senddata1(real_CO2/256);//发送CO2浓度
senddata1(real_CO2%256);
}
if(recv_buff[4]==0XEE) //发送小时、分钟、秒
{
senddata1(13);
senddata1(nowtime.minute);
senddata1(nowtime.second);
}
}
}
recv_ok=0;
recv_pt=0;
}
}
}
这是中断接收和发送程序,上位机发送指令后,收到指令发送对应的数据,可是senddata1(13);时上位机接收到的确实0A也就十,发送其他数据都好的,就是唯独13,求解啊。。。
一周热门 更多>