我最近在做套用AT89S52开发的控制柜的板子, 是利用RS485的方式从上位机通过单片机控制40个接口。
协议、通信、控制功能都已经实现了,现在为了加强协议的抗干扰性,在协议里面加了一位“01”和“04”命令标识,例如我发送 68 01 01 06 01 00 00 00 8C,单片机接收到这串指令后,只是通过译码器识别40个接口的高低电平的状态,而不通过译码器发送这串指令去控制任何一个接口的高低电平,然后再给上位机发送一串指令,让上位机知道40个接口的状态;我要是发送68 01 04 06 01 00 00 00 8C,单片机接收到这串指令后,通过译码器将1号接口置为高电平,然后再给上位机发送一串指令,让上位机知道40个接口的状态;
目前程序流程就是上位机发一组指令,单片机返回一组指令,我现在在协议里加上命令标示后(“04”好说,保存原状就行)当单片机收到带“01”的指令后,怎么样不向译码器发送这串指令去控制接口,并且读一遍所有接口的状态返回给上位机?怎么样通过程序控制单片机如何处理接收到的指令?
下面是我写得这部分功能代码,那位专家帮忙指导下,如做过类此的东西,能直接附上代码让我学习下最好了!!!!谢谢void main(void)
{
unsigned char i;
UART_init(); //初始化串口
LED=0; //red lamp
RS485E=0; //green lamp
// addr_re();
(*((void (*)())(addr_re)))(); // 执行上一行代码,将rst数组当函数调用
(*((void (*)())(rq)))();
//UART_init(); //初始化串口
for(i = 0;i < 10 ;i++)
{
//首先发送一次数据作为测试用
(*((void (*)())(COM_send)))();
}
while(1)
{
WDI=0;
if(read_flag==1) //如果取数标志已置位,就将读到的数从串口发出
{
RS485E=1;
(*((void (*)())(COM_send)))();
_nop_();
read_flag=0; //取数标志清0
}
else
{
RS485E=0;
}
WDI=1;
//;_nop();
}
}
下面是协议定义部分内容,协议写在中断里面了case 2: //命令标示
if(temp==0x01)
{
cmd_order=temp;
state=3;
}
else if(temp==0x04)
{
cmd_order=temp;
state=3;
}
else
{
rc_index=0;
state=0;
MSG_LEN=0;
sum=0;
}
break;
case 3: //接收数据长度
if(temp<=7)
{
MSG_LEN=temp;
prar_len=MSG_LEN-1;
state=4;
}
else
{
rc_index=0;
state=0;
MSG_LEN=0;
sum=0;
}
break;
case 4: //获取命令参数
rbut[rc_index]=temp;
sum=sum+temp;
rc_index=rc_index+1;
if(rc_index>=prar_len) state=5;
break;
|